date | comments | categories | tags | permalink | title | |||
---|---|---|---|---|---|---|---|---|
2020/2/26
|
true
|
|
|
3.14
|
CPU调度策略
|
进程就是正在内存中运行的程序。进程在执行是时会改变状态,进程状态在某种程度上是由当前活动所定义的,进程可能处于的状态有: 新的、运行、等待、就绪、终止。
进程通常还包括进程堆栈段(包括临时数据,如函数参数,返回地址和局部变量),和数据段(包括全局变量),还有可能包括堆,是在进程运行期间动态分配的内存。
每个进程在操作系统内用进程控制块(process control block,PCB来表示,也称为任务控制块)来表示。下图给出一个PCB的例子,它包含许多与一个特定进程相关的信息。
进程状态:就是前面说的 新的、运行、等待、就绪、终止。
程序计数器:计数器表示进程要执行的下个指令的地址。
CPU寄存器:根据计算机体系的不同,寄存器的数量和类型也不同。他们包括累加器、索引寄存器、堆栈指针、通用寄存器和其他条件码信息寄存器。与程序计数器一起,这些状态信息在出现中断时也需要保存,以便进程以后能正确地继续执行。
CPU调度信息:这类信息包括进程优先级,调度队列的指针和其他调度参数。 内存管理信息
内存管理信息:根据操作系统使用的内存系统,这类信息包括段基址和接线寄存器,页表或段表。
记账信息:这类信息包括CPU时间,实际使用时间,时间界限,记账数据,作业或进程数量等。
I/O状态信息:这类信息包括分分配给进程的I/O设备列表,打开的文件列表等。
简而言之,PCB简单地作为这些信息的仓库,这些信息在进程和进程之间是不同的。
将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换。当发生上下文切换时,内核会将旧进程的状态保存在其PCB中。然后装入经调度要执行的进程的上下文。切换上下文是系统额外的开销。
linux中的进程表示如下:
struct task_struct{
pid_t pid;//进程id
long state;//进程状态
unsigned int time_slice;//调度信息
strct files_struct *files;//打开的文件列表
strct mm_struct *mm;//进程空间地址
....
}
进程进入系统时候,会被加到作业队列中,该队列包括所有的进程。驻留在内存中就绪的等待运行的进程保存在就绪队列中。改队列用通常是一个链表,其头结点内有两个指针,分别指向链表的第一和最后一个PCB块的首地址。
调度程序会拍横各种条件,折中的用尽量兼顾所有进程的方式进行调度。