共享内存

Linux进程间通信——共享内存

ぃ、小莉子 提交于 2019-12-27 21:36:28
相关知识参考: 1、 http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 2、 http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html 下面的范例及描述来源http://www.cnblogs.com/feisky/archive/2010/03/24/1693488.html 最原始出处不详。 并进行了少许修改 一、基础知识: 共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行读写。共享内存往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。 首先要用的函数是shmget,它获得一个共享存储标识符。 #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, int size, int flag); 这 个函数有点类似大家熟悉的malloc函数,系统按照请求分配size大小的内存用作共享内存。Linux系统内核中每个IPC结构都有的一个非负整数的 标识符,这样对一个消息队列发送消息时只要引用标识符就可以了

操作系统知识点梳理

我与影子孤独终老i 提交于 2019-12-27 14:35:43
进程和线程的区别联系 进程和线程的关系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。 (3)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。 (4)线程是指进程内的一个执行单元,也是进程内的可调度实体。 线程与进程的区别: (1)线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。 (2)系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。 (3)在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行) (4)每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。 线程调度 线程调度:按照特定机制为多个线程分配CPU的使用权。 有两种调度模型: 分时调度:所有线程平分cpu的时间片,轮流占用CPU 抢占式调度:根据优先级占用CPU 调度算法:根据系统的资源分配策略所规定的资源分配算法 (1)时间片轮转法

Linux 共享内存编程

扶醉桌前 提交于 2019-12-27 09:28:35
共享内存允许系统内两个或多个进程共享同一块内存空间,并且数据不用在客户进程和服务器进程间复制,因此共享内存是通信速度最快的一种IPC。 实现的机制简单描述如下:一个进程在系统中申请开辟了一块共享内存空间,然后使用这个共享内存空间的各个进程分别打开这个共享内存空间,并将这个内存空间映射到自己的进程空间上,这样各个进程就可以共同使用这个共享内存空间,就如同使用自己进程地址空间的内存一样。 要实现共享内存空间,内核做了许多工作:比如给每个共享内存块分发一个“身份证”、允许用户进程将共享内存映射到各自的地址空间上、在进程提出申请以后将共享内存和进程地址空间脱离,并在适当的时候讲共享内存删除,让其回到可以被创建的状态。 用户利用共享内存实现进程间的通信,实际上就是使用内核提供的服务完成对共享内存的建立、映射、脱离、删除等。当建立并映射成功以后,进程间就能通过共享内存实现数据的交互。下面就分别介绍内核提供的服务: int shmget(key_t key, size_t size, int shmflg) ; void *shmat(int shmid,const void* shmaddr,int shmflg); int shmdt(const void* shmaddr); int shmctl(int shmid, int cmd, struct shmid_ds *buf);

java中的volatile变量

江枫思渺然 提交于 2019-12-27 05:18:39
同步与线程间通信: 通信 通信是指消息在两条线程之间传递。 既然要传递消息,那接收线程 和 发送线程之间必须要有个先后关系,此时就需要用到同步。通信和同步是相辅相成的。 同步 同步是指,控制多条线程之间的执行次序。 线程间通信方式: 共享内存 共享内存指的是多条线程共享同一片内存,发送者将消息写入内存,接收者从内存中读取消息,从而实现了消息的传递。 但这种方式有个弊端,即需要程序员来控制线程的同步,即线程的执行次序。 这种方式并没有真正地实现消息传递,只是从结果上来看就像是将消息从一条线程传递到了另一条线程。 消息传递 顾名思义,消息传递指的是发送线程直接将消息传递给接收线程。 由于执行次序由并发机制完成,因此不需要程序员添加额外的同步机制,但需要声明消息发送和接收的代码。 java多线程内存模型: 所有线程都共享一片内存,用于存储共享变量; 此外,每条线程都有各自的存储空间,存储各自的局部变量、方法参数、异常对象。 volatile的使用: public volatile boolean flag; 1)volatile在重排序(编译器、处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率)中的使用: 在以下情况下,即使两行代码之间没有依赖关系,也不会发生重排序: volatile读 若volatile读操作的前一行为volatile读/写

SQL语句优化技术分析

与世无争的帅哥 提交于 2019-12-25 04:48:00
SQL语句优化技术分析 最近几周一直在进行数据库培训,老师精湛的技术和生动的讲解使我受益匪浅。为了让更多的新手受益,我抽空把SQL语句优化部分进行了整理,希望大家一起进步。 一、操作符优化 1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐方案: 在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。 2、NOT IN操作符 此操作是强列不推荐使用的,因为它不能应用表的索引。 推荐方案: 用NOT EXISTS 方案代替 3、IS NULL 或IS NOT NULL操作 (判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。 推荐方案 :用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>’’等。不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。 4、>

android 8.1上新增hidl接口,从hal层往framework层传共享内存

女生的网名这么多〃 提交于 2019-12-24 16:15:25
android8.1和之前的版本有一个很大的不同,那就是8.1以后的版本将hal层和framework层分隔开来,不在同一个进程,不能直接通信。如果framework层需要和hal层通信,需要用到hidl接口。 之前我这边有个模块,在android6.0上时,需要在hal层通过ashmem_create_region来创建一块共享内存。然后将创建的共享内存句柄,通过binder,传送给framework层和app层。在android6.0上,一切都很顺利,framework层通过binder获取到hal层创建的共享内存后,mmap一下,就可以得到这块共享内存,并进行读写。 后来需要将这个模块移植到8.1上,将代码移过去后,发现之前能正常运行的binder,无法将hal层创建的共享内存fd传给framewrok层。结研究发现,这就是8.1上将hal和framework层分隔开来引起的。需要解决这个问题,只能引进hidl接口了。 hidl接口中,共享内存是通过IAllocator来创建的,然后再通过hidl_memory接收分配的对象,然后通过mapMemory到本进程中的IMemory对象中。hidl_memory类型会映射到 libhidlbase 中的 hidl_memory 类,该类表示未映射的共享内存。这是要在 HIDL 中共享内存而必须在进程之间传递的对象

进程、线程

别来无恙 提交于 2019-12-23 15:56:33
1 进程   程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。需要强调的是:同一个程序执行两次,那也是两个进程。    进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序 用来描 述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外 部特征,描述 进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 进程的基本状态: 1、就绪(Ready)状态 当进程已分配到除CPU以外的所有必要资源后,只要在获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。 2、执行状态 进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;再多处理机系统中,则有多个进程处于执行状态。 3、阻塞状态 正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即程序的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。 三种进程之间的转换图: 几种进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 #

进程间通信(IPC)

给你一囗甜甜゛ 提交于 2019-12-23 00:31:14
以下是阿鲤对Linux下进程间通信的总结,希望对大家有所帮助;若有误请慷慨指出。 因为每一个进程都要有一个独立的虚拟地址空间,在保证了进程的独立性同时,却使得进程间无法通信;所以必须要借助一定的方法进行进程间通信,阿鲤在这里主要介绍以下几种通信方式(以下均为SystemV标准) 1:管道 -- 用于进程间的数据传输 2:共享内存 -- 用于进程间的数据共享 3:消息队列 -- 用于进程间的数据传输 4:信号量 -- 用于时间进程间控制 注:以下的代码实现均为centos7环境; 一:管道 -- 用于进程间的数据传输 1:本质: 通过让多个进程都能访问到同一块内核中的缓冲区,通过半双工通信实现数据传输 (半双工通信:方向可选择的单项通信) 2:分类: 匿名管道 和 命名管道 3:匿名管道: 这块内核中的缓冲区没有标识符 3.1: 因为匿名管道没有标识符,故只能用于具有亲缘关系之间的进程通信; 3.2: 在创建管道时,操作系统会提供两个操作句炳(文件描述符),其中一个用于从管道读取数据,一个用于向管道写入数据;但是我们在使用时往往会关闭一个使用一个 3.3: 我们都知道子进程是通过复制父进程进行创建的所以,子进程也会复制到父进程所创建管道的操作句柄,故父子进程便可以通过父进程所创建的匿名管道进行进程间通信。 3.4: int pipe(int pipefd[2]): 创建一个匿名管道

RT_Thread应用7—信号量1

血红的双手。 提交于 2019-12-22 03:42:33
第十九章 信号量(第一部分) 一、线程同步 同步的介绍: 同步 是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步,那线程之间将是无序的。 线程同步的原因 在多任务实时系统中,一项工作的完成往往可以通过 多个任务 协调的方式共同来完成, 如一个任务从传感器中接收数据并且将数据写到共享内存中,同时另一个任务周期性的从共享内存中读取数据并发送去显示 如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它。这将引起数据一致性的问题, 例如:在显示线程 Thread#2 试图显示数据之前,传感器线程 Thread#1 还未完成数据的写入,那么显示将包含不同时间采样的数据,易造成显示数据的迷惑。 所以,需要先将传感器数据写入到共享内存完成后,才允许执行传感器数据从共享内存中读出的操作。 **对于操作/访问同一块区域,称之为临界区**。 任务的同步方式的 核心思想 都是: 在访问临界区的时候只允许一个(或一类)任务运行。 二、信号量基本概念 **概念:**信号量(Semaphore)是一种实现线程间通信的机制,实现线程之间同步或临界资源的互斥访问,常用于协助一组相互竞争的线程来访问临界资源。 信号量就像一把钥匙,把一段临界区给锁住,只允许有钥匙的线程进行访问:线程拿到了钥匙

第三季-第18课-共享内存通讯

不打扰是莪最后的温柔 提交于 2019-12-21 22:34:21
第18课-共享内存通讯 18.1 基本概念 共享内存是IPC机制中的一种. 顾名思义,它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式。即,可以让进程A和B同时访问一段内存。 18.2 函数学习 1. 创建/获取共享内存 (1)函数名 shmget (2)函数原型 int shmget(key_t key, size_t size ,int shmflg); (3)函数功能 创建或者获取共享内存,并返回其描述符。(allocates a shared memory segment)。 (4)所属头文件 #include<sys/ipc.h> #include<sys/shm.h> (5)返回值 成功:返回创建或者获取到的共享内存的描述符 失败:-1 (6)参数说明 key:共享内存的键值 size:共享内存的大小 shnflg:打开标志,如果使用了IPC_CREAT这个标志,就会新创建一个共享内存。 2. 映射共享内存 (1)函数名 shmat (2)函数原型 void *shmat(int shmid, const void *shmaddr, int shmflg); (3)函数功能 把shmid指定的共享内存映射到进程的地址空间里。(shared memory operations)。 (4)所属头文件 #include<sys/types.h>