码迷,mamicode.com
首页 > 系统相关 > 详细

进程同步为什么不叫进程协调?

时间:2020-10-30 12:52:29      阅读:21      评论:0      收藏:0      [点我收藏+]

标签:生产   表示   复杂   时间复杂度   进程调度   实施   变化   改变   过程   

前言

今天刚学完进程同步机制,突然感觉书中说来说去的进程同步,到头来还是没说清为什么要进行同步?同步了个啥?只是给出了很多概念。我觉得进程同步问题所牵扯到的知识还真是不少,所以打算记录下来,顺便梳理一下我的思路。如有错误,欢迎指出。

1. 进程同步概述

1.1 什么是进程同步?

这是百度词条给出的解释:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。我倒觉得百度的解释还有些道理,其实最主要的就是这个相互制约关系,这点我们一会再说。

在 OS 中,同步强调的是多个进程在并发执行环境下异步执行时,各个进程之间的协调。也就是说,进程只要协调着运行,就可以说这些进程之间是同步的

如果非要刨根问底的话,我们需要先知道同步是什么意思:同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。这里的量可以换成进程,这里的相对关系可以换成间接/直接相互制约关系。

到这里,你只需要知道进程同步就是用来协调进程之间的各种相互制约关系就行了,下面讨论这类制约关系。

1.2 进程之间的各种相互制约关系

这些关系大体分为两类:

  • 间接相互制约关系
    也称互斥关系,由多进程对同一资源(临界资源)的共享引发,必须由系统实施统一分配,例如篮球比赛中的「篮球」就引发了双方队员的间接相互制约关系。
  • 直接相互制约关系
    由进程执行环境/条件发生改变而引发,源于多个进程之间的相互合作,例如生产者-消费者问题中,生产者和消费者之间就产生了直接相互制约关系。

因此,我们必须引用一种制度来维持进程间复杂的相互制约关系,而这正是进程同步的主要任务。

还有一种说法是:“为了解决进程的异步性带来的结果不可再现问题”。不过我认为这种说法没有说到点上,因为真正让结果不可再现的不是异步执行,而是多个异步执行的进程并发执行起来的不协调,这种不协调破坏了进程之间的相互制约关系,所以才需要进程同步来协调。

那么,该怎么实现进程同步呢?

1.3 怎么实现进程同步?

这个问题可以换个问法:该怎么维持进程间复杂的相互制约关系?

  • 对于间接相互制约关系,主要是临界资源产生的,这需要采用互斥方式来维持。
  • 对于直接相互制约关系,主要是进程之间的相互依赖而产生的,这需要协调各进程之间的执行次序,继而就维持了进程之间的直接相互制约关系。

思路有了,就该考虑怎么实现了。为了实现进程同步,需要在操作系统的进程管理功能的实现中,引入进程同步机制,这主要包括硬件同步机制、信号量机制、管程机制等。

其中信号量机制中的信号量是一个非常关键的概念,只要你把信号量理解清楚了,你就掌握了该怎么实现共享资源的互斥访问、同时访问。

2. 一些基本概念

要想搞明白什么是进程同步机制,这些概念你必须先理清楚。

2.1 在进程同步中,临界资源不单纯指临界资源

共享资源都应该当成临界资源处理,不管它是需要互斥访问,还是可以被多个进程同时访问。对于临界资源,这样做可以保证单进程对它进行互斥访问;对于其他共享资源,这样做可以保证多进程对它进行有条不紊的共享访问。

因此,对共享资源进行访问的代码片段都应该放在下面要讲到的临界区中。

所以下面的提到的临界资源就指的是共享资源,而不单只临界资源了。那么该如何区分某个资源的共享方式(互斥共享方式或同时访问方式)呢?看信号量 S 的取值。

2.2 建立临界区:硬件/软件临界资源共享解决方案

为了解决问题,我们可以把访问临界资源的循环进程执行方案给抽象化了,用伪代码表示为:

while (TURE) {
	进入区
	临界区
	退出区
	剩余区
}

临界区是指每个进程中访问临界资源的那段代码。顺便提一下,剩余区中所包含的代码片段并不是连续的,它可以穿插在不同区域当中,但通常不放在进入区中,因为这样做会造成资源浪费,我们应该花费最精炼的代码(时间复杂度最小)去判断一个进程是否可以进入到临界区中。

3. 浅谈进程同步机制

进程同步机制也可以换一个说法,就是协调进程运行的机制。

这里仅给出几种进程同步机制的问题解决思路,如果有时间的话,再详细的讨论下。

3.1 面临的主要问题

从上面的进程关系中可以得知,目前进程同步所面临的最大问题,就是如何协调具有「直接相互制约关系的进程们」对「软/硬件临界资源」的互斥访问顺序。

又从建立临界区这一解决方案中得知,这个问题现在演变成了解决诸进程如何互斥地进入临界区的问题。

3.2 硬件同步机制

引入一个标志,把它当成一个锁,“锁开”进入,“锁关”等待,并且为防止多个进程同时测试到锁打开的情况,测试和关锁操作必须是连续的,不允许分开进行。

此时,问题就变成了如何把测试和关锁两个操作变成一个连续的、完整的操作。

3.3 信号量机制

针对多个并发进程仅共享一个临界资源,可采用整型信号量、记录型信号量等。

针对多个并发进程序共享两个或更多的共享资源,可采用 AND 型信号量、信号量集(改进版 AND 型信号量集)等。

这些机制之间存在很大的联系,因为他们共同的特点是都在各自的 PV 操作中引入了信号量这一变量。

后记

关于为什么不把进程同步叫做进程协调,我只是觉得进程同步比进程协调听起来更抽象一些。在这里,把它当成协调更容易理解。但要想让一组进程有条不紊地运行,光解决上面描述的互斥问题和同步问题是远远不行的,例如还有进程该如何调度的问题(即计算机系统资源该如何分配或释放的问题)、进程同步过程中存在的死锁问题(进程调度所要解决的一个难题)……

因此,同步的意义不仅仅在于去解决一两种问题,而在于与其他进程管理功能结合起来,共同完成「进程管理」这一项艰巨的任务。

进程同步为什么不叫进程协调?

标签:生产   表示   复杂   时间复杂度   进程调度   实施   变化   改变   过程   

原文地址:https://www.cnblogs.com/chenshu/p/13899704.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!