@TOC 这两部分主要是了解即可,为后面学习做铺垫
为了让两个进程间通信 创建一个队列queue
进程A可以通过消息队列的系统调用接口,把自己的数据块链入队列中 进程B也可以把自己的数据块链入队列中 这个队列就是一种共享资源
进程A想要读取数据时,只需要在队列中读取不是自己的数据
创建消息队列 , 输入 man msgget
指令
key值含义与msgflg选项 不懂具体可以看 :system v 共享内存 返回值为消息队列的标识符
操作系统要把多种消息队列管理起来,先描述在组织,每一个消息队列都有自己的结构体对象,对应的结构体对象包含当前消息队列的属性
输入 ipcs -q
指令
删除消息队列 ipcs -q msqid值
即可删除
把大家都能看到的资源称为公共资源 1. 互斥:在任何时刻,都只允许一个执行流在进行共享资源的访问 2.临界资源 把任何一个时刻,只允许一个执行流在进行访问的共享资源,叫做临界资源 3. 临界区临界资源是要通过代码访问的,凡是访问临界资源的代码叫做临界区 4. 原子性 进行某些计算机操作时,要么不做要么就做完,只有两种确定状态的属性 不关心中间状态,只要求结果
通过一个故事来进行理解 想要去放映厅A看电影,这个放映厅是对所有人都共享的 但是每个人都是有自己的座位的,不能随便找个地方就坐
进放映厅是都需要买票的,买票的本质是: 1.对座位资源的预订机制 (买票的时候座位就已经属于你了) 2.确报不会因为多放出去特定的座位资源,而导致冲突 (不可能出现买票的人比座位多的情况发生)
每一个人可以看作一个执行流,当想访问某一个内存空间时,通过买票预订机制就不会出现访问空间出现冲突
如果放映厅是顶级VIP级别,只有一个座位 ,当这个座位对应的票被预订了,其他人就不会预定了,所以看电影期间,不会有人打扰,就相当于完成互斥功能
信号量又称为信号灯 本质是一个计数器 即描述资源数量的计数器 假设为count 任何一个执行流,想访问临界资源的一个资源时,不能直接访问 如想看电影就直接冲入放映厅里随便找个座位,不管谁叫都不起来,不可以这样做的
必须先申请信号量资源,count 作为资源数量就会减1 即count-- 只要申请信号量成功, 就一定能拿到一个子资源
进入自己的临界区,访问自己的临界资源 离开就要释放信号量资源,即count++ ,只要计数器进行了增加,就表示对应的资源进行了归还
进入临界区前申请信号量(P操作),退出临界区前释放信号量(V操作)
进程通过执行代码来申请,必须遵循规则,都必须先申请信号量,再释放信号量 遵循规则的前提是:所有的进程都得看到信号量 这样信号量本身就变成共享资源,这就需要信号量保证自身++或- -操作是原子的(要么就不加,要么就加完了),来保证自身安全
获取信号量 输入 man semget
指令
key值与semflg选项可以去上面去寻找对应链接 nsems代表信号量数 返回的是信号量的计数器
ipcs -s
查看信号量
ipcrm -s +信号量id
删除信号量