0%

线程与进程的区别

线程与进程的区别

  • 进程是系统进行资源分配和调度的基本单位

  • 线程是CPU调度和分派的基本单位

  • 线程依赖于进程而存在,一个进程至少有一个线程

  • 进程有自己的独立地址空间,线程共享所属进程的地址空间。

  • 进程是拥有系统资源的一个独立单位,而线程自己基本上 不拥有系统资源。只拥有一点在运行中必不可少的资源(资源计数器,一组寄存器和栈。)和其他线程共享本线程的相关资源,如内存,I/O,cpu等。

  • 线程之间的通信更方便,同一进程下的线程共享全局变量等数据,而进程之间的通信需要以进程间通信(IPC)的方式进行;

  • 多线程程序只要有一个线程崩溃,整个程序就崩溃了,但多进程程序中一个进程崩溃并不会对其它进程造成影响,因为进程有自己的独立地址空间,因此多进程更加健壮

同一进程中的线程可以共享哪些数据?

  • 进程代码段
  • 进程的公有数据
  • 进程打开的文件描述符
  • 进程的当前目录
  • 信号处理器/信号处理函数:对收到的信号的处理方式
  • 进程ID和进程组ID

进程独占哪些资源

  • 线程ID
  • 一组寄存器的值和
  • 线程自身的栈(堆是共享的)
  • 错误返回码:线程可能会产生不同的错误返回码,一个线程的错误返回码不应该被其它线程修改;
  • 信号掩码/信号屏蔽字(Signal mask):表示是否屏蔽/阻塞相应的信号(SIGKILL,SIGSTOP除外)

管程

管程将共享变量以及对这些共享变量的操作封装起来,形成一个具有一定接口的功能模块,这样只能通过管程提供的某个过程才能访问管程中的资源。进程只能互斥的使用管程,使用完之后必须释放管程并唤醒入口等待队列中的进程。

当一个进程试图进入 管程时,在入口等待队列等待。若P进程唤醒了Q进程,则Q进程先执行,P在紧急等待队列中等待。(HOARE管程

wait操作:执行wait操作的进程进入条件变量链末尾,唤醒紧急等待队列以及入口队列中的进程,signal操作:唤醒条件变量链中的进程,自己进入紧急等待队列,若条件变量链为空,则继续执行。

MESA管程:将HOARE中的signal换成了notify(或者broadcast通知所有满足条件的),进行通知而不是立马交换管程的使用权,在合适的时候,条件队列首位可以进入,进入之前必须用while检查条件是否合适,优点:没用额外的进程切换。

临界区的概念

各个进程中对临界资源(互斥资源/共享变量,一次只能给一个进程使用)进行操作的程序片段。

同步与互斥的概念

  • 同步 : 多个进程因为合作的原因使得进程的执行有先后顺序,比如某个进程需要另外一个进程提供的消息。获取消息之前进入阻塞态
  • 互斥 : 多个进程在同一时刻只有一个进程能够进入临界区。

并发,并行,异步

  • 并发 :在一段时间同时有多个程序运行,但其实在任一时刻,只有一个程序在CPU上运行,宏观的并发是通过不断切换实现的

    好比于一个人在一段时间里面打完电话之后去做饭

  • 并行 : 在CPU里面,多个程序不论是宏观还是微观上都是同时执行的。

  • 多线程: 并发允许的一段代码,是实现异步的手段。

  • 异步:同步是顺序执行,异步就是在等待某个资源资源做自己的事。

进程调度算法

先来先服务

按照请求的顺序进程调度,非剥夺式,开销小,无饥饿问题,响应时间不确定。

对段进程不利,对I/O密集流不利

短作业优先

按照允许时间最短的顺序进行调度,非剥夺式,吞吐量高,开销可能较大。

对短进程提供好的响应时间,对长进程不利。

最短剩余时间算法

按照进程剩余时间顺序进行调度,剥夺式,吞吐量早,开销可能较大,提供好的响应时间。

可能导致饥饿问题,对长时间不利。

最高响应比优先调度算法

响应比 = 1 + 进程等待时间/处理时间。同时考虑了等待时间的长短和估计需要的执行时间长短,很好的平衡了长短进程。非抢占,吞吐量高,开销可能较大,提供好的响应时间,无饥饿问题。

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

时间片轮转调度算法

将所有就绪进程按照先来先服务算法排列,用完时间片的还未完成进程的排到最后去,剥夺式,开销小,无饥饿问题,为短进程提供好的响应时间。

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

优先级调度算法

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

多级反馈队列调度算法

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

剥夺,开销可能比较大,对IO型进程有利,可能会出现饥饿问题。

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

高优先级的进程等待被一个低优先级占有资源时,就会出现优先级反转,即优先级较低的进程比优先级较高的进程先进行,此处详细解释优先级反转带来的问题,如果有一个中等优先级的进程将低优先级的进程抢占,那么此时低优先级的进程无法正常进行并在后续释放被占用的资源,导致高优先级的任务一直被挂起,直到中等优先级的进程完成后,低优先级的进程才可以继续并在后续释放占用的资源,最后高优先级的进程才可以执行。导致的问题就是高优先级的进程在中等优先级的进程调度之后。

解决方法

  • 优先级天花板 :当任务申请某资源时,把该任务的优先级提升到可访问这个资源的所有用户中的最高优先级,这个优先级称为该资源的优先级天花板。简单易行。
  • 优先级继承: 当任务A申请共享资源S时,如果S正在被任务C使用,通过比较任务C与自身的优先级,如发现任务C的优先级小于自身的优先级,则将任务C的优先级提升到自身的优先级,任务C释放资源S后,再恢复任务C的原优先级。