五个概念
- 多个执行流(进程),能看到的一份资源:共享资源
- 被保护起来的资源可以叫临界资源(同步和互斥) --- 用互斥的方式保护共享资源就叫临界资源
- 互斥:任何时刻只能有一个进程在访问共享资源
- 资源,要被程序员访问,资源被访问,朴素的认识,就是通过代码访问,所以代码 = 访问共享资源的代码(临界区) + 不访问共享资源的代码(非临界区)
- 所谓的对共享资源进行保护就是临界资源,本质是对访问共享资源的代码进行保护!
信号量理论理解
引入结论:信号量本质是一个计数器,比如count=16
讲信号量之前先引入一个故事
我们都喜欢去电影院看电影,但是呢,电影院有vip房间,有普通房间
vip房间只供一人观看,普通房间是很多人在一起看!
看电影我们要买票,我们买一张票:本质不就是对资源的预定机制!
我们最担心的是超过资源个数的卖票!
int count = 16;
if(count>0)count--;else wait;
//购票
count++;
电影院:共享资源(临界资源)买票:申请信号量!票数:信号量的初始值!
申请信号量的本质:就是对公共资源的一种预定机制!
信号量也是共享资源,所以申请信号量流必须经过,申请信号量,访问共享内存,释放信号量
回过头来再看,电影院的vip房间,不就是对共享资源的整体使用,其实不就是资源只有一个吗?
那里面要么没人,要么就一个人,1 or 0 ,二元信号量,当里面有人时,其他人就不能进入,这其实是互斥!
普通房间:1.先买票 2.让执行流和资源进行一一对应(程序员编码实现)
信号量本质是一个计数器!!!
申请信号量,访问共享内存,释放信号量
int count = 16;
if(count>0)count--;else wait;
//购票
count++;
申请信号量代表对计数器-- 释放信号量代表对计数器++
-- 安全的操作,我们叫P操作 ++ 安全的操作,我们叫V操作
所以就有PV操作 --- 安全的 --- 原子性
我们可以用一个全局变量gcount=25来代表信号量吗?;不能!!!
1.全局变量不能被所有进程看到。
2.gcount++,不是原子的。
怎么可以让其他进程也能看到?
IPC信号量就来了!!!-> 和共享内存,消息队列一样,也必须先让,不同的进程看到同一个“计数器”!!!这意味着信号量也是一个公共资源,保护临界资源的安全,前提是不是,你自己得是安全的!!!
信号量操作接口
semget
key:与共享内存的key类似
nsems:运行用户一次申请多个信号量 -- 信号量集,用数组来维护
semctl
semop
使用上都与共享内存相仿!!!
信号量指令
ipcs -s
ipcrm -s semid