进程间通信之信号量

本文介绍了Linux进程间通信中的信号量机制,详细阐述了信号量的概念、优缺点和工作原理。信号量作为控制进程对共享资源访问的工具,通过原子性的P和V操作实现资源的互斥和同步。文中还讲解了信号量相关的系统调用,包括semget、semctl和semop函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、进程间通信概述

一般情况下,系统中运行着大量的进程,而每个进程之间并不是相互独立的,有些进程之间经常需要互相传递消息。但是每个进程在系统中都有自己的地址空间,操作系统通过页表和实际物理内存所关联,不允许其他进程随意进入。因此,就必须有一种机制既能保证进程之间的通信,又能保证系统的安全,即进程间通信机制——IPCInter_Process Communication)。

Linux中的内存空间分为系统空间用户空间。在系统空间中,由于各个线程的地址空间都是共享的,即一个线程能够随意访问kernel中的任意地址,所以无需进程通信机制的保护。而在用户空间中,每个进程都有自己的地址空间,一个进程为了与其他进程通信,必须陷入到有足够权限访问其他进程空间的kernel中,从而与其他进程进行通信。在Linux中支持System V 进程通信的手段有三种:消息队列(Message queue)、信号量(Semaphore)、共享内存(Shared memory)。

2、背景知识

(1) 原子操作(atomic operation)

原子操作意为不可被中断的一个或一系列操作,也可以理解为就是一件事情要么做了,要么没做。而原子操作的实现,一般是依靠硬件来实现的。

(2) 同步与互斥
  • 同步:在访问资源的时候,以某种特定顺序的方式去访问资源
  • 互斥:一个资源每次只能被一个进程所访问。

    同步与互斥是保证在高效率运行的同时,可以正确运行。大部分情况下同步是在互斥的基础上进行的。

(3)临界资源

不同进程能够看到的一份公共的资源(如:打印机,磁带机等),且一次仅允许一个进程使用的资源称为临界资源。

(4)临界区

临界区是一段代码,在这段代码中进程将访问临界资源(例如:公用的设备或是存储器),当有进程进入临界区时,其他进程必须等待,有一些同步的机制必须在临界区段的进入点和离开点实现,确保这些共用资源被互斥所获得。

(5)相关命令
  • ipcs -s 显示已存在的信号量
  • ipcrm -s 删除指定信号量

    注意:有时候因为权限问题需要在root下查看与删除。

3、信号量

(1) 什么是信号量

信号量与管道、FIFO以及消息队列等IPC不同。它事一个计数器,用于为多个进程提供对共享数据对象的访问。通常描述临界资源当中,临界资源的数目,常常被当做锁(lock)来使用,防止一个进程访问另外一个进程正在使用的资源。信号量本身不具有数据交换的功能,而是控制其他资源来实现进程间通信,在此过程中负责数据操作操作的互斥、同步等功能。

简言之:信号量的主要目的是为了保护临界资源。

为了获得共享资源,进程需要执行以下操作:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值