内核资料收集
1. IPC信号量
IPC信号量是一个计数器,用来这多个进程共享的数据结构提供受控访问.
如果受保护的资源是可用的, 那么信号量的值就是正数; 如果受保护的资源现在不可用,那么信号量的值就是0, 要访问资源的进程
试图把信号量的值减1, 但是内核阻塞这个进程,直到在这个信号量上的操作产生一个正值. 当进程释放受保护的资源时, 就把信号
量的值增加1; 在这样处理的过程中,其他所有正在等待这个信号的进程就都被唤醒.
2. IPC信号量比内核信号量的处理更复杂, 原因如下:
a. IPC信号量都是一个或者多个信号量值的集合,而不像内核信号量一样只有一个值. 这意味着同一个IPC资源可以保护多个独立/共
享的数据结构. 在资源正被分配的过程中,必须把每个IPC信号量中的信号的个数指定为semget()函数的一个参数. IPC信号量资源的
个数和单个IPC资源内原始信号量的个数都有界限, 基缺省值前者为128, 后者为250; 不过,系统管理员可以通过/proc/sys/kernel/sem文
件很容易修改这两个界限.
b. System V IPC信号量提供了一种失效安全机制,这是用于进程不能取消以前信号量执行的操作就死亡的情况的情况的. 当进程选
择使用这种机制时,由此引起的操作就是所谓的可取消的(undoable)信号量操作. 当进程死亡时,所有IPC信号量都可以恢复成原来的值,
就好像从来都没有开始它的操作. 这有助于防止出现这种情况: 正在结束的进程不能手工取消它的信号量操作,其它使用相同信号量
的进程无限地停留在阻塞状态.
3. 进程访问IPC信号量所保护的一个或多个资源时所执行的典型步骤:
a. 调用semget()封装函数获得IPC信号量标识符,作为参数指定对共享资源进行保护的IPC信号量的IPC关键字. 如果进程希望创建
一个新的IPC信号量,则还要指定IPC_CREATE或IPC_PRIVATE标志以及所需要的原始信号量
b. 调用semop()封装函数来测试并递减所有原始信号量所涉及的值. 如果所有的测试全部成功, 就执行递减操作,结束函数并允许
这个进程访问受保护的资源.如果有些信号量正在使用,那么进程通常会被挂起,直到某个其它进程释放这个资源为止.函数接收的参数
为:IPC信号量标识符, 用来指定对原始信号量所进行的原子操作的一组整数以及这种操作的个数. 作为选项,进程也可以指定
SEM_UNDO标志,这个标志通知内核:如果进程没有释放原始信号量就退出,那么撤消那些操作.
c. 当放弃受保护的资源时,就再次调用semop()函数来原子地增加所有有关的原始信号量.
d. 作为选择,调用semctl()封装函数, 在参数中指定IPC_RMID命令把这个IPC信号量从系统中删除.
4. 内核实现IPC信号量的数据结构如下:
...待补充...
sem_ids变量存放信号量资源类型的ipc_ids数据结构;对应的ipc_id_ary数据结构包含一个指针数组,它指向sem_array数据结构,每个
元素对应一个IPC信号量.
...待补充...
5. 可取消的信号量操作
...待补充...
6. 挂起请求队列
...待补充...
阅读(729) | 评论(0) | 转发(0) |