进程管理
进程调度
抢占
脱离原本的轨道,重新调度
用户抢占
内核抢占
《linux内核设计与实现》4.6.2
进程创建
找到进程空位,存放要创建的进程:find_empty_process()
复制0号或者当前进程的结构体tast_struct , 并初始化子进程结构体。copy_process()
拷贝老进程的代码段和数据段到新进程。copy_mem()
如果父进程打开了某些文件,那么子进程同样也打开。(子进程会继承父进程的许多属性)
设置新进程的tss(进程的状态描述符, 进程运行过程中CPU需要知道的进程状态标志(段属性、位属性等))和ldt(局部描述符,包括两个东西,一个是数据段(全局变量静态变量等),另一个是代码段,不过这里面存的都是指针)
新进程设为运行状态,返回新进程的PID
进程切换
进程创建后,如何进一步调度
void schedule(void)进程调度函数
将进程设为running模式,
循环task列表 找出最大的counter时间片,如果找到不为0,说明当前进程链表中,还有一些进程的时间片没用完。直接切换进程
如果为0,说明时间片已用完。进行时间片的重分配,counter = counter/2 + priority
切换进程
切换进程switch to
将TSS寄存器中的地址换为新进程的TSS描述符,将CPU中保存的TSS段存到原TSS中,将新TSS存到CPU中。
sleep on()当某个进程想访问CPU资源,但是CPU资源被占用访问不到,就会休眠