《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列
信号量:用于管理对资源的访问;
共享内存:用于在程序之间高效的共享数据;
消息队列:在程序之间传递数据的一种简单方法;
一、信号量
临界代码:需要确保只有一个进程或者一个执行线程可以进入这个临界代码并拥有对资源独占式的访问权。
临界区:真正执行数据更新的代码需要独占式的执行,它们被称为临界区域;它们通常只在一个大型程序中占据一小段的代码。
信号量是一个特殊的变量,它只取正整数值,并且程序对其访问都是原子操作;只允许对它进行等待和发送信号这两种操作。
在Linux编程中,等待和发送信号都已具有特殊含义,所以用原先定义的符号来表示这种操作:
P:信号量变量:用于等待;
V:信号量变量:用于发送信号;
1、信号量的定义:
最简单的信号量是只能取值0和1的变量,即二进制的信号量,这也是信号量最常见的一种形式。可以取多个正整数值的信号量被称为通用信号量。
PV操作的定义非常简单,假设有一个信号量变量sv
| P(sv) | 如果sv的值大于0,就给她减1;如果它的值等于0,就挂起该进程的执行 |
| V(sv) | 如果有其他进程因等待sv而被挂起,就让它恢复运行;如果没有进程因等待sv而被挂起,就给它加1 |
即:当临界区域可用时,信号量变量sv的值是true,然后P(sv)操作将它减1使它变为false以表示临界区正在被使用;当进程离开临界区域时,使用V(sv)操作将它加1,使临界区域再次变为可用;
如果两个进程共享信号量变量sv:
伪代码对两个进程都是相同的:
semaphore sv = 1;
loop forever
{
P(sv);
critical code section;
V(sv);
noncritical code section;
}
二、Linux的信号量机制
信号量函数:
#include <sys/sem.h>
int semctl(int sem_id,int sem_num,int command,.......);
int semget(key_t key,int num_sems,int sem_flags);
int semop(int sem_id,struct sembuf *sem_ops,size_t num_sem_ops);
参数key的作用很像一个文件名,它代表程序可能要使用的某个资源,如果多个程序使用key值,它负责协调工作;
由semget函数返回并用在其他共享内存函数中的标识符也与fopen返回的FILE*文件流很相似,进程需要通过它来返回共享文件;
不同的进程可以用不同的信号量标识符来指向同一个信号量。
1、int semget(key_t key,int num_sems,int sem_flags)
作用:
创建一个新信号量或取得一个已有信号量的键。
参数:
第一个参数key:整数值,不相关的进程可以通过它访问同一个信号量;程序对所有信号量的访问都是间接的,它先提供一个键,再由系统生成一个相应的信号量标识符。只有semget函数才直接使用信号量键,所有其他的信号量函数都是使用由semget函数返回的信号量标识符。
在创建新的信号量时,你需要给键提供一个唯一的非零整数。
num_sems:指定需要的信号量数目,它总是取值为1;
sem_flags:一组标志;它低端的9个比特是该信号量的权限,其作用类似于文件的访问权限;
返回值:
成功返回一个非零正数值,就是其他信号量函数将用到的信号量标识符。如果失败,则返回-1;
2、int semop(int sem_id,sruct sembuf *sem_ops,size_t num_sem_ops)
作用:
用于改变一个信号量的值
参数:
sem_id是由semget()函数返回的信号量标识符。
sem_ops是指向一个结构数组的指针,每个数组元素至少包含以下几个成员:
struct sembuf
{
short sem_num;信号量编号,除非你要使用一组信号量,否则它一般取值为0
short sem_op;信号量在一次操作需要增加或者减少的值,通常分为+1和-1,+1:p操作,表示等待信号量变为可用;-1:v操作,表示信号量已可用
short sem_flg;通常被设置为SEM_UNDO:操作系统跟踪当前信号量,如果进程退出前没有释放信号量,操作系统负责释放该信号量
};
num_sem_ops:指出将要进行操作的信号的个数。
返回值:
成功返回0;失败返回-1
《linux程序设计》--读书笔记--第十四章信号量、共享内存和消息队列的更多相关文章
- C primer plus 读书笔记第十四章
这一章主要介绍C语言的结构和其他数据形式,是学习算法和数据结构的重点. 1.示例代码 /*book.c -- 仅包含一本书的图书目录*/ #include <stdio.h> #defin ...
- JavaScript高级程序设计学习笔记第十四章--表单
1.在 HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型. HTMLFormElement 继承了 HT ...
- 《Linux内核设计与实现》读书笔记(十四)- 块I/O层
最近太忙,居然过了2个月才更新第十四章.... 主要内容: 块设备简介 内核访问块设备的方法 内核I/O调度程序 1. 块设备简介 I/O设备主要有2类: 字符设备:只能顺序读写设备中的内容,比如 串 ...
- 《Android源代码设计模式解析与实战》读书笔记(十四)
第十四章.迭代器模式 迭代器模式,又叫做游标模式.是行为型设计模式之中的一个.我们知道对容器对象的訪问必定会涉及遍历算法.我们能够将遍历的方法封装在容器中,或者不提供遍历方法,让使用容器的人自己去实现 ...
- Linux内核分析 读书笔记 (第四章)
第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限 ...
- 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程
接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...
- 《深入理解java虚拟机》读书笔记三——第四章
第四章 虚拟机性能监控与故障处理工具 1.JDK命令行工具 jps命令: 作用:列出正在运行的虚拟机进程. 格式:jps [option] [hostid] 选项:-q 只输出LVMID(Local ...
- 05 技术内幕 T-SQL 查询读书笔记(第四章)
第四章 子查询:在外部查询内嵌套的内部查询(按照期望值的数量分为,标量子查询 scalar subqueries,多值子查询multivalued subqueries)(按照子查询对外部查询的依赖性 ...
- 20135239 益西拉姆 linux内核分析 读书笔记之第四章
chapter 4 进程调度 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 多任务系统可以划分为两类: - 非抢占式多任务: - 进程会一直执行直到自己主动停止运行(这一 ...
随机推荐
- PHP源代码分析(第一章):Zend HashTable详解【转】
转载于http://www.phppan.com/2009/12/zend-hashtable/ 在PHP的Zend引擎中,有一个数据结构非常重要,它无处不在,是PHP数据存储的核心,各种常量.变量. ...
- Js处理数据——前端分页工具
这几天有小伙伴讨论起了分页的相关问题,这里我也简单讲下前端如何简单便捷的利用Js(库)写出优雅,好用的分页工具. 分页是个很简单又超多接触的技术点,粗略来讲分如下两种: 真分页--每次根据页码.页大小 ...
- 对指定文件生成数字摘要的MD5工具类
md5特点:压缩性.不可逆性,经常用于传值过程中的值加密或文件加密static char hexdigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', ...
- 【转载】TCP保活(TCP keepalive)
下图是我遇到tcp keepalive的例子: 以下为转载: TCP保活的缘起 双方建立交互的连接,但是并不是一直存在数据交互,有些连接会在数据交互完毕后,主动释放连接,而有些不会,那么在长时间无数据 ...
- C语言程序设计做题笔记之C语言基础知识(上)
C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...
- bootstrap table 服务器端分页例子分享
这篇文章主要介绍了bootstrap table 服务器端分页例子分享,需要的朋友可以参考下 1,前台引入所需的js 可以从官网上下载 复制代码代码如下: function getTab(){var ...
- NOIP 2011 提高组 计算系数
有二项式定理 `\left( a+b\right) ^{n}=\sum _{r=0}^{n}\left( \begin{matrix} n\\ r\end{matrix} \right) a^{n-r ...
- 李洪强iOS开发之-环信02.1_环信 SDK 2.x到3.0升级文档
李洪强iOS开发之-环信02.1_环信 SDK 2.x到3.0升级文档 SDK 2.x 至 3.0 升级指南 环信 SDK 3.0 升级文档 3.0 中的核心类为 EMClient 类,通过 EMCl ...
- OA学习笔记-007-Dao层设计
一. User, UserDao save(User user), update(), delete(), find(), ...Role, RoleDao save(Role role), upda ...
- PorterDuff及Xfermode初识
图像合成,是将两幅退昂放在一起的动作,它使得我们能够同时看到两幅图像的特征. 我们可以首先在Canvas对象上绘制一个位图对象,然后再相同的Canvas对象上绘制第二个位图对象的方式来实现合成.不过这 ...