进程和线程的区别

进程是什么?

进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,所以,进程也是资源分配的最小单位,每个进程有各自独立的一块内存,使得各个进程之间内存地址相互隔离
进程一般由

  • 程序,
  • 数据集合
  • 进程控制块三部分组成(PCB)
    程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息,是进程存在的唯一标志

线程是什么

线程作为进程的一部分,扮演的角色就是怎么利用中央处理器去运行代码。这其中牵扯到的最重要资源的是CPU和其中的寄存器,和线程的栈(stack)。线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。线程是进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程

线程和进程的关系和区别

http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

再说进程

进程的5个特点

  • 动态性:进程的实质是程序在多道操作系统中的一次执行过程,进程是动态产生,动态消亡的。
  • 并发性:任何进程都可以同其他进程一起并发执行
  • 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
  • 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
  • 结构特征:进程由程序、数据和进程控制块三部分组成。
    多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

进程的3种基本状态

  • 就绪(Ready)状态:指进程已处于准备好运行的状态,及进程已经分配到需要的系统资源,只要在获得CPU就可以执行
  • 执行(Running)状态:指进程获得了CPU正在执行,在单处理机系统中,最多只有一个进程处于该状态
  • 阻塞(Block)状态:指正在执行的进程,在执行过程中发生了某时间(如:I/O请求、申请缓冲区失败等)

进程的5种状态--3+2

为满足进程控制块pcb对数据及操作的完整性要求以及增强管理的灵活性,通常在引入两种状态:创建状态和终止状态

创建状态:
创建一个进程要经过以下几步:

  • 首先进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息
  • 然后为该进程分配运行时所必须的资源
  • 最后把该进程转入就绪状态并插入就绪队列
    引入创建状态是为了保证进程的调度必须是在创建工作完成之后

终止状态:
进程的终止状态有以下两步:

  • 首先,等待操作系统做善后处理
  • 最后将其PCB清零,并将PCB空间返还给系统
    当一个进程达到了自然结束点或是出现了无法克服的错误,或是被操作系统终结,则进入终止状态。进入终止状态的进程以后不能再执行,但在操作系统中保存状态码和一些计时统计数据供其他进程收集

进程控制块PCB

PCB的作用

PCB作为进程实体的一部分,记录操作系统所需的用于描述进程的当前情况以及管理进程运行的全部信息,是操作系统中最重要的记录型数据结构。我们认为,创建进程就是创建一个PCB,销毁进程也就是销毁进程的PCB。它的作用是使一个能在多道程序环境下不能独立运行的程序称为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
PCB中主要包含以下四方面的信息:

  • 进程标识符:用于唯一的标识某一个进程
  • 处理机状态(又称处理机上下文):主要由处理机的各种寄存器中的内容组成,当进程被切换时,处理机状态信息被保存起来以便重新执行时可以继续执行
  1. 寄存器主要包括:
  • 通用寄存器:用于暂存信息(大多数处理机有8~32个)
  • 指令计数器:存放将要访问的下一条指令的地址
  • 程序状态字PSW:是运算器的一部分,分两类:一种是体现当前指令结果如是否有进位、是否为零,另一种是存放控制信息如允许中断、跟踪标志等
  • 用户栈指针:每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址,栈指针则是指向该栈的栈顶
  1. 进程调度信息
    存储当前进程的进程状态、进程优先级、进程调度所需的其他信息(与调度算法有关的信息如进程等待CPU的时间、已执行的时间等)和事件(从执行状态到阻塞状态的原因)
  2. 进程控制信息:
    用于进程控制的信息,包括:程序和数据的地址、进程同步和通信机制、资源清单和链接指针(该进程所在队列中的下一个PCB的首地址)

PCB的组织方式:

在一个系统中常有数百乃至上千个PCB,为了对他们加以有效的管理,应使用适当方式将其组织起来,目前常用的有以下三种方式:

  • 线性:所有的PCB都组织在一张线性表中,该表的首地址放在内存的一个专用区域,每次使用都遍历整张表,适合进程数目较少的操作系统
  • 链接:将具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列,这样可以形成就绪队列、阻塞队列和空白队列等
  • 索引:即系统根据进程状态不同,建立几张索引表

进程间的通信方式

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。
https://www.cnblogs.com/zgq0/p/8780893.html

进程创建的原理

http://c.biancheng.net/view/1207.html

进程和线程死锁

进程死锁和线程死锁的原理都差不多。出现的根本原因是因为抢夺资源,这种情况很多时候发生在和硬件进行交互的阶段。
比如:当两列火车在同一轨道上迎面驶来,而只有一条轨道,一旦它们在彼此的前面,任何一列火车都不能移动。在操作系统中,当有两个或多个进程持有一些资源并等待对方进程持有的资源时,也会发生类似的情况。例如,在下面的图中,进程1持有资源1,等待进程2获取的资源2,进程2等待资源1。

在计算机系统中,有很多的独占性资源,在任一时刻它们只能被一个进程使用,比如打印机,cd-room,还有os内部的表中的表项等。比如打印机如果同时让两个进程打印将导致混乱打印的情况出现,因此,在os内部都具有授权一个进程临时性的排他访问某一种资源的能力,这个就是互斥锁的一种情况体现。以上是一种资源的情况, 但在很多应用中,需要一个进程排他性的访问多种资源而不是一种,比如有俩个进程准备将扫描的文档刻录到光盘上,此刻进程A请求扫描仪,被os授权使用,但进程B率先请求CD-ROOM刻录,由于cd-room此时是空闲的,所以也会被授权使用。之后,A请求使用cd-room,但由于cd-room是不可抢占性资源,所以A请求cd-room会被拒绝,同时B也会去请求扫描仪。那么这个时候,AB两个进程都被阻塞,并且一直处于这种僵持的状态,这种情况就叫死锁(deadlock)

那么死锁发生的原因有2种,大部分情况下都和资源有关,特别是不可抢占资源:

  • 系统提供的资源太少了,远不能满足并发进程对资源的需求。

例如:消息是一种临时性资源。某一时刻,进程A等待进程B发来的消息,进程B等待进程C发来的消息,而进程C又等待进程A发来的消息。消息未到,A,B,C三个进程均无法向前推进,也会发生进程通信上的死锁。

  • 另一种原因是由于进程推进顺序不合适引发的死锁。

资源少也未必一定产生死锁。就如同两个人过独木桥,如果两个人都要先过,在独木桥上僵持不肯后退,必然会应竞争资源产生死锁;但是,如果两个人上桥前先看一看有无对方的人在桥上,当无对方的人在桥上时自己才上桥,那麽问题就解决了。所以,如果程序设计得不合理,造成进程推进的顺序不当,也会出现死锁。

资源

那么在os中,资源有2种:

  • 可抢占资源:

可抢占资源可以从拥有它的进程种被抢占剥夺,但是不会产生副作用,比如内存

  • 不可抢占资源

值得是在不引起相关计算失败的条件下,无法把这个资源从占有它的进程中剥夺过来。比如cd-room,如果被抢占,将可能会把光盘刻坏

产生死锁的四个必要条件-缺一不可

意思就是说,死锁发生时,下面这四个条件一定时同时存在的,如果任意一个条件不成立,那么死锁就不会发生。

  • 互斥条件。

即某个资源在一段时间内只能由一个进程占有,不能同时被两个或两个以上的进程占有。这种独占资源如CD-ROM驱动器,打印机等等,必须在占有该资源的进程主动释放它之后,其它进程才能占有该资源。这是由资源本身的属性所决定的。如独木桥就是一种独占资源,两方的人不能同时过桥。

  • 不可抢占条件。

进程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者进程自行释放。如过独木桥的人不能强迫对方后退,也不能非法地将对方推下桥,必须是桥上的人自己过桥后空出桥面(即主动释放占有资源),对方的人才能过桥。

  • 占有且等待条件。

进程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外进程占有,此时该进程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。还以过独木桥为例,甲乙两人在桥上相遇。甲走过一段桥面(即占有了一些资源),还需要走其余的桥面(申请新的资源),但那部分桥面被乙占有(乙走过一段桥面)。甲过不去,前进不能,又不后退;乙也处于同样的状况。

  • 环路等待条件。

死锁发生时,系统中一定有2个或者2个以上的进程组成一条环路,该环路中的每个进程都在等待着下一个进程所占有的资源。
比如:存在一个进程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一资源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一资源,形成一个进程循环等待环。就像前面的过独木桥问题,甲等待乙占有的桥面,而乙又等待甲占有的桥面,从而彼此循环等待。

死锁的检测

死锁的检测也是非常必要的,有时候我们会希望死锁发生,进而检测死锁发生在那些进程中,以此定位问题。那么检测方式大概分为2个大的方向:单资源检测和多资源检测。

每种类型一个资源的死锁检测

最简单的情况是每种资源类型只有一个资源,比如:扫描仪,printer,cd等等。对于这样的系统,我们可以构造一张资源分配图,如果资源包含了一个或一个以上的环,那么死锁就存在,因此在这个环内的任何进程都是死锁进程,相应的如果没有这样的环,则死锁没有发生。(链表是否有环及环的入口这些常见的算法也应该可以定位问题,或者DAG的环路检测也是ok)
举个例子:
假设系统此刻一共有A-G 7个进程,R-W6种资源,资源的占有情况和进程对资源的请求情况如下:

1.A has R,reqiure S
2.B has nothing, require T
3.C has nothing, require S
4.D has U, require S,T
5.E has T, require V
6 F has W, require S
7.G has V, require U

那么抛出一个问题:这个系统是否存在死锁?如果存在的话,涉及到了那些进程?
那么我们可以画出资源分配图:

那么从图中可以很容易的看到那个地方时环路,死锁发生涉及到了那些进程。所以在检测的时候,我们可以用一些环路检测算法,来检测是否有环的存在。

每种类型多个资源的死锁检测

//TODO

死锁的预防和避免

在大多数系统中,一次只请求一个资源,所以系统必须能够判断资源分配是否安全,并且只能保证在安全的条件下分配资源。

银行家算法

单个资源的银行家算法

多个资源的银行家算法

破坏四个条件

破坏互斥条件-守护进程和假脱机技术

如果资源不被一个进程独占,那么死锁肯定不会产生。当然,如果允许两个进程同时使用该资源会导致混乱,比如2个进程同时使用打印机,或者2个进程同时写文件。那么我们可以通过采用假脱机打印机技术,该技术允许若干个进程同时产生输出。在这个技术中,唯一真正请求使用物理打印机的进程时打印机守护进程,由于守护进程绝不会请求别的资源,所以不会因打印机而产生死锁

破坏不可抢占条件

假如一个进程正在打印,但是它又需要申请其他的资源比如扫描仪,这时候扫描仪没资源了,那么我们可以把打印机的进程干掉。

破坏占有并等待条件

破坏这个条件的做法是:规定这个进程在执行开始前请求全部的所需资源,如果所需的资源全部可用,那么就将它们分配给这个进程,于是该进程肯定能够完全的运行结束,如果没资源的时候,这个进程就需要等待。
但是这种方法存在一个比较大的问题就是很多进程直到其运行结束才会知道我到底需要那些资源,需要多少资源。(如果知道了需要多少资源那就更适合用银行家算法)

破坏环路等待条件

消除环路等待有几种方法。一种是保证每一个进程在任何时候只能占用一个资源,如果要请求另外的资源,那么它必须释放掉第一个资源。另一种方式是给所有资源编号,且规定进程只能按顺序申请资源,比如必须先申请扫描仪之后再申请打印机,那么这样就能避免交叉申请资源而导致冲突的现象(比如最开始的打印机和扫描仪的矛盾),我们也可以对资源加上互斥锁或者信号量这些来检测资源的使用情况。

posted @ 2020-09-21 10:59  real-zhouyc  阅读(443)  评论(1编辑  收藏  举报