信号量.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
信号量

信号量 进程同步与互斥 在多任务操作系统环境下,多个进程会同时运行,并且一些进程之间可能存在一定的关联。 多个进程可能为了完成同一个任务会相互协作,这样形成进程之间的同步关系。 在不同进程之间,为了争夺有限的系统资源(硬件或软件资源)会进入竞争状态,这就是进程之间的互斥关系。 临界资源 进程之间的互斥与同步关系存在的根源在于临界资源。临界资源是在同一个时刻只允许有限个(通常只有一个)进程可以访问(读)或修改(写)的资源,通常包括硬件资源(处理器、内存、存储器以及其他外围设备等)和软件资源(共享代码段,共享结构和变量等)。访问临界资源的代码叫做临界区,临界区本身也会成为临界资源。 信号量 信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的基本操作。 其中信号量对应于某一种资源,取一个非负的整型值。 信号量值指的是当前可用的该资源的数量,若它等于0则意味着目前没有可用的资源。 信号量操作 P操作:如果有可用的资源(信号量值0),则占用一个资源(给信号量值减去一,进入临界区代码);如果没有可用的资源(信号量值等于0),则被阻塞到,直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。 V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个资源(给信号量值加一)。 Z操作:现代操作系统中,还有第三种操作,又称为测试操作。它的典型流程为:等待当前信号量取值为0,如果成立,进程返回,否则进程阻塞直到条件成立为止。 创建信号量 创建或获得已存在的信号量,可调用semget()函数。不同进程通过使用同一个信号量键值来获得同一个信号量。 所需头文件 #include sys/ipc.h #include sys/sem.h 函数原型 int semget(key_t key, int nsems, int semflg) 函数传入值 key:信号量的键值,多个进程可以通过它访问同一个信号量,其中有个特殊值IPC_PRIVATE。它用于创建当前进程的私有信号量 nsems:需要创建的信号量数目,通常取值为1 semflg:同open()函数的权限位,也可以用八进制表示法,其中使用IPC_CREAT标志创建新的信号量,即使该信号量已经存在(具有同一个键值的信号量已在系统中存在),也不会出错。如果同时使用IPC_EXCL标志可以创建一个新的唯一的信号量,此时如果该信号量已经存在,该函数会返回出错 函数返回值 成功:信号量标识符,在信号量的其他函数中都会使用该值 出错:-1 ftok函数 系统建立IPC通讯(如消息队列、共享内存)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 所需头文件 #include sys/ipc.h #include sys/types.h 函数原型 key_t ftok( char * fname, int id ) 函数传入值 fname:指定的文件名(该文件必须是存在而且可以访问的) id:子序号,虽然为int,但是只有8个比特被使用。 函数返回值 成功:生成的ID值 出错:-1 ftok函数注意 在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0 查询文件索引节点号的方法是: ls –i 当删除重建文件后,索引节点号由操作系统根据当时文件系统的使用情况分配,因此与原来不同,得到的索引节点号也不同。 如果要确保key_t值不变,要目确保ftok的文件不被删除,要么不用ftok,指定一个固定的key_t值 初始化信号量 初始化信号量,使用semctl()函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1。 semctl()中可能要用到semun联合体: union semun { int val; struct semid_ds *buf; unsigned short *array; }; semctl 所需头文件 #include sys/ipc.h #include sys/sem.h 函数原型 int semctl(int semid, int semnum, int cmd , union semun arg) 函数传入值 semid:semget()函数返回的信号量标识符 semnum:信号量编号,通常取值为0,就是使用单个信号量 cmd:对信号量的操作 IPC_STAT:获得该信

文档评论(0)

dart003 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档