信号量

进程之间的通信方式

匿名 (未验证) 提交于 2019-12-02 23:52:01
进程之间的通信方式有管道、消息队列、共享内存、信号量和Socket。 管道 来看一条Linux的指令: netstat - tulnp | grep 8080 学过Linux命名的估计都懂得这条指令的含义,其中的【|】就是管道的意思,作用是把前一条命令的输出作为后一条命令的输入。在这里就是把netstat -tulnp的输出结果作为grep 8080这条指令的输入。如果两个进程要进行通信的话,就可以用这种管道进行通信了,并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命名的输入,如果进程之间想要互相通信的话,就需要创建两个管道。 另外我们可以知道,这条竖线是没有名字的,我们把这种通信方式称之为匿名管道。既然有匿名管道,那就意味着有命名管道,下面我们来创建一个命名管道: mkfifo test 这条命令创建了一个名字为test的命名管道。 接下来我们用一个进程向这个管道里面写数据,然后会有另外一个进程把里面的数据读出来。 echo "this is a pipe" > test // 写入数据 这个时候管道的内容没有被读出来的话,那么这个命令就会一直停在这里,只有当另一个进程把test里面的内容读出来的时候,这条命令才会结束。 cat < test // 读数据 我们可以看到,test里面的数据被读出来了,上一条命令也就执行结束了。 从上面的例子可以看出

Semaphore: 信号量

本秂侑毒 提交于 2019-12-02 23:37:57
Semaphore: 信号量 Semaphore: 可以指定多个线程同时访问某一资源。 一)、构造方法 //int permits:线程的准入数,即一个资源同时可以允许多少个线程访问 Semaphore semaphore = new Semaphore(int permits); //boolean fair,指明锁的规则, false: 非公平锁, true: 公平锁 Semaphore semaphore = new Semaphore(int permits, boolean fair) 公平锁: 锁的顺序与线程的执行顺序有关 非公平锁:锁的执行顺序与线程的执行顺序无关 默认使用非公平锁 。 二)、获取许可的方法 1)、acquire():获取一个许可,如果获取失败,则线程等待,等待期间可以响应中 断。 public void acquire() throws InterruptedException { //1.获取共享可中断的 sync.acquireSharedInterruptibly(1); } public final void acquireSharedInterruptibly(int arg) throws InterruptedException { //2.优先判断线程的中断状态 if (Thread.interrupted()) throw new

Semaphore

痞子三分冷 提交于 2019-12-02 23:37:39
public class Semaphore implements java.io.Serializable { private static final long serialVersionUID = -3222578661600680210L; /** All mechanics via AbstractQueuedSynchronizer subclass */ private final Sync sync; /** * 继承AQS以实现信号量机制,使用AQS的state属性代表允许使用的信号量的数量,该Sync类有两个 * 派生类,其中一个是公平模式的,另一个是非公平模式的 */ abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; Sync(int permits) { setState(permits); } final int getPermits() { return getState(); } //非公平模式的获取信号量 final int nonfairTryAcquireShared(int acquires) { for (;;) { int

一文看懂 Mutex vs Semaphore vs Monitor vs SemaphoreSlim

安稳与你 提交于 2019-12-02 23:08:09
C#开发者(面试者)都会遇到Mutex,Semaphore,Monitor,SemaphoreSlim这四个与锁相关的C#类型,本文期望以最简洁明了的方式阐述四种对象的区别。 什么叫线程安全? 教条式理解 如果代码在多线程环境中运行的结果与 单线程运行结果一样,其他变量值也和预期是一样的,那么线程就是安全的; 线程不安全就是不提供数据访问保护,可能出现多个线程先后修改数据造成的结果是脏数据。 实际场景理解 两个线程都为集合增加元素,我们错误的理解即使是多线程也总有先后顺序吧,集合的两个位置先后塞进去就完了;实际上集合增加元素这个行为看起来简单,实际并不一定是原子操作。 在添加一个元素的时候,它可能会有两步来完成: 在 Items[Size] 的位置存放此元素; 增大 Size 的值。 在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置0,之后设置Size=1; 如果是在多线程场景下,有两个线程,线程A先将元素存放在位置0,但是此时CPU调度线程A暂停,线程B得到运行机会;线程B也向此ArrayList添加元素,因为此时Size仍然等于0 (注意哦,我们假设添加元素是经过两个步骤,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。 那好,我们来看看ArrayList的情况,元素实际上只有一个

Semaphore

旧街凉风 提交于 2019-12-02 22:59:14
public class Semaphore implements java.io.Serializable { private static final long serialVersionUID = -3222578661600680210L; /** All mechanics via AbstractQueuedSynchronizer subclass */ private final Sync sync; /** * 继承AQS以实现信号量机制,使用AQS的state属性代表允许使用的信号量的数量,该Sync类有两个 * 派生类,其中一个是公平模式的,另一个是非公平模式的 */ abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 1192457210091910933L; Sync(int permits) { setState(permits); } final int getPermits() { return getState(); } //非公平模式的获取信号量 final int nonfairTryAcquireShared(int acquires) { for (;;) { int

python3 信号量semaphore

匿名 (未验证) 提交于 2019-12-02 22:51:08
提前设定好,一个房间只有4个床(计数器现在为4),那么同时只能四个人进来,谁先来的谁先占一个床(acquire,计数器减1),4个床满了之后(计数器为0了),第五个人就要等着,等其中一个人出来(release,计数器加1),他就去占用那个床了。 互斥锁同时只允许一个线程更改数据,而信号量 Semaphore 是同时允许一定数量的线程更改数据 。 假设商场里有 4 个迷你唱吧,所以同时可以进去 4 个人,如果来了第五个人就要在外面等待,等到有人出来才能再进去玩。 实现: 信号量同步基于内部计数器,每调用一次 acquire (),计数器减 1 ;每调用一次 release (),计数器加 1. 当计数器为 0 时, acquire ()调用被阻塞。这是迪科斯彻( Dijkstra )信号量概念 P ()和 V ()的 Python 实现。信号量同步机制适用于访问像服务器这样的有限资源。 信号量与进程池的概念很像,但是要区分开,信号量涉及到加锁的概念 # coding:utf-8 import time import random from multiprocessing import Process , Semaphore def go_ktv ( i , sem ): print ( "user%s马上要进>>>>>ktv." % i ) sem . acquire ()

Python基础――多线程之信号量

匿名 (未验证) 提交于 2019-12-02 22:11:45
信号量可以看成是线程锁的加强版 信号量相当于一个计数器,和RTOS中任务向量表异曲同工,当资源消耗是递减,当资源释放是递增。也就是说acquire消耗资源减一,release释放资源加一。 可以认为信号量代表着资源是否可用。 使用信号量首先要创建BoundedSemaphore类的实例,并通过该类的方法传入信号量的最大值 实例演示了信号对象的创建,获取资源与释放资源: # ――创建时间:2019.3.2―― # 多线程信号量 from threading import BoundedSemaphore MAX = 3 # 创建信号量对象,并设置最大值 semaphore = BoundedSemaphore(MAX) # 输出当前计数器的值 print(semaphore._value) # 获得资源,计数器减一 semaphore.acquire() # 输出当前计数器的值 print(semaphore._value) # 获得资源,计数器减一 semaphore.acquire() # 输出当前计数器的值 print(semaphore._value) # 释放资源,计数器加一 semaphore.release() # 输出当前计数器的值 print(semaphore._value) # 释放资源,计数器加一 semaphore.release() # 输出当前计数器的值

详解线程的信号量和互斥锁

匿名 (未验证) 提交于 2019-12-02 21:59:42
  前言: 有个问题感觉一直会被问道:进程和线程的区别?也许之前我会回答: 进程:资源分配最小单位 线程:轻量级的进程 是系统调度的最小单位 由进程创建 多个线程共享进程的资源   但是现在我觉得一个比喻回答的更好:程序就像静止的火车,进程是运行的火车,线程是运行火车的每节车厢。 个人感觉理解远比背些概念性东西更好。   一、线程   通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。   1、线程相关函数  pthread_create函数 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 注: Compile and link with -pthread.//编译时 要加-lpthread 功能:创建线程 参数1:线程的ID 参数2:NULL 参数3:线程处理函数 参数4:

Linux线程间同步的几种方式

匿名 (未验证) 提交于 2019-12-02 21:56:30
信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量时,也可以完成一个资源的互斥访问。信号量测重于访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 可以用于不同进程间或多线程间的互斥与同步 创建打开有名信号量 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //成功返回信号量指针;失败返回SEM_FAILED,设置errno name是文件路径名,但不能写成/tmp/a.sem这样的形式,因为在linux下,sem都是在/dev/shm目录下,可写成"/mysem"或"mysem",创建出来的文件都是"/dev/shm/sem.mysem",mode设置为0666,value设置为信号量的初始值.所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是个错误。 关闭信号量,进程终止时,会调用它 int sem_close(sem

计算机操作系统基础知识-2

匿名 (未验证) 提交于 2019-12-02 21:56:30
Shell Shell是操作系统与用户交互的界面。表现为通过控制台执行用户命令。本身不执行命令,仅仅是组织和管理命令。 脚本:类似程序的方式执行一系列的逻辑顺序的命令序列完成复杂的功能和人机交互。保存在文件中,是shell命令的集合。 定义:操作系统内核为应用程序提供的服务/函数 特点: 一般涉及核心操作和硬件资源 运行于核态 函数具有唯一ID 产生中断,且为自愿中断 定义:是程序在某个数据集合上的一次运行活动。程序的一次运行即为一个进程。 特性: 动态性 并发性 异步性 独立性 分类: 按使用资源权限 系统进程:系统内核相关进程 用户进程:运行于用户态的进程 按对CPU依赖性 偏CPU进程:计算型 偏I/O进程: 进程状态 就绪态:获得了除CPU之外所有资源,通常有多个进程处于就绪态,有一个就绪队列。 运行态:获得CPU,正在运行 等待态: 进程由程序、数据、进程控制块组成。 进程控制块是描述和管理进程的一种数据结构,包括以下内容: 进程描述信息 控制和调度信息 资源信息 现场信息 同步:进程通过协作共同完成同一任务而造成的直接制约关系,如生产者-消费者模式 互斥:进程间竞争系统资源而造成的间接制约关系,同一时间内只有一个进程可以访问系统资源。 临界资源和临界区 临界资源:同一时间只能有一个进程访问的资源 临界区:进程访问临界资源的程序片段 实现同步互斥的方法:原子操作、锁