浅谈操作系统——关于进程同步

170 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

刚刚好的国庆假期,恰好我在复习操作系统,于是突发奇想搞一个这样的系列,把我学习操作系统整理到的知识点和一些小想法都存放到这里,那么废话不多说,直接步入正题。

什么是进程同步?(基本概念)

进程同步的主要任务是使并发执行的各个进程之间能有效地共享资源相互合作,使执行结果具有可再现性。

进程间存在两种制约关系

1. 间接相互制约关系 这个意思是系统之间是资源共享的

2. 直接相互制约关系 这个是进程之间是要合作的

那么这里我们就要引入一个概念了——临界资源

临界资源

一段时间内仅允许一个进程访问的资源。

这个临界资源可能是硬件,也可能是软件,就比如说我们都知道的:变量,数据,表格,队列等等等。

而并发进程要是想实现对临界资源的访问就必须要做某种限制,否则就要出现与时间有关的错误了,举个简单的例子:联网售票

一个飞机订票系统,两个终端,运行T1,T2两个进程 image.png

我们看这段代码,T1和T2共享了临界资源也就是变量x,两个进程都顺利执行定了这张票,但是票只有一张,这就产生了错误。

谈完概念,我们就可以来解决问题了,首先看典型的生产者——消费者问题

生产者——消费者问题

生产者与消费者如何定义呢?

首先我们要知道,计算机系统中的每个进程都可以使用或者释放某类资源,这些资源可以是硬件资源,也可以是软件资源。

  • 当某一进程使用某一资源时,可以看作是消费,这样就称这个进程是消费者。而当某一进程释放某一资源时,它就相当于生产者了。

问题描述:

生产者和消费者之间设置一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区;消费者进程可以从一个缓冲区中取走产品去消费。

  • 不允许消费者进程到一个空缓冲区去取产品。
  • 不允许生产者进程向一个已经装满产品且尚未取走的缓冲区投放产品。

问题分析

  • 用输入指针in指示下一个可投放产品的缓冲区,每当生产者进程生产并投放一个产品时,输入指针加1 in:=(in+1) mod n;
  • 用指针out指示下一个可以从中获取产品的缓冲区,每当消费者进程取出一个产品,输出指针加1 out:=(out+1) mod n;

在图片中就是这样的

image.png

  • (in+1) mod n = out 缓冲池满了
  • (out+1) mod n = in 缓冲池空

我们用counter表示缓冲池内产品的数量,在生产者进程中使用一个局部变量nextup用于暂存每次刚生产出来的产品,nextc用于存放每次要消费的产品。

image.png

需要注意的是,必须要对临界资源counter进行控制,怎么控制呢,我们又要引入一个概念

临界区

也叫临界段,在每个程序中访问临界资源的那段程序

repeat
    entry section
    critical section
    exit section
    remainder section
Until false

注意临界区是对某一临界资源而言的,对于不同临界资源的临界区,他们之间是不存在互斥的。

最后还要记住同步机制需要遵循的规则

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待

今天的学习就到这里啦,欲知后事,请看下回