进程间同步互斥

上传人:wt****50 文档编号:53354085 上传时间:2018-08-29 格式:PPT 页数:19 大小:608.50KB
返回 下载 相关 举报
进程间同步互斥_第1页
第1页 / 共19页
进程间同步互斥_第2页
第2页 / 共19页
进程间同步互斥_第3页
第3页 / 共19页
进程间同步互斥_第4页
第4页 / 共19页
进程间同步互斥_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《进程间同步互斥》由会员分享,可在线阅读,更多相关《进程间同步互斥(19页珍藏版)》请在金锄头文库上搜索。

1、Linux进程间同步互斥,同步与互斥,互斥:并发执行的进程共享某些类临界资源,对临界资源的访问应当采取互斥的机制。同步:并发执行的进程间通常存在相互制约的关系,进程必须遵循一定的规则来执行,同步机制可以协调相互制约的关系。,PV原语,PV原语通过操作信号量来处理进程间的同步与互斥的问题。其核心就是一段不可分割不可中断的程序。 P原语:P是荷兰语Proberen(测试)的首字母。为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。 V原语:V是荷兰语Verhogen(增加)的首字母。为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。,PV

2、原语的操作,P原语:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞;V原语:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。,Linux 中的信号量,信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量。linux 中的信号量是一个整数 大于或等于0 时代表可供并发进程使用的资源实体数; 小于0 时代表正在等待使用临界区的进程数; 用于互斥的信号量初始值应大于0,即空闲资源总数; 由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原

3、语)来访问;,信号量元素组成:,1、表示信号量元素的值; 2、最后操作信号量元素的进程ID; 3、等待信号量元素值+1 的进程数; 4、等待信号量元素值为0 的进程数;,Linux 中的信号量的主要函数,(1)创建信号量 int semget(key_t key,int nSemes,int flag) (2)控制信号量 semctl(int semid,int semnum,int cmd, /*union senum arg */) (3)对信号量 +1 或 -1 或测试是否为0 int semop(int semid,struct sembuf *sops, unsigned short

4、 nsops ),(1)创建信号量,int semget( key_t key,/标识信号量的关键字 int nSemes,/信号量集中元素个数 int flag/IPC_CREAT;IPC_EXCL 只有在信号量集不存在时创建 )作用:创建一个新的信号量或取得一个已有信号量的键 成功:返回信号量句柄 失败:返回-1,(2)控制信号量,semctl( int semid,/信号量集的句柄 int semnum,/信号量集的元素数 int cmd,/命令 /*union senum arg */./ )允许我们直接控制信号量 成功:返回相应的值 失败:返回-1,命令cmd 参数详细说明:,IPC

5、_RMID 删除一个信号量 IPC_EXCL 只有在信号量集不存在时创建 IPC_SET 设置信号量的许可权 SETVAL 设置指定信号量的元素的值为 agc.val GETVAL 获得一个指定信号量的值 GETPID 获得最后操纵此元素的最后进程ID GETNCNT 获得等待元素变为1 的进程数 GETZCNT 获得等待元素变为0 的进程数,(3)对信号量 +1 或 -1 或测试是否为0,int semop( int semid, struct sembuf *sops, /指向元素操作数组 unsigned short nsops /数组中元素操作的个数 )改变信号量的值,struct s

6、embuf short sem_num; short sem_op; short sem_flg; 第一个参数:信号量编号,一般为0 第二个参数:信号量在一次操作中需要改变的数值,通常会用到两个值,一个是-1,也就是P操作,它等待信号量变为可用;一个是+1,也就是V操作 第三个参数:通常被职位SEM_UNDO。将使得系统跟踪当前进程对这个信号量的修改情况,代表问题,生产者消费者问题:把并发进程的同步互斥问题一般化,得到一个模型,即生产者-消费者问题。把计算系统中使用某一类资源的进程称为该资源的消费者,而把释放同类资源的进程称为该资源的生产者。,生产者-消费者问题,长度为n的缓冲区(n0),一群

7、生产者P1, P2, Pm和一群消费者C1, C2, Ck,生产者、消费者进程,producer(生产者进程): Item_Type item; while (true) p(empty); p(mutex); 送数据如缓冲区某单元 v(mutex); v(full); ,consumer(消费者进程): Item_Type item; while (true) p(full); p(mutex); 取缓存区中某单元数据v(mutex); v(empty); ,实验内容,编程使用 Linux 中的信号量完成操作系统中的生产者消费者问题:本程序有一个生产者进程,有两个消费者进程。生产者产生1-2

8、0 的20 个数。两个消费者从共享内存中取数。,mmap,功能:将一个文件或者其它对象映射进内存。 用法: #include void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);,mmap()参数,start:映射区的开始地址。 length:映射区的长度。 prot:期望的内存保护标志,不能与文件的打开模式冲突。是书上的某个值,可以通过or运算合理地组合在一起 flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个位的组合体 fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为-1。 offset:被映射对象内容的起点。,作业,增加一个生产者,即两个生产者,两个消费者,怎么协调。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号