Linux进程间通信(六) 信号量通信之semget()

信号量通信之semget()、semctl()、semop()及其基础实验

这个信号量理解起来是有点不容易啊,我看书看了好几遍才知道怎么回事。在讲这一节信号量之前,我还 是想先说几个小知识点,这也是我在学习完后最终理解的“精华”,哈哈!

信号量是干啥的?

信号量就是用来解决进程间的同步与互斥问题的一种进程间通信机制。

同步与互斥的通俗理解

这两个名词咱们从字面上就能理解。举个例子吧,在创建子进程时,你是怎么保证父子进程执行的先后顺序呢 ?我在以前的时候是通过sleep()函数来实现的,比如我想让子进程先运行再让父进程运行,那么我就在父进 程的程序中加一个sleep()函数,让父进程先睡眠,这样子就能先执行子进程了。有的时候咱们事先无法知道 父进程和子进程哪一个先执行,但是要向我那样使用sleep()函数,只能保证先执行子进程,但是不能保证子 进程执行完后再执行父进程,这样说能理解吧。所以如果我们想要子进程完全执行完后再执行父进程,就可以 利用信号量来解决它们之间的同步问题。还不理解也没关系,我会在后面的实验中再结合实际讲。再举个更通 俗的例子,一条食品生产线上,假设A、B共同完成一个食品的包装任务,A负责将食品放到盒子里,B和C负责 将盒子打包。必须得是A先装食品B再打包吧,要是B不按规则先打包,那A还装啥,所以就需要一种机制方法保 证A先进行B再进行,“信号量”就是这种机制方法,AB之间的关系就是同步关系;再假设打包要用到刀子,而 车间就有一把刀子,这时候B和C就构成了互斥关系。

信号量与信号的区别

不瞒你说,我刚开始 学的时候所理解的就是“信号量是很多个信号”,当然这是错误的哈!光从英语上看就不一样:信号量是 Semaphore,而信号是 Signal 。其实,信号和信号量是不同的。它们虽然都可以实现同步和互斥,但是前者 是使用信号处理器来进行的,而后者是使用P,V操作来实现的。(PV操作后边有讲)

好了,进入正题。

信号量概述

在多任务操作系统环境下,多个进程会同时运行,并且一些进程间可能会存在一定 的关联。多个进程可能为了完成同一个任务相互协作,这就形成了进程间的同步关系。而且在不同进程间,为 了争夺有限的系统资源(硬件或软件资源)会进入竞争状态,这就是进程间的互斥关系。

进程间的互 斥关系与同步关系存在的根源在于临界资源。临界资源是在同一时刻只允许有限个(通常只有一个)进程可以 访问(读)或修改(写)的资源,通常包括硬件资源(处理器、内存、存储器及其它外围设备等)和软件资源 (共享代码段、共享结构和变量等)。访问临界资源的代码叫做临界区,临界区本身也会称为临界资源。

信号量是用来解决进程间的同步与互斥问题的一种进程间通信机制,包括一个称为信号量的变量和在 该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(P/V操作)。其中,信号量对应于 某一种资源,取一个非负的整形值。信号量值(常用sem_id表示)指的是当前可用的该资源的数量,若等于0 则意味着目前没有可用的资源。

PV原子操作(很重要的)

PV原子操作的具体定义如下:(好好 理解,很重要的啊)

●  P操作:如果有可用的资源(信号量值>0),则此操作所在的进程占 用一个资源(此时信号量值减1,进入临界区代码);如果没有可用的资源(信号量值=0),则此操作所在的进程 被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。

●  V操作 :如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个 资源(即信号量值加1)。

常见的使用信号量访问临界区的伪代码如下图1:

图1中的非临界 区和临界区在咱们这里就是代码,具体这张图的理解还要结合着后面的实验才能理解。

最简单的信号 量只能取0和1值,这种信号量叫做二维信号量,在本节中,主要讨论二维信号量。二维信号量学好了,比较容 易扩展到使用多维信号量的情况。

时间: 2024-09-16 17:00:44

Linux进程间通信(六) 信号量通信之semget()的相关文章

Linux进程间通信——使用信号量

这篇文章将讲述别一种进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解.   一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界

Linux进程间通信(二) 管道通信之无名管道及其基础实验

管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输 入(其实我更愿意将管道比喻为农村浇地的管子).Linux的管道主要包括两种:无名管道和有名管道.这一节 主要讲无名管道,首先介绍一下这两个管道.(特点很重要啊!) 1.无名管道 无名管道是 Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点: ①  它只能用于具有亲 缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间): ②  它是一个半双工的通信模 式,具有固定的读端和写端: ③

Linux进程间通信(三) 管道通信之有名管道及其基础实验

有名管道(FIFO) 首先将上一节的有关有名管道的定义再贴出来 有名管道是对无名管道的一 种改进,它具有以下特点: ①  它可以使互不相关的两个进程间实现彼此通信: ②  该管道可以通过路径名来指出,并且在文件系统中是可见的.在建立了管道之后,两个进程就可以把它 当做普通文件一样进行读写操作,使用非常方便: ③  FIFO严格地遵循先进先出规则,对管道及 FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作 . 有名管道的创建可以使用函数

Linux进程间通信学习:如何使用共享内存

下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样.而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 特别提醒:共

Linux进程间通信学习:如何使用信号量

这篇文章将讲述别一种进程间通信的机制--信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信--使用信号.下面就进入信号量的讲解. 一.什么是信号量 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临界区域是指执行数据更新的代码需要独占式地执行.而信号量就可以提供这样的一种访问机制,让一个临界区同

Linux进程间通信学习:如何使用消息队列

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信--使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息

Linux进程间通信(一) 进程间通信概述及其种类

为什么会有进程间通信? 我们应该都知道了,进程是一个程序的一次执行,是系统资源分配的最 小单元.这里所说的进程一般是指运行在用户态的进程,而由于处于用户态的不同进程间是彼此隔离的,但是 它们很可能需要相互发送一些信息,好让对方知道自己的进度等情况,像这样进程间传递信息就叫进程间通信 . 进程间通信方式有几种? 就像处于不同城市的人之间的通信方式有手机.电脑等方式一样, 进程间通信的方式有几种,就用下面的图来表示把,这样直观,并且我一直相信这时一个知识点,必须记下来 ! 管道(Pipe)及有名管道

Linux进程间通信——使用匿名管道

在前面,介绍了一种进程间的通信方式:使用信号,我们创建通知事件,并通过它引起响应,但传递的信息只是一个信号值.这里将介绍另一种进程间通信的方式--匿名管道,通过它进程间可以交换更多有用的数据.   一.什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管理的真正定义是什么呢?管道是一个进程连接数据流到另一个进程的通道,它通常是用作把一个进程的输出通过管道连接到另一个进程的输入.   举个例子,在shell中输入

Linux进程间通信——使用命名管道

在前一篇文章--Linux进程间通信--使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程之间交换数据带来了不方便.这里将会介绍进程的另一种通信方式--命名管道,来解决不相关进程间的通信问题.   一.什么是命名管道 命名管道也被称为FIFO文件,它是一种特殊类型的文件,它在文件系统中以文件名的形式存在,但是它的行为却和之前所讲的没有名字的管道(匿名管道)类似.   由于Linux中所有