进程是如何调度的
- 首先保存进程的进程控制块,例如进程的状态,程序计数器,寄存器的值
- 按照某种算法选取进程,将该进程的状态改为运行状态
- 将CPU的执行权让给该进程,再将该进程的进程控制块中的信息以及寄存器的值恢复到对应的寄存器中,让进程从上次切换的点继续运行
进程调度算法
- 先到先服务调度算法:根据就绪队列的到达时间来服务,先到先服务,后面的进程不能抢占正在服务的进程。优点:公平公正,实现简单。缺点:平均等待时间变化很大,效率低
- 最短作业优先调度算法:先执行进程执行时间短的进程,如果执行时间一样,再根据先到先服务调度算法来调度。优点:相对先到先服务调度算法性能有所提高,用户体验有所上升根。缺点:无法准确知道限一个CPU执行期。
- 时间片轮转调度算法:每一个进程都会分配一个时间片,在这个时间片段内,允许进程运行,如果时间片结束给进程还在运行,就会剥夺该进程的CPU执行权分配给下一个进程。优点:有利于交互式计算,响应的速度快。缺点:频繁的进程切换会导致频繁的上下文切换的开销。
- 优先级调度算法:优先级越高的进程应该先执行,系统>用户,前台>后台。优点:实现简单。缺点:缺乏公平性,可能导致优先级低的进程饿死。解决办法:如果进程占用CPU过多的时间,可以将它的优先级调低,并切换下一个进程。
僵尸进程和孤儿进程和守护进程
僵尸进程:子进程先于父进程退出,但是父进程没有进行进程等待,导致无法获取子进程的退出状态信息,使操作系统无法释放子进程资源,这时候子进程就是僵尸进程。
孤儿进程:孤儿进程是指其父进程执行完或者被终止后仍然继续运行的进程。特征是:运行在后台,不占据前台终端,父进程变为1号进程。
守护进程:守护进程是特殊的孤儿进程,它脱离了与终端和登录会话的关系,不受外界影响并运行在后台
守护进程和孤儿进程的区别
守护进程是特殊的孤儿进程,从操作系统来讲,这两者之间没有什么区别,但是从人的角度来说,孤儿进程是意外产生的,守护进程是特意产生的。孤儿进程是资源泄漏也是一种危害,而守护进程运行在后台,周期性得完成某些任务。
fork和vfork的区别
- fork创建出来的子进程拷贝父进程的大量资源,也有自己的虚拟地址空间;vfork创建出来的子进程与父进程共享数据段
- fork的父子进程的执行顺序是不确定的,而vfork保证子进程先运行,只有子进程退出后父进程菜会运行。
fork创建出来的子进程拷贝了父进程的哪些资源和共享哪些资源
拷贝:栈,堆,数据段,页表,虚拟地址空间
共享:文件描述符页表,进程组ID,信号屏蔽字
fork创建子进程的流程
首先会在物理内存创建一个task_struct结构体,将父进程的 task_struct结构体的内容复制到新创建的结构体中,然后为这个新的进程分配新的堆栈,分配新的进程标识符,然后将这个新的task_struct结构体的地址填到task数组中,然后去运行,子进程返回时会返回0,而父进程返回子进程的pid。