进程管理、死锁、进程通信

本文详细介绍了进程和线程的概念,包括进程的组成、线程的类型以及两者之间的区别。还讨论了进程通信的方式,如共享存储、消息传递等。此外,文章深入探讨了死锁的问题,包括死锁产生的原因、必要条件以及处理死锁的四种策略,如预防、避免、检测和解除死锁的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序的概念:程序是指令的有序集合,是一个在时间上严格按次序前后相继的操作序列,仅当前一操作执行完后,才能执行后继操作,它是一个静态的概念

为使程序能并发执行,并且为了对并发执行的程序加以描述和控制,引入了进程的概念。

进程的概念:进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立的单位。

进程包括:程序段、相关的数据段、进程控制块(PCB)

CPU由一个进程快速切换到另一个进程,使得每个进程运行几十或者几百毫秒从而产生一种并行的错觉。

为了减少程序在并发执行时所付出的时空开销,使操作系统具有更好的并发性,引入了线程。

线程的概念:每个线程都是一个可执行的实体,是cpu调度和分派的基本单位。有时将线程称为轻量级进程。

一个进程中含有一个或多个相对独立的线程,由于线程比进程更小基本上不拥有系统资源,故对它的调度所付出的开销就会小的多,更能高效地提高系统内多个程序间并发执行的程度。

线程分为内核支持线程和用户级线程

内核支持线程:

系统在创建一个进程时便会我它分配一个任务数据区,其中包括若干个线程控制块,每个线程控制块包括线程标识、优先级、线程运行CPU的状态等。线程和进程的切换和调度的方式一样分为抢占方式和非抢占方式。在线程调度算法上,同样采用时间片轮转发和优先级算法。

用户级线程是用户空间实现的。所有的用户级线程都具有相同的结构,他们都运行在运行在一个中间系统上面。中间系统的实现的两种方式:运行时系统和内核控制线程。

进程与线程的比较:

(1)调度

在传统的操作系统中,作为资源的基本单位和独立调度、分派的基本单位都是进程。在引入线程的操作系统中,则把线程作为调度和分派的基本单位,而进程作为资源拥有的基本单位,使线程基本上不拥有资源

(2)并发性

在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可并发执行

(3)拥有资源

不论是传统的操作系统,还是引入了线程的操作系统,进程都可以拥有资源,是系统中拥有资源的基本单位。一般而言,线程自己不用有系统资源(也有一点必不可少的资源),但它可以访问其所在进程的资源,即一个进程的代码段、数据段及所拥有的系统资源。

(4)系统开销

 在创建或撤销进程时,系统都要为之创建和回收进程控制块,分配或回收资源,操作系统所付出的开销明显大于线程创建或撤销时的开销。

进程通信:

进程通信是指进程之间的信息交换。进程之间的互斥和同步,由于其所交换的信息量少而被归结为低级进程通信。                        高级通信机制可归结为四大类:共享存储器系统、消息传递系统、客户端-服务器系统以及管道通信系统

共享存储系统:是指在内存中开辟的一块新的存储区域作为进程间通信区。发送进程把需要交换的信息写入这一区域,而接收进程从该区域中读取信息,以此方式来实现进程间的信息交互。

 消息传递系统:是当前应用最广泛的一种进程间的通信机制。在该机制中,进程间的数据交换是以格式化的消息为单位的。消息传递机制至少需要提供发送消息和接收消息两条原语,前者向一个给定的目标发送一个消息,后者则从一个给定的源接收一条消息。程序员直接利用这两条原语,不仅能实现大量的数据传递,而且还隐藏了通信的实现细节,使通信的过程对用户是透明的,从而大大简化了通信程序编制的复杂性。

 客户端-服务器系统:在网络环境的各种应用领域中,客户端-服务器系统的通信机制成为当前主流的通信机制,其主要的实现方法为:套接字、远程过程调用和远程方法调用。

管道通信系统:“管道”,是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。管道是单向的,写进程视管道文件为输出文件,以字符流的形式把大量的数据送入管道;读进程视管道文件为输入文件,从管道中接收数据。

死锁:

死锁的概念:死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

 死锁产生的原因:(1)竞争资源。当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的进程而产生的死锁。(2)进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,也会导致产生进程死锁。

 死锁产生的必要条件:(1)互斥条件。指进程对分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求该资源,则请求只能等待,直至占有该自愿的进程用完释放。(2)请求和保持条件。指进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程阻塞,但又对自己获得的资源保持不放。(3)不可抢占。指进程已获得的资源,在未使用完之前,不能被占用,只能在使用完时自由释放。(4)环路等待条件。指在发生死锁时,必然存在一个进程---资源的环形链。

死锁的处理:(1)预防死锁。通过设置某些限制条件,破环产生死锁的四个必要条件中的一个或几个条件,来预防发生死锁。(2)避免死锁。该方法是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。(3)检测死锁。这种方法允许进程在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源;然后,采取适当的措施,从系统中将已发生的死锁清除掉。(4)解除死锁。这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,采取相应的措施,将进程从死锁状态解脱出来。常用的方法是撤销或者挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。

预防死锁:

1.破坏资源互斥条件

打印进是独占资源,我们设置一个进程守护,将所有的打印任务收集到一个队列中,如此,可以打破独占条件。

2.打破请求和保持条件

要求进程运行前一次性将所有需要的资源都申请下来

或者在运行时,当需要的资源无法满足时,主动释放以占有的资源

3.破不可强占条件

当进程申请的资源被其他进程占用时,可以通过操作系统抢占这一块资源(当两个进程优先级不同)。

4.破坏循环等待条件

通过定义资源类型的线性顺序实现,把系统中所有资源编号,进程在申请资源时必须按资源编号的递增顺序进行,否则操作系统不予分配。

银行家算法(避免死锁的方法)

1.银行家算法中的数据结构:(1)可利用的资源向量Available;(2)最大的需求矩阵Max;(3)分配矩阵Allocation;(4)需求矩阵Need。上述三个矩阵间存在的关系:Need[i,j]=Max[i,j]-Allocation[i,j]

2.银行家算法:设Requesti是进程pi的请求向量,如果Requesti[j]=K,表示进程pi需要K个Rj类型的资源。当pi发出资源请求后,系统按下述步骤进行检查:

(1)如果Requesti[j]<=Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源已超出它所宣布的最大值。

(2)如果Requesti[j]<=Available[j],便转向步骤(3);否则表示尚无足够资源,pi需等待;

(3)系统试探着把资源分配给进程pi,并修改下面数据结构中的数值:

         Available[j]=Available[j]-Requesti[j];

        Allocation[i,j]=Allocation[i,j]+Requesti[j];

        Need[i,j]=Need[i,j]-Requesti[j];

(4)系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程pi等待。

检测死锁:

允许死锁发生,但是操作系统会不断监视系统进展情况,判断死锁是否真的发生,一旦死锁发生,采用解除死锁

解除死锁:

  • 撤销所有的死锁进程
  • 进程回退再启动
  • 按照某种原则逐一撤销死锁的进程
  • 按照某一种原则逐一抢占资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值