任务调度
何时需要调度执行一个任务?
-
第一:当任务创建的时候,需要决定是继续执行父进程,还是调度执行子进程
-
第二:在一个任务退出时,需要做出调度决策,需要从
TASK_RUNNING
状态的所有任务中选择一个任务来执行 -
第三:当一个任务阻塞在 I/O 上,或者因为其他原因阻塞,必须调度另一个任务执行
-
第四:在一个 I/O 中断发生时,必须做出调度决策。
I/O 中断来源于 I/O 设备,说明 I/O 的工作结束了,需要唤醒正在阻塞在这个 I/O 上的进程,这个时候,调度程序要决定是否调度这个被唤醒的任务。
-
第五:时钟中断发生的时候
问题:如何实现对响应时间敏感的调度程序?
-
轮转调度(Round-Robin, RR)
-
基本思想:在一个时间片内运行一个任务,时间片结束,然后切换到下一个任务,而不是运行一个任务直到结束。这样反复执行,直到所有任务完成。
-
RR 有时被称为时间切片,时间片长度必须是时钟中断周期的倍数。如果时钟中断是每
10ms
中断一次,则时间片可以是10ms
、20ms
或10ms
的任何倍数。
信号处理
什么是信号?
例如 kill -9 2334
,内核先找到pid = 2334
的进程,并杀掉这个进程以及 tgid = 2334
的线程。
-
给进程
2334
发送9
号信号:SIGKILL
-
一共有
64
个信号:kill -l
-
信号是很短的消息,可以被发送到一个进程或一组进程
-
每个信号,本质上就是一个数字而已
信号处理大体流程:
信号发送:
-
kill(pid, sig)
:向pid
所在的线程组发送一个sig
号信号 -
tkill(pid, sig)
:向pid
进程(或线程)发送一个sig
号信号 -
tgkill(pid, sig, tgid)
:向pid
进程(或线程)发送一个sig
号信号(检查下这个进程的tgid
是否等于参数中的tgid