信号量

RT-thread内核之进程间通信

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-13 00:09:28
这里面见到的同步和互斥的概念非常清晰,转载自: http://www.cnblogs.com/King-Gentleman/p/4311582.html 一、进程间通信机制 rt-thread操作系统的IPC(Inter-Process Communication,进程间同步与通信)包含有中断锁、调度器锁、信号量、互斥锁、事件、邮箱、消息队列。其中前5个主要表现为线程间同步,邮箱与消息队列表现为线程间通信。本文主要介绍它们的一些特性及使用场合。 1、中断锁 关闭中断也叫中断锁,是禁止多任务访问临界区最简单的一种方式,即使是在分时操作系统中也是如此。当中断关闭的时候,就意味着当前任务不会被其他事件打断(因为整个系统已经不再响应那些可以触发线程重新调度的外部事件),也就是当前线程不会被抢占,除非这个任务主动放弃了处理器控制权。关闭中断/恢复中断API接口由BSP实现,根据平台的不同其实现方式也大不相同。比如在stm32平台中中断锁机制通过关闭中断函数(rt_base_t rt_hw_interrupt_disable(void),这个函数用于关闭中断并返回关闭中断前的中断状态。)以及恢复中断函数(void rt_hw_interrupt_enable(rt_base_t level),恢复调用rt_hw_interrupt_disable()函数前的中断状态)实现。 警告:

Posix信号量

血红的双手。 提交于 2020-02-13 00:02:42
1、概述   信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。Posix信号量分为有名信号量和无名信号量(也叫基于内存的信号量)。 2、Posix有名信号量   有名信号量既可以用于线程间的同步也可以用于进程间的同步。 1)由sem_open来创建一个新的信号量或打开一个已存在的信号量。其格式为: sem_t *sem_open(const char *name,int oflag,mode_t mode,unsigned int value); 返回:若成功则为指向信号量的指针,若出错则为SEM_FAILED 其中,第三、四个参数可以没有,主要看第二个参数如何选取。 oflag参数:可以是0、O_CREAT或O_CREAT|O_EXCL。如果指定O_CREAT标志而没有指定O_EXCL,那么只有当所需的信号量尚未存在时才初始化它。但是如果所需的信号量已经存在也不会出错。 但是如果在所需的信号量存在的情况下指定O_CREAT|O_EXCL却会报错。 mode参数:指定权限位。 value参数:指定信号量的初始值

system V信号量和Posix信号量

五迷三道 提交于 2020-02-12 23:20:43
一、函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量。它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线。例如,应该是semget()而不是sem_get()。然而,所有的的POSIX信号量函数都有一个下划线。下面列出了它们提供的所有函数清单: Systm V POSIX semctl() sem_getvalue() semget() sem_post() semop() sem_timedwait() sem_trywait() sem_wait() sem_destroy() sem_init() sem_close() sem_open() sem_unlink() 二、使用上的区别 1、XSI system V的信号量是信号量集,可以包括多个信号灯(有个数组),每个操作可以同时操作多个信号灯 posix是单个信号灯,POSIX有名信号灯支持进程间通信,无名信号灯放在共享内存中时可以用于进程间通信。 2、POSIX信号量在有些平台并没有被实现,比如:SUSE8,而SYSTEM V大多数LINUX/UNIX都已经实现。两者都可以用于进程和线程间通信。但一般来说,system v信号量用于 进程间同步、有名信号灯既可用于线程间的同步,又可以用于进程间的同步、posix无名用于同一个进程的不同线程间

《操作系统教程》第5版-Chapter3-同步通信与死锁知识点整理

空扰寡人 提交于 2020-02-12 12:23:31
A级: 死锁: ***定义:一个进程集合内 每个进程都在等待 只能由此集合中的 其他进程才能引发的事件 ,而 无限期僵持 的现象 ***死锁产生的原因: 进程推进顺序不当 PV使用不妥 资源分配不均 资源使用不加限制 ***死锁的条件: 互斥 占有和等待 不剥夺 循环等待 ***解决方法: 死锁防止,死锁避免,死锁检测和恢复 死锁预防 : 静态分配 ——破坏条件 占有和等待 按序分配,层次分配 ——破坏 循环等待 死锁避免 银行家算法 —— 循环等待 死锁检测和恢复 资源剥夺 进程回退 进程撤销 系统重启 进程同步与互斥的解决: 信号量,管程,消息传递 *** 临界区 :进程中用于 访问临界资源 的代码。一次只允许一个程序访问 信号量PV: 信号中包括一个整形变量,和两个原子操作P和V,其原子性由操作系统保证,这个整形变量只能通过P操作和V操作改变。 P意味着信号量值减1,减完之后如果信号量值小于0,则说明资源不够用的,把进程加入等待队列。 V意味着信号量值加1,加完之后如果信号量值小于等于0,则说明等待队列里有进程,那么唤醒一个等待进程 管程 把 分散在各进程中的临界区集中起来进行管理 ,防止进程有意或无意的违法同步操作,便于用高级语言来书写程序 使用 条件变量 , wait() , signal() 管程的定义:管程是由局部于自己的若干公共变量

windows下进程与线程

寵の児 提交于 2020-02-12 10:38:39
windows下进程与线程 Windows是一个单用户多任务的操作系统,同一时间可有多个进程在执行。进程是应用程序的运行实例,可以理解为应用程序的一次动态执行;而线程是CPU调度的单位,是进程的一个执行单元。一个进程可以有多个线程,而一个线程只能从属于一个进程。 进程包含文本、数据、堆栈片段一级进程自身的资源(比如进程创建的文件、管道、同步对象等)。由操作系统负责管理进程及其资源,与进程相关的信息被保存在一个被称作进程控制块的结构中。 线程是操作系统分配CPU时间的基本实体。在一个多线程的应用程序中,每一个线程都有自己的堆栈,并且可以独立地操作同一程序中的其他线程。 一般来讲,操作对象是线程。 进程与线程的最大区别就是进程有自己的地址空间,而线程没有,线程共享进程的地址空间。进程内的两个线程可以访问同一个数据片段,因此,通过使用该数据片段可以实现线程间的通信。 线程间通信一 :全局变量,线程监督。利用volatile关键词修饰,要求编译器不要将该变量缓存到一个寄存器当中,即允许别的线程对该变量进行修改。操作过程就是在开启线程的时候令监督变量为1,同时在线程中监督此变量,然后当要关闭该线程的时候,在主程序(线程)中将监督变量改为0,因此,在线程函数中检测到该变量变为0之后,就退出。 线程间通信二 :采用消息机制。因为windows程序设计中,应用程序的每一个线程都拥有自己的消息队列

C# 多线程

妖精的绣舞 提交于 2020-02-12 10:29:19
一、使用线程的理由 1、可以使用线程将代码同其他代码隔离,提高应用程序的可靠性。 2、可以使用线程来简化编码。 3、可以使用线程来实现并发执行。 二、基本知识 1、进程与线程:进程作为操作系统执行程序的基本单位,拥有应用程序的资源,进程包含线程,进程的资源被线程共享,线程不拥有资源。 2、前台线程和后台线程:通过Thread类新建线程默认为前台线程。当所有前台线程关闭时,所有的后台线程也会被直接终止,不会抛出异常。 3、挂起(Suspend)和唤醒(Resume):由于线程的执行顺序和程序的执行情况不可预知,所以使用挂起和唤醒容易发生死锁的情况,在实际应用中应该尽量少用。 4、阻塞线程:Join,阻塞调用线程,直到该线程终止。 5、终止线程:Abort:抛出 ThreadAbortException 异常让线程终止,终止后的线程不可唤醒。Interrupt:抛出 ThreadInterruptException 异常让线程终止,通过捕获异常可以继续执行。 6、线程优先级:AboveNormal BelowNormal Highest Lowest Normal,默认为Normal。 三、线程的使用 线程函数通过委托传递,可以不带参数,也可以带参数(只能有一个参数),可以用一个类或结构体封装参数。 namespace Test { class Program { static

服务雪崩+缓存雪崩+解决方案

亡梦爱人 提交于 2020-02-09 20:38:08
一、服务雪崩 1、定义: 服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口, 这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。 2、原因: a.某几个机器故障:例如机器的硬驱动引起的错误,或者一些特定的机器上出现一些的bug(如,内存中断或者死锁)。 b.服务器负载发生变化:某些时候服务会因为用户行为造成请求无法及时处理从而导致雪崩,例如阿里的双十一活动,若没有提前增加机器预估流量则会造服务器压力会骤然增大二挂掉。 c.人为因素:比如代码中的路径在某个时候出现bug 3、解决: 4种:服务降级、服务熔断、服务隔离、限流模式、超时机制 a. 服务降级 :在高并发情况下,防止用户一直等待(返回一个友好的提示,直接给客户端,不会去处理请求,调用fallBack本地方法),目的是为了用户体验。 秒杀---当前请求人数过多,请稍后重试 b. 服务熔断 :熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值),如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用。 熔断的设计主要参考了 hystrix 的做法, 分为3个模块:熔断请求判断算法、熔断恢复机制、熔断报警 (1)熔断请求判断机制算法

Semaphore

假装没事ソ 提交于 2020-02-08 12:35:20
背景 Semaphore 用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。信号量还可以用来实现某种资源池,或者对容器施加边界。 Semaphore 管理着一组许可(permit),许可的初始数量可以通过构造函数设定,操作时要首先获得许可,才能进行操作,操作完成之后释放许可。如果没有获取许可,则阻塞直到有许可被释放。如果初始化一个许可为 1 的 Semaphore 那就相当于初始化了一个不可重入的互斥锁。 源码分析 构造函数 public Semaphore(int permits) { sync = new NonfairSync(permits); } public Semaphore(int permits, boolean fair) { sync = fair ? new FairSync(permits) : new NonfairSync(permits); } 两个构造方法都必须提供许可数量。第二个构造用法用于指定公平模式还是非公平模式。与 ReentrantLock 中的公平锁和非公平锁一样。公平信号量获取时,如果当前线程不在 CLH 队列的头部,则需要排队等候,对于非公平信号量而言,无论当前线程处于 CLH 队列的任何位置都可以直接获取。 获取许可 Semaphore 提供了四种获取许可的方法,分别如下: //获取一个许可证(响应中断)

linuxC多进程通讯----POSIX信号量

≡放荡痞女 提交于 2020-02-08 09:39:07
文章目录 相关API 使用说明 基本创建、加减、关闭示例 两个进程通过信号量通讯示例 post wait 父子进程通过信号量同步 相关API •sem_t *sem_open (const char *name, int oflag); •sem_t *sem_open (const char *name, int oflag,mode_t mode, unsigned int value); •int sem_close (sem_t *sem); •int sem_post (sem_t *sem); •int sem_wait (sem_t *sem); •int sem_trywait (sem_t *sem); •int sem_timedwait (sem_t *sem, const struct timespec *abs_timeout); •int sem_unlink (const char *name); •int sem_getvalue (sem_t *sem, int *sval); 使用说明 •包含头文件:#include <semaphore.h> •编译时要指定:-lpthread •Pthread: –POSIX threads,操作线程的API标准 –适用于 Unix、Linux、Mac OS 基本创建、加减、关闭示例 #include

7.并发编程

≯℡__Kan透↙ 提交于 2020-02-08 03:37:25
1.线程和进程的关系? 一个进程可以有多个线程,但必须有一个线程,一个线程只能在一个进程的范围内活动。 2.并发和并行的区别? 并发是指有公共资源的争夺,并行是没有公共资源的争夺。 3.实现多线程的方式? 1>.继承Thred类,重写run接口。 2>.实现Runnable接口,实现run方法。 3>.通过Callable接口,实现call方法。 4.什么是守护线程? 专门用于服务其他的线程,如果其他的线程(即用户自定义线程)都执行完毕,连main线程也执行完毕,那么jvm就会退出(即停止运行)——此时,连jvm都停止运行了,守护线程当然也就停止执行了 5. synchoried原理? 这个原本是个重量级锁,但是在后来更新中进行了优化,引入了偏向锁和轻量级锁。通过锁膨胀一步步升级为重量级锁。 以前的文章: https://blog.csdn.net/huaixiaohai_1/article/details/92607179 还是说原理吧:JVM基于进入和退出Monitor对象来实现同步和代码块同步,同步代码块是通过monitorenter和monitorexit实现的。同步方法是通过另一种方式实现的(JVM规范中并没有说明)。但是还是可以使用这种方法,monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit插入在结束或者异常的位置。必须对应。 6