--信号量)
前提知识进程间需要 IPC - 进程具有独立性 - 让不同的进程看到同一份 资源(file, 内存块队列) - OS 提供为了解决让进程看到同个资源的问题又会引出多个问题多个执行流进程能够同时看见的同一份公共资源叫做共享资源。 当这份共享资源需要被保护就成为临界资源互斥资源这类资源同一时刻仅允许一个进程使用。对临界资源的保护主要分为互斥和同步两种形式互斥任意时刻只允许一个执行流访问临界资源避免多个进程同时抢占资源引发错乱。同步多个执行流访问临界资源时按照预先规定的先后顺序执行协调执行次序。注意我们保护的对象不是资源本身而是访问资源的代码片段。 进程代码可以划分为两部分临界区代码中访问临界资源的程序片段非临界区不触碰临界资源的其余代码。对共享资源做保护本质上就是保护临界区代码控制多个执行流进入临界区的规则以此保证并发场景下数据正确。我们之前就遇到过并发的问题父子进程都在向显示器打印,而显示器是文件,是他们共享的资源,他们都在向显示器写入,但是却没有管理,这就引出了并发的问题原子性要么不做要么做完--两态操作--不容易被打扰什么是信号量??信号量本质是操作系统提供的计数器搭配 P、V 两个原子操作用来管理多个执行流对临界资源的访问。P 操作申请资源信号量计数减 1若减完后小于 0当前进程阻塞挂起等待资源。V 操作释放资源信号量计数加 1若加完后小于等于 0唤醒一个正在阻塞等待的进程。核心P、V 操作是原子性的一旦开始执行不会被 CPU 调度打断。信号量 1作为互斥锁实现互斥信号量初始化为其他数值可以实现进程同步、资源计数。System V 信号量是 Linux 下进程间可用的信号量属于 IPC多个不同进程可以打开同一个信号量集合完成进程之间互斥与同步。用电影院理解信号量显然是后者,买票的本质就是:对资源的预定机制,所以如果我买到了票,及时我还没有去访问座位,但也提前被我预定了放映厅最多容纳 100 人对应信号量初值 100代表可用资源总数。买票 P 操作申请资源离场退票 V 操作释放资源放映厅一共最多卖 100 张票票有上限对应信号量计数器有最大值。票卖完信号量计数变成 0再来的人就不能进场需要排队等待进程阻塞。买票就代表资源被预定而不是坐下使用才占有资源。 哪怕买了票人还没进场这个名额已经被占掉其他人不能再拿到这张票。 对应信号量 P 操作只要 P 操作成功信号量计数器就‑1代表资源已经被预定进程就算还没有真正使用临界资源其他进程也拿不到这份资源。看完电影离场执行退票V 操作信号量计数 1释放名额排队等待的人就可以拿到票进场唤醒阻塞进程。电影院信号量概念放映厅总座位 100信号量初始值可用资源数目买票入场P 操作申请资源计数器‑1票卖光观众排队等票P 后信号量 0进程阻塞进入等待队列看完电影离场退票V 操作释放资源计数器 1退票之后叫排队的人进来V 操作唤醒阻塞等待的进程买到票就算占用资源不一定立刻坐下P/V 只负责预定 / 释放资源和你什么时候真正访问资源无关补充:每一个进程都要申请信号量,也就是每一个进程都必须看到同一个信号量那么也就是说信号量就是一个共享资源,那么谁来保护信号量的安全信号量的申请--- p操作信号量的释放- v操作如果我们的放映厅只有一个座位-一次只能放进来一个人,只有在放映厅的那个人出去,下一个人才能进来,这就是我们所说的互斥--是原子的吗??--操作不是原子的,以a为例编译器会拆分成三条独立 CPU 指令执行过程可被进程调度打断load从内存读取变量 a 的值到 CPU 寄存器add寄存器数值 1store把寄存器结果写回内存变量 a同理a--也是读取 - 计算 - 回写三段操作中间任意时刻操作系统都可能切换进程造成数据竞争。怎么确定是不是原子的呢-将代码转换为汇编时.如果是代码对应一行就是原子,否则为非原子如何保证看到的是同一个信号量??如果要进行共享资源的保护,你就必须让不同进程看到同一份资源--计数器资源这就需要用户来完成为什么要有并发场景下多个进程同时访问共享 / 临界资源会产生数据错乱、输出穿插、数据不一致的并发问题。 我们需要一种手段控制执行流进入临界区实现互斥保证同一时刻只有一个进程进入临界区访问临界资源。实现同步控制多个进程执行的先后顺序完成进程间协同。普通变量做不到因为普通变量的加减会被 CPU 中断打断无法保证原子性。信号量由 OS 内核维护P/V 是原子操作解决并发下的互斥、同步问题以此保护临界区代码。