操作系统 进程并发与进程同步 经典进程同步问题

一:程序并发执行

条件:只有不存在前趋关系的程序之间才有可能并发执行,否则无法并发执行。

例:输入程序、计算程序和打印程序之间,存在着Ii->Ci->Pi的前趋关系。对一批作业进行处理,输入程序I1在输入第一次数据后,由计算程序C1对该数据进行计算时,输入程序I2可再输入第二次数据,从而使第一个计算程序C1与第二个输入程序I2并发执行,C1与I2之间并不存在前趋关系。

可以推出:Pi-1和Ci以及Ii+1之间不存在前趋关系可以并发执行。

特征

1.间断性:程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些程序之间形成了相互制约的关系,如一中的例子,计算程序完成Ci-1的运算后,输入程序Ii尚未完成数据的输入,则计算程序就无法进行数据处理,必须暂停运行。输入完成后,便可恢复计算。由此可见,相互制约使并发程序具有“执行--暂停--执行”的活动规律。

2.失去封闭性:由于并发程序共享资源,而资源状态的改变会使其运行环境发生改变,收到其他程序的影响。

3.不可再现性:失去封闭性,导致其失去可再现性。

例:

二:进程的定义和特征

  • 在多道程序程序环境下,程序的执行属于并发执行,此时它们由于失去封闭性,间断性和运行结果不可再现性的特征,决定了通常的程序是不能参加并发执行的,否则程序的运行也就失去了意义。为了使程序能够并发执行,并对并发执行的程序加以描述和控制,所以引入的进程的概念。
  • 事实上,这里的程序并发执行,是引入了进程同步机制的并发执行,这样,才能使并发执行的结果可再现,从而使程序的运行有意义。

进程的特征:

  1. 动态性:创建,执行,消亡。
  2. 并发性:程序没有建立PCB是不能参与并发执行的,因为PCB中含有用于控制和管理进程的信息,例如进程运行所需要的资源等,这些信息对于进程能否被创建完成和实现进程同步具有重要作用
  3. 独立性:进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
  4. 异步性:进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进。源于此,导致了传统意义上的程序若参与并发执行,会产生结果的不可再现性。为保证进程在并发运行时具有异步性,但仍能保证进程并发执行的结果是可再现的,在OS中引进了进程的概念,并且配置相应的进程同步机制。

三 :进程同步

  • 为保证多个程序并发执行时,保留可再现性,在多道程序系统中,必须引入进程同步机制。
  • 进程同步机制的主要任务,是对多个相关进程在执行次序上进行协作,使并发执行的诸进程之间能按照一定的规则(或时序)共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性

由于共享资源,进程之间存在制约关系,但这种关系有别于前趋关系,具有前趋关系的程序不能并发执行,请理解它们之间的区别。

  1. 间接相互制约关系:诸如像打印机机、磁带机这样的临界资源,必须保证多个进程对之只能互斥的访问,由此,在这些进程之间形成了源于对该类资源共享的所谓间接相互制约的关系。为了保证这些程序能够有序的进行,对于系统中的这类资源,必须由系统实施统一分配,即用户在要使用之前,应先提出申请,而不允许用户进程直接使用。
  2. 直接相互制约关系:某些应用程序,为了完成某任务而建立了两个或多个进程,这些进程将为完成同一项任务而相互合作,进程间的直接制约关系就是源于它们之间的相互合作。例如输入进程A和计算进程B共享一个数据缓冲区。

由于存在着上述两种相互制约关系,进程在运行过程中是否能获得处理机运行与以怎样的速度运行,并不能由进程自身所控制,此即进程的异步性。由此会产生对共享变量或数据结构等资源不正确的访问次序,从而造成进程每次执行结果的不一致。这种差错往往与时间有关,故称为”与时间有关的错误“,为了杜绝这种差错,必须对进程的执行次序进行协调,保证诸进程能按序执行。

临界资源:只能互斥访问的资源

生产者消费者问题:

它描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲池的缓冲池,生产者进程将其所生产的产品放进一个缓冲区中,消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式都是以异步方式进行的,但它们之间必须保持同步,既不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲池中投放产品

我们用一个数组buffer来表示上述的具有n个缓冲区的缓冲池,每投入(或取出)一个产品时,缓冲池buffer中暂存产品(或已取走产品的空闲单元)的数组单元指针in(或out)加1;此外还引入了一个整形常量counter,其初始值为0。每当生产者进程向缓冲池中投放(或取走)一个产品后,使counter加1(或减1)。生产者和消费者两进程共享下面的变量:

int in = 0,out =0,count=0;

item buffer[n];

指针in和out初始化为 1。

实际上,这里用的是循环队列的结构,如图:

因为上班时间忙,没空更新了,对看到这里的朋友说一声抱歉...

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值