Linux操作系统SYSV进程间通信.pptx
《Linux操作系统SYSV进程间通信.pptx》由会员分享,可在线阅读,更多相关《Linux操作系统SYSV进程间通信.pptx(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、10.610.6 SYS V SYS V 进程间通信进程间通信内容内容 信号量信号量 消息队列消息队列 共享内存共享内存10.6.1 10.6.1 三者共有的特性三者共有的特性IPCIPC资源资源 表示单独的消息队列、共享内存或是信号量集合 三者均有三者均有XXXgetXXXget()及()及XXXctlXXXctl()函数()函数 (XXXXXX代表代表msgmsg、semsem、shmshm三者之一)三者之一)(a a) XXXgetXXXget()函数()函数两个共同参数:key和oflag。key既可由ftok()函数产生,也可以是IPC_PRIVATE常量,key值是IPC资源的外部
2、表示。oflag包括读写权限,还可以包含IPC_CREATE和IPC_EXCL标志位。它们组合的效果如下:(1)指定key为IPC_PRIVATE保证创建一个唯一的IPC资源。(2)设置oflag参数的IPC_CREATE标志位但不设置IPC_EXCL。如果相应key的IPC资源不存在,则创建一个IPC资源,否则返回已存在的IPC资源。 (3)oflag参数的IPC_CREATE和IPC_EXCL同时设置。如果相应key的IPC资源不存在,则创建一个IPC资源。否则返回一个错误信息。(b b)XXXctlXXXctl()() 均提供IPC_SET、IPC_STAT和IPC_RMID命令。前两者
3、用来设置或得到IPC资源的状态信息,IPC_RMID用来释放IPC资源。 共同的操作模式共同的操作模式都是先通过XXXget()创建一个IPC资源,返回值是该IPCIPC资源资源IDID。在以后的操作中,均以IPC资源ID为参数以对相应的IPC资源进行操作。别的进程可以通过XXXget()取得已有的IPC资源ID(权限允许的话)到并对其操作,从而进程间通信成为可能。共同的数据结构 每一类IPC资源都有一个ipc_ids结构的全局变量用来描述同一类资源的公有数据,三个全局变量分别是semid_ds,msgid_ds和shmid_ds。struct ipc_ids int size; /* ent
4、ries数组的大小*/ int in_use; /* entries数组已使用的元素个数*/ int max_id; unsigned short seq; unsigned short seq_max; truct semaphore sem; /*控制对ipc_ids结构的访问*/ spinlock_t ary;/*自旋锁控制对数组entries的访问*/ struct ipc_id* entries;struct ipc_id struct kern_ipc_perm* p; 数组entries的每一项指向一个kern_ipc_perm结构,kern_ipc_perm结构表示每一个IPC
5、资源的属性,用来控制操作权限。struct kern_ipc_perm key_t key;/*用户提供的键值,为XXXget()所用*/ uid_t uid; /*创建者用户ID*/ gid_t gid; /*创建者组ID*/ uid_t cuid; /*所有者用户ID*/ gid_t cgid; /*所有者组ID*/ mode_t mode; /*操作权限,包括读、写等*/ unsigned long seq; ;因为每个IPC资源描述符的第一个成员就是kern_ipc_perm结构。因此,我们可以认为数组entries 的每一非空项均指向一个IPC资源。IPCIPC资源资源IDID与与e
6、ntriesentries数组下标的联系数组下标的联系(1)当创建一个IPC资源时,调用函数ipc_addid()从相应ipc_ids结构的entries数组中找出第一个未使用的项然后返回其下标index。返回IPC资源ID IPC资源ID SEQ_MULTIPLIER * seq + indexSEQ_MULTIPLIER是可用资源的最大数目,seq是ipc_ids结构中的seq。每当分配一个IPC资源时,ipc_ids结构中的seq就增一。(2)当知道IPC资源ID时,可通过 IPC资源ID SEQ_MULTIPLIER 得到其在entries数组中的index,从而找到相应的IPC资源。
7、(3)why 保证在一段时期内IPC资源ID的唯一性 10.6.210.6.2 信号量信号量信号量是具有整数值的对象,它支持P、V原语。进程可以利用信号量实现同步和互斥SYSV支持的信号量实质上是一个信号量集合,由多个单独的信号量组成。我们称SYSV信号量为信号量集合,而单个的信号量直接称为信号量。信号量集合在内核中用结构sem_array表示struct sem_array struct kern_ipc_permsem_perm; time_t sem_otime;/* 最近一次操作时间 */ time_t sem_ctime;/* 最近一次的改变时间 */ struct sem*sem_
8、base; /*指向第一个信号量 */ struct sem_queue *sem_pending;/* 挂起操作队列*/ struct sem_queue *sem_pending_last; struct sem_undo *undo; unsigned long sem_nsems;/*信号量的个数*/;信号量集合中的每一个信号用结构sem表示, struct sem intsemval;/* 信号量的当前值 */intsempid;/* 最近对信号量操作进程的pid */ ;信号量的初始值可以调用函数semctl()进行设置。用户可以调用函数semop()对信号量集合中的一个或多个信号
9、量进行操作。每一个操作每一个操作都是sembuf结构变量 struct sembuf unsigned short sem_num;/*在sem_base 数组中的下标*/ short sem_op; short sem_flg;int semop(int semid, struct sembuf *opsptr, size_t nops); semid : IPC资源ID opsptr: 操作的集合 nops: 数组opsptr的大小内核必须保证操作数组opsptr原子地执行sem_number指明是对哪一个信号操作。sem_flag指明一些操作标志位,可以有如下值: (1)SEM_UNDO
10、 当进程结束但还拥有信号量资源时,应将信号量资源返还给相应的信 号量集合。内核有一个sem_undo结构用于跟踪这方面的情况,进程描述符有个semundo成员记录进程这方面的信息。(2)IPC_NOWAIT 当操作不能立即完成时,IPC_NOWAIT被设置的话进程立即返回 否则进程进入睡眠状态等待时机成熟时被唤醒完成该操作。sem_op指定具体的操作,它的值有如下含义:(1)大于0,则将该值加到信号量的当前值上。(2)等于0,那么用户希望信号量的当前值变为0。如果值已经是0,则立即返回。如果不是0,则取决于IPC_NOWAIT是否被设置。(3)小于0,则要看信号量的当前值是否大于等于sem_o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 操作系统 SYSV 进程 通信
限制150内