Linux -- 进程间通信之信号量
基本概念简述
多个线程同时访问一个共享数据,很可能造成恶劣的后果;为了保证数据访问资源的正确性和安全性,需要对线程进行"同步"
(Linux下所有的执行实体都称为任务(task),每个任务类似于单线程的进程,共享了同一个内存空间的多个任务构成了一个进程)
- 同步
指在一个线程对数据访问未结束的时候,其他线程不得访问同一个数据,将对数据的访问原子化
- 原子操作
不可分割,不会被线程调度打断的操作
(一个程序在运行的过程中可能被优先级更高的线程中断,而有些操作是不可中断的,不然会出现无法还原的后果,这时候操作系统就需要原子操作)
线程同步
同步最常用的方式"锁",每一个线程访问数据或资源前首先要获取锁,并在访问结束后释放锁;在锁被占用时试图获取锁,线程会进入等待,直到锁重新可用
二元信号量是最简单的一种锁,适合被一个线程独占访问的资源。它只有两种状态,占用和非占用;当一个线程获取锁后,其他线程试图获取锁将进入等待,直到该锁被释放。
互斥量类似于二元信号量,资源同时只允许一个线程访问,不同的是信号量在整个系统中允许任何线程获取并释放,即信号量可以被系统中一个线程获取,然后由另一个线程释放它;而互斥锁要求哪个线程获取互斥量,这个线程就要负责释放这个锁,其他线程释放该互斥量是无效的
- 临界资源
一次仅允许一个进程访问的资源称为临界资源,通常用互斥量控制临界资源的访问

P(测试)/ V(增加)操作
对于允许多个线程并发访问的锁成为多元信号量,简称信号量,一个初始值为N的信号量允许N个线程同时访问,线程访问资源首先获取信号量,进行如下操作(P):
- 将信号量的值减 1
- 如果信号量的值小于 0,则进入等待
访问完资源后,线程释放信号量,进行如下操作(V):
- 将信号量的值加 1
- 如果信号量的值小于 1,唤醒一个等待中的线程

Linux -- 进程间通信之信号量的更多相关文章
- Linux进程间通信——使用信号量
这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...
- Linux进程间通信--使用信号量【转】
本文转载自:http://blog.csdn.net/ljianhui/article/details/10243617 这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号 ...
- Linux进程间通信——使用信号量(转)
这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物.有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号.下面 ...
- Linux进程间通信:管道,信号量,消息队列,信号,共享内存,套接字
Linux下的进程通信手段基本上是从UNIX平台上的进程通信手段继承而来的.而对UNIX发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间 ...
- Linux进程间通信——使用信号量【转】
本文转载自:http://blog.csdn.net/ljianhui/article/details/10243617 这篇文章将讲述别一种进程间通信的机制——信号量.注意请不要把它与之前所说的信号 ...
- Linux进程间通信之信号量
春节过去了,真的过去一年了.在公司待了快一年了.2016希望自己变得越来越好. ps:上面那句话是年前写的,中间隔了那么久,自己也变懒了. 一.信号量 1,信号量本质是一个计数器,控制访问共享资源的最 ...
- Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()
下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...
- Linux进程间通信——使用共享内存
一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进程之间共享的内存通常安排为同一段物理内存. ...
- Linux多线程--使用信号量同步线程【转】
本文转载自:http://blog.csdn.net/ljianhui/article/details/10813469 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过 ...
随机推荐
- spring cloud Ribbon的使用和实现原理
转载链接:https://blog.csdn.net/qq_20597727/article/details/82860521 简介 这篇文章主要介绍一下ribbon在程序中的基本使用,在这里是单独拿 ...
- ES6对象简洁语法
对象(object)是 JavaScript 最重要的数据结构.ES6 对它进行了重大升级,本章介绍数据结构本身的改变及语法应用细节. 1.属性的简洁表示法 ◆ ES6 允许直接写入变量和函数,作为对 ...
- Java编程思想——第17章 容器深入研究(two)
六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add ...
- Appium的加载过程
appium运行流程 Appium的加载过程如上图. 1)调用Android adb完成基本的系统操作: 2)向Android上部署bootstrap.jar: 3)Bootstrap.jar For ...
- Python 中 -m 的典型用法、原理解析与发展演变
在命令行中使用 Python 时,它可以接收大约 20 个选项(option),语法格式如下: python [-bBdEhiIOqsSuvVWx?] [-c command | -m module- ...
- 石头剪刀步(rps):dp,概率&期望
既然已经给std了,直接扔代码啦.代码注释还是不错哒. 因为我也有点懵,不明白的或有不同见解的一定要在评论区喷我啊! #include<bits/stdc++.h> using names ...
- 卡特兰数&&prufer序列&&BSGS水题集
首先说一下BSGS的一个坑点: 解方程A^x≡B(mod p) 需要特判一个东西=>A%p==B%p==0? 如果相等的话puts("1")反之则无解. 因为如果A%p=0, ...
- NOIp2017 列队(线段树)
嘛..两年前的题目了,想起第一次参加提高组还骗了一个省二回来呢...跟同学吹了好久的... 离退役又近了一骗博客啊.. 闲聊结束. 照常化简:给定一个1-n*m编号的矩阵,每次删除一个位置,然后左边向 ...
- CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths——dsu on tree
题目描述 一棵根为1 的树,每条边上有一个字符(a-v共22种). 一条简单路径被称为Dokhtar-kosh当且仅当路径上的字符经过重新排序后可以变成一个回文串. 求每个子树中最长的Dokhtar- ...
- apache+php+mysql搭建php环境
1.首先准备解压包:zend-loader-php5.6-windows-x86_update1(nts版).php-5.6.37-nts-Win32-VC11-x86.mysql-5.5.19-wi ...