进程的并发执行
并发进程的特点
- 进程之间形成互斥关系
由于进程之间共享资源,而间接相互制约
比如说WPS在打开一个文件的时候,word不能打开。如果两个进程共享同一个资源,在其中一个进程使用该资源的时候另一个进程不能使用 - 同步
一组协作的进程要等待其他进程的信息才能继续进行,因而产生直接制约的关系 - 前序
由于进程之间存在者上述两种间接或者直接的制约方式,所以在实际执行的时候
共享资源:
- 硬件设备:如打印机
- 软件资源:如共享变量、共享文件和各种队列等
临界资源:一次仅允许一个进程使用的系统中共享资源。
临界区(critical section) : 并发进程访问临界资源的那段必须互斥执行的程序段。
对临界区的使用应符合的准则:
- 互斥使用
废话,临界资源一次只能一个进程使用 - 让权等待 一个进程此时正在CPU运行,申请使用临界资源,但是没有申请到的时候,此时该进程不能继续运行,不能继续停留在CPU,应该出去等待,把CPU让给其他就绪的进程
- 有空让进 如果一个进程当前不需要使用临界进程,那它不能组织其他进程使用临界资源
- 有限等待 如果一个进程申请使用某个临界资源申请不到而长时间处于等待状态,不能让他一直无限的等下去
简单来说,就是我们不希望:两个人同时使用一个茅坑;有人占着茅坑不拉屎;有人厕所外面还拦着其他要上厕所的人不让进;有人一直在厕所外面排队憋死了。
信号量和PV操作(进程间的低级通信)
为了使并发的进程可以遵循上面的准则。1965年,荷兰学者Dijkstra提出了一种机制。
我们可以将信号量可以看作一个整数(事实上真实的信号量是一个结构体),只能对信号量进行P操作或者V操作,P操作用于”申请资源“,V操作用于”释放资源“。
可以将信号量的值理解为 当前可用的资源数,如果是负数则代表现在有多少个进程正在阻塞等待这个资源,比如如果mutex == -5
,则说明现在有5个进程之前申请使用这个资源没有申请到,正在排队。
- 每次对一个信号量执行P操作:
信号量-1;
if 信号量 >= 0:
现在的进程继续执行
//如果当前进程占用了一个资源之后还有大于0个资源或者刚好可用资源数==0
//说明当前进程还是有资源可用的
else
阻塞
//如果当前进程占用了一个资源之后,可用资源数小于0,说明在当前进程申请之前就已经没有可用资源了
排列到一个和这个信号量有关的队列尾部等待
//不然有资源空闲的时候不知道去哪里找它了
- 执行V操作:
信号量+1;//当前进程释放资源之后,可用资源就变多了一个
<