信号量

进程间的通信方式

本秂侑毒 提交于 2020-02-22 15:03:47
几种进程间的通信方式 (1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。 (2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。 (3)信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 (4)消息队列(message queue):消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 (5)信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。 (6)共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。 (7)套接字(socket):套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信。 来源:

关于多线程同步的一点总结

有些话、适合烂在心里 提交于 2020-02-18 11:26:39
这两天看了下 MoreWindows 《秒杀多线程》系列的博客,稍微总结一下,就当笔记了。 http://blog.csdn.net/column/details/killthreadseries.html 1. CreateThread()与_beginthreadex()的区别 _beginthreadex在创建线程前(即调用CreateThread()前),先申请了一个用于存放线程私有数据的 _tidata 类型成员. 2. Interlocked系列函数 * LONG __cdecl InterlockedIncrement(LONG volatile* Addend); 相当++Addend; * LONG __cdecl InterlockedDecrement(LONG volatile* Addend); --Addend; * LONG __cdecl InterlockedExchangeAdd(LONG volatile* Addend, LONG Value); Addend + Value; 减法即Value取负值 * MSDN上对WaitForMultipleObjects()函数第一个参数作了说明:The maximum number of object handles is MAXIMUM_WAIT_OBJECTS(64)。 3. 多线程同步

C#多线程那点事——信号量(Semaphore)

≯℡__Kan透↙ 提交于 2020-02-18 10:27:40
信号量说简单点就是为了线程同步,或者说是为了限制线程能运行的数量。 那它又是怎么限制线程的数量的哩?是因为它内部有个计数器,比如你想限制最多5个线程运行,那么这个计数器的值就会被设置成5,如果一个线程调用了这个Semaphore,那么它的计数器就会相应的减1,直到这个计数器变为0。这时,如果有另一个线程继续调用这个Semaphore,那么这个线程就会被阻塞。 获得Semaphore的线程处理完它的逻辑之后,你就可以调用它的Release()函数将它的计数器重新加1,这样其它被阻塞的线程就可以得到调用了。 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Semaphore1{ class Program { //我设置一个最大允许5个线程允许的信号量 //并将它的计数器的初始值设为0 //这就是说除了调用该信号量的线程都将被阻塞 static Semaphore semaphore = new Semaphore(0, 5); static void Main(string[] args) { for (int i = 1; i <= 5; i++) { Thread thread = new

Linux基础知识3

吃可爱长大的小学妹 提交于 2020-02-17 14:22:51
原文链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/6876344 原文链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/6878477 原文链接:https://blog.csdn.net/zhouzhaoxiong1227/article/details/6882246 Q1. 什么是临界区?什么是竞争状态?什么是同步? A: 临界区(critical regions)就是访问和操作共享数据的代码段,多个内核任务并发访问同一个资源通常是不安全的; 如果两个内核任务可能处于同一个临界区,就是一种错误现象;如果确实发生了这种情况,就称它为竞争状态; 避免并发和防止竞争状态称为同步(synchronization)。 Q2. 简要介绍一下死锁及避免死锁的方法。 A: 死锁包括自死锁和ABBA死锁, 产生死锁有四个原因:互斥使用、不可抢占、请求和保持,以及循环等待; 避免死锁的方法有:破坏“不可剥夺”条件、破坏“请求和保持”条件、破坏“循环等待”条件。 Q3. 内核中造成并发执行的原因是什么? A: “并发”分为“伪并发”和“真并发”两种,内核中造成并发执行的原因有以下几种: 中断:它可能随时打断当前正在执行的代码; 内核抢占

SpringCloud Netflix Hystrix

做~自己de王妃 提交于 2020-02-16 21:17:28
Hystrix的一些概念 Hystrix是一个容错框架,可以有效停止服务依赖出故障造成的级联故障。 和eureka、ribbon、feign一样,也是Netflix家的开源框架,已被SpringCloud集成。 线程隔离 将每个请求都包装为一个线程,放到线程池中,对这些请求的处理(线程)互不干扰,隔离开来,某些请求出问题也不会影响到其他请求。 服务监控 监控请求的失败率(一定时间内,请求失败个数)达到阈值,就打开断路器,熔断链路,使后续的请求快速失败。 服务限流 当此消费者对某提供者请求个数较多时,消费者会限制请求个数,有2种策略: (1)线程池。 新建一个线程池(使用的不是tomcat的线程池,而是jdk自带的线程池),将对某个提供者的每个请求都包装为一个单独的线程,放到线程池中,线程池中的线程(请求)都是正在处理的。若线程池满了,放在队列中排队等待,若队列也满了,后续该消费者对该提供者的请求直接快速失败。 Hystrix默认使用线程池。 (2)信号量 信号量即可同时处理的请求个数。指定一个初始值(信号量),比如10, 该消费者调用一次该提供者,即一个信号进来了,自动将信号量就-1,如果处理完,自动将信号量+1, 信号量为0时不再处理后续请求,直接快速失败。 服务降级 不管是什么原因导致的服务调用失败,快速失败后浏览器显示的都是一片英文(错误信息),这对用户不友好。

【Java并发工具类】Semaphore

风格不统一 提交于 2020-02-16 00:21:04
前言 1965年,荷兰计算机科学家Dijkstra提出的信号量机制成为一种高效的进程同步机制。这之后的15年,信号量一直都是并发编程领域的终结者。1980年,管程被提出,成为继信号量之后的在并发编程领域的第二个选择。目前几乎所有的语言都支持信号量机制,Java也不例外。Java中提供了 Semaphore 并发工具类来支持信号量机制。下面我们就来了解Java实现的信号量机制。 首先介绍信号量模型,然后介绍如何使用,最后使用信号量来实现一个限流器。 信号量模型 信号量模型图(图来自参考[1]): 信号量模型总结为:一个计数器、一个等待队列和三个对外调用的方法。 计数器和等待队列时对外透明的,所有我们只能通过三个对外方法来访问计数器和等待队列。 init() :设置计数器的初始值。 down() :计数器的值减一。如果此时计数器的值小于0,则当前线程插入等待队列并阻塞,否则当前线程可以继续执行。 up() :计数器的值加一。如果此时计数器的值小于或者等于0,则唤醒等待队列中的一个线程,并将其从等待队列中移除。 这三个方法都是原子性的,由实现信号量模型的方法保证。在Java SDK中,信号量模型是由 java.util.concurrent.Semaphore 实现。 信号量模型代码化大致类似如下: class Semaphore{ int count; // 计数器 Queue

Linux下Fork与Exec使用

感情迁移 提交于 2020-02-15 10:04:29
一、引言   对于没有接触过Unix/Linux操作系统的人来说,fork是最难理解的概念之一:它执行一次却返回两个值。fork函数是Unix系统最杰出的成就之一,它是七十年代UNIX早期的开发者经过长期在理论和实践上的艰苦探索后取得的成果,一方面,它使操作系统在进程管理上付出了最小的代价,另一方面,又为程序员提供了一个简洁明了的多进程方法。与DOS和早期的Windows不同,Unix/Linux系统是真正实现多任务操作的系统,可以说,不使用多进程编程,就不能算是真正的Linux环境下编程。   多线程程序设计的概念早在六十年代就被提出,但直到八十年代中期,Unix系统中才引入多线程机制,如今,由于自身的许多优点,多线程编程已经得到了广泛的应用。 下面,我们将介绍在Linux下编写多进程和多线程程序的一些初步知识。 二、多进程编程 什么是一个进程?进程这个概念是针对系统而不是针对用户的,对用户来说,他面对的概念是程序。当用户敲入命令执行一个程序的时候,对系统而言,它将启动一个进程。但和程序不同的是,在这个进程中,系统可能需要再启动一个或多个进程来完成独立的多个任务。多进程编程的主要内容包括进程控制和进程间通信,在了解这些之前,我们先要简单知道进程的结构。    2.1 Linux下进程的结构   Linux下一个进程在内存里有三部分的数据,就是"代码段"、"堆栈段"和"数据段"

操作系统线程和进程的同步机制和通信机制

♀尐吖头ヾ 提交于 2020-02-15 00:52:52
现在流行的进程线程同步互斥的控制机制,其实是由最原始最基本的4种方法实现的。由这4种方法组合优化就有了.Net和Java下灵活多变的,编程简便的线程进程控制手段: 临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event) 1. 线程间的同步通信机制 1.1 临界区 通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问 。在 任意时刻只允许一个线程对共享资源进行访问 ,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。 1.2 互斥量 采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问 。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 1.3 信号量 它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV

进程间的通信方式及线程间的通信方式

随声附和 提交于 2020-02-15 00:38:48
进程间的通信方式及线程间的通信方式 0X00 进程间的通信方式 0X01 总述 每个进程都有自己的地址空间,因此从资源占用上来看,不同进程是相互独立的,也就是存在着明显边界的。因此相比于线程,通信比较困难一点。现在比较常用的方式有: 管道 、 消息队列 、 信号量 、 信号 、 共享内存 、 套接字 0X02 管道 管道主要包括 无名管道 和 命名管道 管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信 普通管道PIPE 1、它是 半双工 的(即数据只能在一个方向上流动),具有固定的读端和写端 2、它只能用于 具有亲缘关系 的进程之间的通信(也是父子进程或者兄弟进程之间) 3、它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只 存在于内存 中。 命名管道FIFO 1)FIFO可以在无关的进程之间交换数据 2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。 0X03 消息队列 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列 克服了信号传递信息少 、 管道只能承载无格式字节流 以及 缓冲区大小受限 等缺点。 特点: 1)消息队列是 面向记录 的,其中的消息具有特定的格式以及特定的优先级。 2

Linux 进程间通信方式和原理

孤街浪徒 提交于 2020-02-13 15:31:26
Linux 进程间通信方式和原理 进程间的通信方式 进程的概念 进程时操作系统的概念,每当我们执行一个程序时,对于操作系统来讲究创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程时是一个程序的一次执行过程。 进程通信的概念 进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要相互通信,来完成系统的某项功能。进程通过与内核及其他进程之间的互相通信来协调它们的行为 进程通信的应用场景 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通信的方式 管道(pipe) 普通管道:通常有两种限制,一是单向传输,二是智能在父子或者兄弟进程间使用。 流管道:去除了第一种限制,为半双工,只能在父子或兄弟进程间使用,可以双向传输。 命令管道:去除了第二种限制,可以在许多并不相关的进程之间进行通信。 信息量