信号量

linux c 内存共享

折月煮酒 提交于 2020-01-27 13:04:57
一、什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc()分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。 特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问 二、共享内存的使得 与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h 中。 1、shmget()函数 该函数用来创建共享内存,它的原型为: int shmget(key_t key, size_t size, int shmflg); 第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget()函数成功时返回一个与key相关的共享内存标识符(非负整数)

简单了解Hystrix的舱壁隔离

╄→гoц情女王★ 提交于 2020-01-27 02:51:57
通过 Hystrix的简单实现 这篇博文,可以了解到我们为什么要使用 Hystrix 以及如何简单使用 Hystrix 的功能 不过我突然意识到,我的系统可是要调用好多个三方接口的,那么如果其中一个第三方接口出现了问题,要是在高并发的情况下,所有的资源都会被这个第三方接口所耗尽,那其他的接口就没法做事了,再夸张点,还会造成系统宕机。 那这时候引入 Hystrix 还有什么用,在上述情况下,他容错降级的功能形同虚设? 答案是 Hystrix 一样是可以起到作用的, Hystrix 采用了依赖隔离的方式,不过我更喜欢称呼为" 舱壁隔离 "。 什么是 舱壁隔离 可以用轮船的舱壁设计来举例,轮船底下船舱一个个都是互相隔离的,这样一旦哪个舱壁出现漏水也影响不到其他的船舱, Hystrix 也是一样,他为每一个需要被调用的服务维护了一个独立的线程池,这样每个服务都有自己的使用资源,当某个服务出现问题时,大家互不影响。 舱壁隔离 会影响性能么 会的,毕竟每个服务都要维护了一个自己的线程池,说不影响是假的,不过 Hystrix 的开发人员也对 Hystrix 对性能的影响做了测试,隔离所带来的好处比开辟多个线程池会产生的开销大的多,至少用了依赖隔离,安全性和可用性又会大大提升,一个系统要是用都不能用,还谈什么性能。 使用 舱壁隔离 的优点 整个系统的安全性和可用性被提高了

操作系統-進程管理2(進程的互斥與同步)

大兔子大兔子 提交于 2020-01-25 23:07:02
操作系统-进程管理2(进程的同步与互斥) 进程的同步与互斥 两个或两个以上的进程不能同时使用的资源称为 临界资源 。临界资源的存在带来了进程之间的互斥访问的问题。 进程互斥 :逻辑上完全独立、毫无关系的两个进程因为竞争同一块资源而相互制约,称为进程互斥。 进程同步 :有协作关系的进程不断调整它们之间的相对速度或执行过程,以保证临界资源的合理利用和进程的顺利执行。一般借由中间媒体实现:如 信号量操作 、 加锁操作 等。同步机制应遵循的规则: 空闲让进 忙则等待 有限等待:进程等待进入临界区的时间必须是有限的,避免进入忙等状态 让权等待:进程不能进入自己的临界区时,应立即释放处理机。 锁机制 上锁与开锁 锁机制采用锁变量 w 表示临界区是否上锁。 w=1 表示已上锁 高效率的上锁与开锁原语为: //加锁原语 Lock w() { while (w == 1) { //表示当前进程进入不了临界区 保护当前进程的CPU现场; 将当前进程放入w的等待队列,将该进程置于"等待"状态; 转进程调度; } } //开锁原语 Unlock() { if (w等待队列不空) { 移出等待队列首元素; 将该进程置于就绪状态,并放入就绪队列; } w = 0; } 所有要访问临界区的进程必须先执行上锁原语,上锁原语顺利通过,则进程可进入临界区;在完成对临界区的访问后,则执行开锁原语,释放该临界资源。

操作系統-進程管理3(進程通信)

别说谁变了你拦得住时间么 提交于 2020-01-25 23:06:31
操作系统-进程管理3(进程通信) 进程通信 进程间的通信分为控制信息的传送和大量信息的传送两种,控制信息的传送称为 低级通信 ,大批量数据的传送称为 高级通信 。 高级通信分为 共享存储系统、消息传递系统和管道通信系统 。 共享存储系器系统 共享存储器系统类型:在共享存储系统中,相互通信的进程共享某些 数据结构 或 共享存储区 ,进程之间能通过这些空间进行通信。 共享数据结构的通信:在这种方式中,要使各进程间共享某些数据结构以实现进程间的信息交换。如生产者-消费者问题中,生产进程和消费进程共享了empty和full的信号量,使得彼此知道能否放置或拿走产品。这种方式只适用于传递少量的数据。 共享存储区的通信:为了实现高级通信,在存储区划出一块共享存储区,各进程可通过对共享存储区的读或写来实现通信。进程在通信前,先向系统申请获得共享存储区的一块分区,并指定该分区的一个关键字;若系统已经给其他进程分配了这样的分区(如本进程是读进程,但是已经有同类的读进程在读这块数据),则将该分区的描述符返回给申请者,由申请者去连接共享存储区。 Linux共享存储区通信的实现 1).共享存储区的建立:当进程要利用共享存储区与另一个进程进行通信时,必须先让系统调用shmget()建立一块共享存储区。 2).共享存储区的操纵:系统可以调用shmctl()对共享存储区的状态信息进行查询,如长度、所连接的进程数

哲学家就餐问题、银行家算法、读者写者问题、生产者消费者问题

好久不见. 提交于 2020-01-25 00:29:04
哲学家就餐问题、银行家算法、读者写者问题、生产者消费者问题 哲学家就餐问题 解题思路 问题解决 方法一 方法二 方法三 银行家算法 安全状态 银行家算法的数据结构 银行家算法 安全性算法 银行家算法实例 读者写者问题 方法1:利用记录型信号量解决读者--写者问题 方法2:利用信号量集解决读者--写者问题 生产者消费者问题 哲学家就餐问题 该问题描述的是五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。 解题思路 因为是五位哲学家,并且每位哲学家的各自做自己的事情(思考和吃饭),因此可以创建五个线程表示五位哲学家,五个线程相互独立(异步)。并对五位哲学家分别编号为0~4。 ​ 同时,有五根筷子,每根筷子只对其相邻的两位哲学家是共享的,因此这五根筷子可以看做是五种不同的临界资源(不是一种资源有5个,因为每根筷子只能被固定编号的哲学家使用)。并对五根筷子分别编号为0~4,其中第i号哲学家左边的筷子编号为i,则其右边的筷子编号就应该为(i + 1) % 5。 ​ 因为筷子是临界资源,因此当一个线程在使用某根筷子的时候,应该给这根筷子加锁,使其不能被其他进程使用。 ​ 根据以上分析,可以使用pthread

FreeRTOS的信号量和互斥量

我是研究僧i 提交于 2020-01-24 03:42:51
1. 理解如下,言简意赅的说,信号量解决同步,互斥量解决竞争。 信号量用于同步,主要任务间和中断间同步;互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁。 互斥量具有优先级继承,信号量没有。 互斥量不能用在中断服务程序中,信号量可以,这个就不太明白了? 创建互斥量和创建信号量的API函数不同,但是共用获取和给出信号API函数。 2. 互斥量与二进制信号量最大的不同是:互斥量具有优先级继承机制。也就是说,如果一个互斥量(令牌)正在被一个低优先级任务使用,此时一个高优先级企图获取这个互斥量,高优先级任务会因为得不到互斥量而进入阻塞状态,正在使用互斥量的低优先级任务会临时将自己的优先级提升,提升后的优先级与与进入阻塞状态的高优先级任务相同。这个优先级提升的过程叫做优先级继承。这个机制用于确保高优先级任务进入阻塞状态的时间尽可能短,以及将已经出现的“优先级翻转”影响降低到最小。 在很多场合中,某个硬件资源只有一个,当低优先级任务占用该资源的时候,即便高优先级任务也只能乖乖的等待低优先级任务释放资源。这里高优先级任务无法运行而低优先级任务可以运行的现象称为“优先级翻转”。 来源: https://www.cnblogs.com/429512065qhq/p/8084640.html

FreeRTOS——1

北战南征 提交于 2020-01-24 03:37:47
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的特点 FreeRTOS 的主要特点如下: 1. 支持抢占式调度,合作式调度和时间片调度。 2. SafeRTOS 作为 FreeRTOS 的衍生品大大提高了 FreeRTOS 在代码完整性方面的信心。 3. 用于低功耗的 Tickless 模式。 4. 支持 35 种系统架构。 5. FreeRTOS-MPU 支持 M3/M4/M7 内核的 MPU(内存保护单元)。 6. 设计的简单易用,典型的内核使用大小在 4k-9k。 7. 移植非常简单,代码主要用 C 编写。 8. 同时支持合作式和抢占式任务。 9. 支持消息队列、 二值信号量、 计数信号量、 递归信号量和互斥信号量,可用于任务与任务间的消息传 递和同步,任务与中断间的消息传递和同步。 10. 优先级继承方式的互斥信号量。 11. 高效的软件定时器。 12. 强大的跟踪执行函数。 13. 堆栈溢出检查。 14. 提供丰富的,配置好的工程例子。 15. 提供论坛技术支持,有可选的商业支持和许可版本。 16. 任务的数量不限。 17. 任务优先级数量不限。 18. 多个任务可以分配相同优先级,即支持时间片调度。 19. 免费的开发工具。 20. 免费的嵌入式软件源码。 21. 免版权费。 FreeRTOS 的编码标准

从零开始学习UCOSII操作系统15--总结篇

我只是一个虾纸丫 提交于 2020-01-24 03:30:59
https://msd.misuland.com/pd/3626730720442974994 前言:在大学的时候,我们班级上面都有很多人觉得学习UCOSII(包括UCOSIII)是没什么厉害的,因为很多人都喜欢去学习Linux 操作系统 ,但是,但是,真实的对整个UCOSII操作系统进行学习,我可以保证,如果你是基于源码级别的阅读的话,绝对是不简单的。仅仅是调用几个API的话,是永远用不好UCOSII的操作系统的。还有你真正学通了UCOSII操作系统的话,那么你对Linux操作系统的内核也不会有太大的难度。 参考:嵌入式实时操作系统UCOSII原理与应用 1、UCOSII操作系统是怎么管理任务的? 用图是最能表现的: (1)任务控制块是来管理任务的。 (2)其中UCOSII把所有的任务都是通过双向链表来连接到一起的,为什么?我难道不能使用数组来分配空间吗? 关键原因:在整个操作系统中,因为我们不知道用户到底需要多少个任务,所以使用链表的话,在编译后才确认的话,数组的方式优秀很多。 我个人认为这张图其实是有一些错误的: 比如里面写了指向任务的指针,我觉得是应该放置在任务堆栈里面的,因为创建任务的时候,是将任务的函数名,传递给任务堆栈,然后任务堆栈再传到CPU的SR寄存器中,实现任务切换的。 所谓的指向任务的指针:其实就是任务的函数的函数名。 2、UCOSII操作系统是怎么运行的?

并发编程学习笔记之十三并发工具Semaphore信号量

匆匆过客 提交于 2020-01-24 02:31:11
一、Semaphore简介 Semaphore被称之为信号量,可以用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。常常用来做流量控制,特别公共资源有限的应用场景,比如池化资源:数据库连接池,对象池,线程池。来举个更接地气的例子:一个临时停车场只有10个车位,一次来了10辆车,正好将10个车位占满,此时又来了一辆车,只能等其他车离开之后才能找到车位停车。 二、简单应用 下面来看Semaphore一个简单的应用示例:Semaphore相当于车位,此时5辆车依次进入停车产。 package cn.com.threadtx.cn.com; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** *Semaphore信号量示例 */ public class SemaphoreTest { public static void main(String[] args) { //初始化线程池 ExecutorService service = Executors.newCachedThreadPool(); //创建信号量 final Semaphore sp =

同步与异步区别

早过忘川 提交于 2020-01-23 08:26:16
1、我们的生活中存在着很多同步异步的例子。 比如:你叫我去吃饭,我听到了就立刻和你去吃饭,如果我们有听到,你就会一直叫我,直到我听见和你一起去吃饭,这个过程叫同步;异步过程指你叫我去吃饭,然后你就去吃饭了,而不管我是否和你一起去吃饭。而我得到消息后可能立即就走,也可能过段时间再走。如果我请你吃饭,就是同步,如果你请我吃饭就用异步,这样你比较省钱。 2、在计算机领域 同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去; 异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率。 同步是阻塞模式,异步是非阻塞模式。 我的理解:同步是指两个线程的运行是相关的,其中一个线程要阻塞等待另外一个线程的运行。异步的意思是两个线程毫无相关, 自己运行自己的。 举个例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求通过事件触发->服务器处理(这时浏览器仍然可以作其他事情)->处理完毕 当应用程序在对象上调用一个需要花费很长时间来执行的方法的时候,并且不需要让程序等待对方返回, 这时就应该使用异步编程。 3、而我们平时经常讨论的