操作系统03——进程和线程3

83 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

进程调度策略有哪些?

批处理系统

先来先服务 (FCFS):按照请求的顺序进行调度。

特点:非抢占式,开销小,无饥饿问题;

缺点:响应时间不确定(可能很慢),对短进程不利,对IO密集型进程不利。

短进程优先 (SJF):按估计运行时间最短的顺序进行调度。

特点:非抢占式,吞吐量高,对短进程友好;

缺点:开销可能较大,可能导致饥饿问题对长进程不利

最短剩余时间优先 (SRTN)按剩余运行时间的顺序进行调度。

特点:短进程优先的抢占式版本,吞吐量高,提供好的响应时间;

缺点:开销可能较大,可能导致饥饿问题,对长进程不利。

最高响应比优先 (HRRN):响应比 = 等待时间/处理时间+1。同时考虑了等待时间的长短和估计需要的执行时间长短,很好的平衡了长短进程

特点:非抢占,吞吐量高,提供好的响应时间,无饥饿问题。

缺点:开销可能较大

交互式系统

交互式系统有大量的用户交互操作,调度算法的目标是快速地进行响应。

时间片轮转算法:将就绪进程按FCFS的原则排成一个队列,用完时间片的进程排到队列最后。

特点:抢占式(时间片用完时),开销小,无饥饿问题,对短进程友好;

缺点:若时间片小,进程切换频繁,吞吐量低;若时间片太长,实时性得不到保证。

优先级调度算法:为每个进程分配一个优先级,按优先级进行调度。为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

多级反馈队列调度算法 :设置多个就绪队列1、2、3...,优先级递减,时间片递增。只有等到优先级更高的队列为空时才会调度当前队列中的进程。如果进程用完了当前队列的时间片还未执行完,则会被移到下一队列。

特点:对IO型进程有利

缺点:抢占式(时间片用完时),开销可能较大,可能会出现饥饿问题。

优先级反转

什么叫优先级反转?如何解决?

优先级反转:优先级较低的进程比优先级较高的进程先执行,当高优先级进程等待低优先级进程占用的资源时会出现。

解决方法

(1)优先级天花板(priority ceiling):申请一个资源时,把该进程的优先级提升到可访问这个资源的所有进程中的最高优先级,这个优先级称为该资源的优先级天花板

(2)优先级继承(priority inheritance):当进程A申请共享资源S时,如果S正在被进程C使用,若进程C的优先级小于A的优先级,则将进程C的优先级提升到A的优先级,意图加快进程C的执行,进程C释放资源S后,再恢复进程C的原优先级。

什么是僵尸进程?

若子进程结束后,父进程并没有调用wait或者waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。僵尸进程几乎没有内存空间也不能被调度仅在进程表中保留一个位置,记载该进程的进程ID终止状态以及资源利用信息供父进程收集。

危害:占用进程号、内存、进程表的位置。

以下情况不会产生僵尸进程

  • 该进程的父进程先结束了。若父进程比子进程先结束,则用Init进程(1号进程)接管未结束的子进程,成为该进程的父进程,并且会调用wait等待其结束
  • 父进程调用wait或者waitpid等待子进程结束wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。waitpid则可以加入WNOHANG(wait-no-hang)选项,如果没有发现已经结束的子进程,就会立即返回,不会调用waitpid进程阻塞。同时,waitpid还可以选择等待任一子进程,还是等待指定pid的子进程,还是等待同一进程组下的任一子进程;
  • 子进程结束时,系统会产生SIGCHLD(signal-child)信号,可以在信号处理函数中调用waitpid,等待所有结束的子进程(注意:一般都需要循环调用waitpid,因为在信号处理函数开始执行之前,可能已经有多个子进程结束了,而信号处理函数只执行一次,所以要循环调用将所有结束的子进程回收);
  • 也可以用signal(SIGCLD, SIG_IGN)(signal-ignore)通知内核,表示忽略SIGCHLD信号,那么子进程结束后,内核会进行回收

什么是孤儿进程?

父进程退出子进程还在运行的进程是孤儿进程,孤儿进程将被init进程(1号进程)领养,并由init进程对它完成状态收集工作