1.进程调度算法

常见的操作系统进程调度策略有哪些?

1、 先来先服务 first-come first-serverd(FCFS)

  • 非抢占式的调度算法,按照请求的顺序进行调度。
  • 有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。
  • 不会导致饥饿

2、 短作业优先 shortest job first(SJF)

  • 非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
  • 有利于短作业,但不利于长作业
  • 会饥饿。长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

3、最短剩余时间优先 shortest remaining time next(SRTN)

短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。

如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

4、时间片轮转(RR Round-Robin)

按照各进程到达就绪队列的顺序(FCFS 的原则),轮流让各个进程执行一个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

  • 抢占式算法,发出时钟中断告知时间片已到。
  • 优点:公平;响应快,适用于分时操作系统。 缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度。
  • 不会饥饿
2.进程和线程有什么区别?
  1. 进程是资源分配的最小单位。 线程是程序执行的最小单位,处理器调度的基本单位,两者均可并发执行。
  2. 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据,使用相同的地址空间, 因此,CPU切换一个线程的花费远比进程小很多,同时创建一个线程的开销也比进程小很多。
  3. 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行
  4. 进程切换时,消耗的资源大,效率低。所以涉及到频繁的切换时,使用线程要好于进程。同样如果 要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
  5. 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  6. 线程执行开销小,但是不利于资源的管理和保护。进程执行开销大,但是能够很好的进行资源管理和保护。如何处理好同步与互斥是编写多线程程序的难点。但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也跟着死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。