CH09 信号量、共享内存和消息队列.ppt

  1. 1、本文档共56页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
CH09 信号量、共享内存和消息队列

第9章 信号量、共享内存 和消息队列 System V IPC 3种IPC机制: 信号量(semaphore set),用于管理对资源的访问。 消息队列(message queue),程序之间传递数据的一种简单方法。 共享内存(shared memory),用于在程序之间高效的共享数据 shell命令 ipcs, ipcrm访问 System V IPC的共同特征 标识符与关键字 引用IPC对象:标识符 创建IPC对象时指定关键字(key_t key;) key的选择:预定义常数,IPC_PRIVATE;ftok函数 内核将关键字转换成标识符 许可权结构 和文件类比 struct ipc_perm struct ipc_perm struct ipc_perm { u i d _ t u i d ; /* owners effective user id */ g i d _ t g i d ; /* owners effective group id */ u i d _ t cuid; /* creators effective user id */ g i d _ t c g i d ; /* creators effective group id */ m o d e _ t mode; /* access modes */ u l o n g s e q ; /* slot usage sequence number */ k e y _ t key; /* key */ } SV IPC 系统调用 信号量 并发程序设计 互斥和同步 PV操作(原语) PV操作和信号量 procedure p(var s:samephore){ s.value=s.value-1; if (s.value0) sleep(s.queue); } procedure v(var s:samephore){ s.value=s.value+1; if (s.value=0) wakeup(s.queue); } 一个理论性的例子 内核中与信号量有关的数据结构 semaphore set struct semid_ds { struct ipc_perm sem_perm; struct sem *sem_base; /* 指向信号量集合的指针 */ time_t sem_otime; /* 最后一次操作的时间 */ time_t sem_ctime; /* 最后一次改变此结构的时间 */ unsigned short sem_nsems; /* 集合中信号量个数*/ } Linux/UNIX的信号量机制 struct sem { pid_t sempid; /* 最后操作该信号量的进程ID */ unsigned short semncnt ; /* 等待对该信号量执行P 操作的进程数 */ unsigned short semzcnt; /* 等待semval为0的进程数 */ unsigned short semval; /* 信号量当前值 */ } 信号量系统调用 #include sys/types.h #include sys/ipc.h #include sys/sem.h int semget(key_t key, int nsems, int semflg); int semop(int semid, struct sembuf *sops, unsigned nsops); int semctl(int semid, int semnum, int cmd, ...); semget函数 功能:创建一个新信号量或取得一个已有信号量的 标志符。 函数原型为 int semget(key_t key, int nsems, int semflg); “key” 参数 预定义常数IPC_PRIVATE; 约定的关键字 ftok函数 “semflg” 参数 设置访问权限(低9位) IPC_CREAT, IPC_EXCL 按位或 “nsems” 指定需要的信号量数目,几乎总是取值为1。 semget函数(续) sem_id = semget((key_t)1234, 1, 0666 | IPC_CREAT); semop函数 功能:改变信号量的值 函数原型为 int semop(int semid, struct sembuf *sops, size_t nsops); “sops” 参数 st

文档评论(0)

yan698698 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档