Linux进程调度内核 API¶
__wake_up¶
头文件¶
#include <linux/wait.h>
功能¶
此函数用于唤醒等待队列中处于特定状态的进程,此特定状态由函数的第二个参数 mode 定义的。当进程的状态满足此特定状态时候就可能被唤醒,获得 CPU 资源,从而被调度执行。
__wake_up_sync¶
头文件¶
#include <linux/wait.h>
功能¶
此函数用于唤醒等待队列中处于特定状态的进程,此特定状态由函数的第二个参数 mode 定义。当进程的状态满足此特定状态的时候就可能被唤醒,获得CPU 资源,从而被调度执行。此函数唤醒进程不会改变进程之前所在的CPU,不会引起额外的CPU抢占,并前可以同步唤醒进程。
__wake_up_sync_key¶
头文件¶
#include <linux/wait.h>
功能¶
此函数用于唤醒等待队列中处于特定状态的进程,此特定状态由函数的第二个参数 mode 定义。
当进程的状态满足此特定状态时候就有可能被唤醒,获得CPU资源,从而被调用执行。此函数唤醒的进程不会改变进程之前所在的CPU,不会引起额外的CPU抢占,同时可以同步唤醒进程。
abort_exclusive_wait¶
头文件¶
#include <linux/wait.h>
功能¶
此函数的作用如下:
更改当前进程的状态,将当前进程置于 TASK_RUNNING 状态
如果第二个参数所代表的等待队列元素在以第一个参数为头指针的等待队列中,则将其从此等待队列中删除。
如果第二个参数所代表的元素不再以第一个参数为头指针的等待队列中,并且此等待队列不为空,则此函数调用函数 __wake_up_common 唤醒等待队列中的进程。此时唤醒的进程的状态属于此函数的第三个参数 mode 所定义的范围,并且唤醒进程不是同步的。如果第一个唤醒的进程所在的等待队列中的元素falsg字段的值等于 WQ_FLAG_EXCLUSIVE,则停止唤醒其它进程,否则循环唤醒等待队列中其它的进程
add_preempt_count¶
头文件¶
#include <linux/preempt.h>
功能¶
此函数用于增加进程抢占计数器的值,将进程的当前抢占计数器的值与参数val相加,达到更改抢占计数值的作用。对已某系额进程,如果抢占计数器的值等于0,此进程允许被抢占,如果其抢占计数器的值大于0,则此进程不允许被抢占。
add_wait_queue¶
头文件¶
#include <linux/wait.h>
功能¶
函数 add_wait_queue 实现将等待队列元素插入到等待队列第一个元素的位置,并设置等待队列元素的flags 值为非 WQ_FLAG_EXCLUSIVE,即为0,表示此进程不是高优先级进程。
add_wait_queue_exclusive¶
头文件¶
#include <linux/wait.h>
功能¶
函数 add_wait_queue_exclusive 实现将等待队列元素加入到等待队列尾部,并设置等待队列元素的flags值为 WQ_FLAG_EXCLUSIVE,即为 1,表示此进程是高优先级进程。
autoremove_wake_function¶
头文件¶
#include <linux/wait.h>
功能¶
函数在实现过程中,调用了函数 default_wake_function,完成唤醒此等待队列中的某一进程;如果唤醒进程成功,则调用函数 list_del_init,并将此进程从等待队列中删除。否则不进行其它操作,函数执行结束,返回结果。
complete¶
头文件¶
#include <linux/completion.h>
功能¶
此函数主要用于唤醒等待队列中的睡眠进程,并记录等待队列被唤醒的次数,同时ijiang唤醒次数保存在参数 done 字段中。此函数通过调用函数 __wake_up_common 实现唤醒等待队列中的进程,传递的参数确定唤醒的进程的状态只能是 TASK_INTERRUPTIBLE 状态或 TASK_UNINTERRUPTIBLE状态,并且唤醒进程不是同步,即只能按等待队列中进程的顺序一个一个唤醒。如果第一个被唤醒等待队列中的等待队列元素的flags字段的值是 WQ_FLAG_EXCLUSIVE,则唤醒停止,否则将继续唤醒等待队列中的其它进程。
complete_all¶
头文件¶
#include <linux/completion.h>
功能¶
此函数用于唤醒等待队列中所有的睡眠进程,并能更改等待队列被唤醒的次数,同时将唤醒次数保存在参数的done 字段中。函数设置字段 done 的值为在 done 原值的基础上加上 UINT_MAX 的二分之一,其中 UINT_MAX 内核的定义值为 4294967295。此函数通过调用函数 __wake_up_common 实现唤醒等待队列中的进程,传递的参数确定唤醒的进程状态只能是 TASK_INTERRUPTIBLE 状态或者 TASK_UNINTERRUPTIBLE 状态,并且唤醒简称不是同步的,也就是说只能按等待队列中进程的顺序一个一个唤醒,但能够唤醒等待队列中所有睡眠状态的进程。
complete_done¶
头文件¶
#include <linux/completion.h>
功能¶
此函数用于判断参数 completion 变量中的等待队列是否有等待着,即是否有进程处于阻塞状态,等待此等待队列中的进程执行完毕。函数通过返回 bool 类型的变量来通知调用者。
current_thread_info¶
头文件¶
#include <asm/thread_info.h>
功能¶
获取当前进程的基本信息,此信息保存在内核堆栈中,通过计算内核堆栈地址的偏移量,获取进程基本信息的地址,并将地址返回给 struct thread_info 结构体类型的变量,完成将信息保存在结构体变量中。
default_wake_function¶
头文件¶
#include <linux/wait.h>
功能¶
此函数是内核定义的默认进程唤醒函数,用于唤醒处于等待队列中的进程,使进程由非 TASK_RUNNING 状态改为 TASK_RUNNING 状态,并获得 CPU 资源,被调用执行。而对于唤醒的进程状态有一定要求,即只有进程的状态属于此函数的第二个参数所定义的状态时候进程才能被唤醒。
do_exit¶
头文件¶
#include <linux/kernel.h>
功能¶
此函数用于结束当前正在执行的线程,释放占用的 CPU 资源。
finish_wait¶
头文件¶
#include <linux/wait.h>
功能¶
此函数具有如下功能:
更改当前进程的状态,将当前进程置于 TASK_RUNNING 状态
如果此函数的第二个参数在此函数的第一个参数所代表的等待队列中,则将其从此等待队列中删除,否则不进行删除操作,函数返回。
init_waitqueue_entry¶
头文件¶
#include <linux/wait.h>
功能¶
函数 init_waitqueue_entry() 用于实现初始化特定的等待队列元素,将等待队列元素的flags字段置为0,private字段设置为此函数的第二个参数——进程描述符,并设置字段func的值为 default_wake_function,它是一个函数指针,代表唤醒进程时候调用的函数。
init_waitequeue_head¶
头文件¶
#include <linux/wait.h>
功能¶
函数 init_waitqueue_head 用于实现初始化等待队列头指针,使阐述q的task_list字段的next与prev都指向头指针自身。
interruptible_sleep_on¶
头文件¶
#include <linux/wait.h>
功能¶
此函数用于将某一等待队列置于睡眠状态,并且睡眠的时间为 LONG_MAX 个系统时钟节拍,这个时间是很长的,而进入睡眠状态的进程是能够被中断的,即进程处于 TASK_INTERRUPTIBLE状态,通过 CTRL+C 键能够被终止程序的执行。
interruptible_sleep_on_timeout¶
头文件¶
#include <linux/wait.h>
功能¶
此函数用于将等待队列中的进程置于睡眠状态,并且睡眠的时间为参数timeout 个系统时钟节拍。进入睡眠后是可终止的,按下 CTRL+C即可终止程序的执行。
preempt_notifier_register¶
头文件¶
#include <linux/preempt.h>
功能¶
此函数用于完成当前进程抢占通知器的注册,当通知器注册成功后,一旦此进程被抢占或重新获得CPU执行时候,通知器中注册的处理函数将会被调用。在此通知器处理函数是笔者自己定义的,其作用只是显示信息,保存在通知器的字段 ops 中。
preempt_notifier_unregister¶
头文件¶
#include <linux/preempt.h>
功能¶
此函数用于完成通过函数 preempt_notifier_register 注册的进程抢占通知器的注销,当调用此函数之后,进程的抢占以及重调度都不会再输出抢占通知器操作函数的提醒信息。对于进程抢占通知器的注册请参考 preempt_notifier_register 的说明文档。
prepare_to_wait¶
头文件¶
#include <linux/wait.h>
功能¶
函数 prepare_to_wait 能够将第二个参数所代表的等待队列元素加入到第一个参数所代表的等待队列的头部,但此等待队列元素需要满足条件:wait->task_list.next = wait->task_list,即等待队列元素是一个单独的节点,并且 task_list 字段的next值指向其自身;函数能够更改当前进程的状态,将当前进程置于函数的第三个参数 state 所代表的状态;通过函数 prepare_to_wait 插入到等待队列中的等待队列元素的flags字段的值一般为0,即对应的进程不是高优先级进程。
prepare_to_wait_exclusive¶
头文件¶
#include <linux/wait.h>
功能¶
函数 prepare_to_wait_exclusive 能够将第二个参数所代表的等待队列元素加入到第一个参数所代表的等待队列的尾部,但此等待队列元素需要满足条件: wait->task_list.next = wait->task_list。即等待队列元素是一个单独的节点,并且 task_list 字段的next值指向自身,函数能够更改当前进程的状态,将当前进程置于函数的第三个参数state所代表的状态;通过函数 prepare_to_wait_exclusive 插入到等待队列中的等待队列元素的flags字段的值一般为1,即设置为 WQ_FLAG_EXCLUSIVE,对应的进程是高优先级进程。
remove_wait_queue¶
头文件¶
#include <linux/wait.h>
功能¶
函数 remove_wait_queue 实现将等待队列元素从等待队列中删除。
sched_setscheduler¶
头文件¶
#include <linux/sched.h>
功能¶
此函数用于改变进程的调度策略及进程的实时优先级
ste_cpus_allowed_ptr¶
头文件¶
#include <linux/sched.h>
功能¶
此函数用于改变进程的执行CPU,即改变进程执行时候所占用的CPU 资源。
set_user_nice¶
头文件¶
#include <linux/sched.h>
功能¶
此函数用于设置进程的nice值,其实 nice 值的计算是根据进程的静态优先级,所以此函数用于更改进程的静态优先级。在更改进程的静态优先级的同时,会检查此进程是否可以被调度,当条件满足时候,将调度该进程,当进程被调度后将恢复系统默认的普通进程的静态优先级及 nice 值。
sleep_on¶
头文件¶
#include <linux/wait.h>
功能¶
此函数用于将等待队列中的进程置于睡眠状态,并且睡眠的时间为 LONG_MAX 个系统时钟节拍,这个时间是很长的,而进入睡眠状态的进程是不能被中断的,即进程处于 TASK_UNINTERRUPTIBLE 状态,即通过 CTRL+C按键也不能终止程序的执行。
此函数与函数 interruptible_sleep_on 的不同之初在于此函数使进程处于 TASK_UNINTERRUPTIBLE 状态,而函数 interruptible_sleep_on 使进程处于 TASK_INTERRUPTIBLE 状态。
sleep_on_timeout¶
头文件¶
#include <linux/wait.h>
功能¶
此函数用于将等待队列中的进程置于睡眠状态 …
进程处于 TASK_UNINTERRUPTIBLE状态
sub_preempt_count¶
头文件¶
#include <linux/preempt.h>
功能¶
此函数用于减少进程的抢占计数器的值。
对于某进程如果抢占计数器的值等于0,则此进程允许被抢占,否则不允许被抢占。
task_nice¶
头文件¶
#include <linux/shced.h>
功能¶
此函数用于获取进程的nice值
try_wait_for_completion¶
头文件¶
#include <linux/completion.h>
功能¶
此函数用于尝试无阻塞的消耗一个 completion
wait_for_completion¶
头文件¶
#include <linux/completion.h>
功能¶
此函数用于阻塞当前进程,等待其它进程的执行结束,被等待进程保存在输入参数的 wait 字段所代表的等待队列中,只有当等待队列中的进程被函数 complete() 或 complete_all() 唤醒之后,等待才有可能结束,当前的进程才能继续执行,否则会一直等待。
wait_for_complete_interruptible¶
头文件¶
#include <linux/completion.h>
功能¶
同上,但是当前进程设置为可中断等待状态,所以通过 Ctrl+C 键可以强制进程结束。
wait_for_completion_interruptible_timeout¶
头文件¶
#include <linux/completion.h>
功能¶
此函数用于阻塞当前进程,等待其它进程的执行结束,被等待进程保存在输入参数的wait字段所代表的等待队列中。有三种情况可以结束此种等待:
当等待队列中的进程被函数
complete()或complete_all()唤醒,结束等待等待超时,当前等待的时钟节拍超时时候,被阻塞的进程会继续执行
强制结束等待,可通过 Ctrl + C 按键强制结束这个等待。
wait_for_completion_killable¶
头文件¶
#include <linux/completion.h>
功能¶
此函数用于阻塞当前进程,等待其它进程的执行结束,被等待进程保存在输入参数的wait字段所代表的等待队列中。有两种情况可以结束此种等待:
当等待队列中的进程被函数
complete()或函数complete_all()唤醒,结束等待强制结束等待,通过 Ctrl+C 强制结束这个等待。
wait_for_completion_timeout¶
头文件¶
#include <linux/completion.h>
功能¶
此函数用于阻塞当前进程,等待其它进程的执行结束,被等待进程保存在输入参数的wait字段所代表的等待队列中。
wake_up_process¶
头文件¶
#include <linux/sched.h>
功能¶
此函数用于唤醒处于睡眠状态的进程,使进程由睡眠状态变为 RUNNING 状态,从而被 CPU 重新调度执行。
yield¶
头文件¶
#include <linux/sched.h>
功能¶
该函数用于实现当前进程所占用内核空间的短暂的让步,即令当前进程短暂释放其占用的CPU资源,以给其它进程执行提供机会,短暂的让步之后,当前进程会继续执行。函数 yield 在执行时候不会改变当前进程的状态,并调用函数 set_current_state() 设置当前进程为 TASK_RUNNING 状态