随笔分类 -  进程间通信

mmap映射文件至内存( 实现 共享内存 与 文件的另类访问 )
摘要:Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明: 头文件: <unistd.h><sys/mman.h> 原型: void *mmap(void *addr, size 阅读全文

posted @ 2018-03-04 21:51 AlanTu 阅读(11336) 评论(0) 推荐(0) 编辑

State Threads 回调终结者
摘要:上回写了篇《一个“蝇量级”C语言协程库》,推荐了一下Protothreads,通过coroutine模拟了用户级别的multi-threading模型,虽然本身足够“轻”,杜绝了系统开销,但这个库本身应用场合主要是内存限制的嵌入式领域,提供原生态组件太少,使用限制太多,比如依赖其它调用产生阻塞等。 阅读全文

posted @ 2018-03-03 22:57 AlanTu 阅读(230) 评论(0) 推荐(0) 编辑

POSIX 共享内存和 系列函数
摘要:在前面介绍了system v 共享内存的相关知识,现在来稍微看看posix 共享内存 和系列函数。 共享内存简单来说就是一块真正的物理内存区域,可以使用一些函数将这块区域映射到进程的地址空间进行读写,而posix 共享内存与system v 共享内存不同的是它是用虚拟文件系统(tmpfs)实现的,已 阅读全文

posted @ 2018-02-27 09:04 AlanTu 阅读(838) 评论(0) 推荐(0) 编辑

POSIX 消息队列 和 系列函数
摘要:一、在前面介绍了system v 消息队列的相关知识,现在来稍微看看posix 消息队列。 posix消息队列的一个可能实现如下图: 其实消息队列就是一个可以让进程间交换数据的场所,而两个标准的消息队列最大的不同可能只是api 函数的不同,如system v 的系列函数是msgxxx,而posix 阅读全文

posted @ 2018-02-27 09:02 AlanTu 阅读(726) 评论(0) 推荐(0) 编辑

用信号量实现进程互斥示例和解决哲学家就餐问题
摘要:一、我们在前面讲进程间通信的时候提到过进程互斥的概念,下面写个程序来模拟一下,程序流程如下图: 即父进程打印字符O,子进程打印字符X,每次打印一个字符后要sleep 一下,这里要演示的效果是,在打印程序的边界有PV操作,故每个进程中间sleep 的时间即使时间片轮转到另一进程,由于资源不可用也不会穿 阅读全文

posted @ 2018-02-26 14:40 AlanTu 阅读(2368) 评论(0) 推荐(0) 编辑

封装一个信号量集操作函数的工具
摘要:信号量的概念参见这里。 与消息队列和共享内存一样,信号量集也有自己的数据结构: struct semid_ds { struct ipc_perm sem_perm; /* Ownership and permissions */ time_t sem_otime; /* Last semop ti 阅读全文

posted @ 2018-02-26 14:38 AlanTu 阅读(512) 评论(0) 推荐(0) 编辑

System V 共享内存 和 系列函数
摘要:跟消息队列一样,共享内存也有自己的数据结构,如下: struct shmid_ds { struct ipc_perm shm_perm; /* Ownership and permissions */ size_t shm_segsz; /* Size of segment (bytes) */ 阅读全文

posted @ 2018-02-26 14:36 AlanTu 阅读(338) 评论(0) 推荐(0) 编辑

共享内存简介和mmap 函数
摘要:一、共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。 即每个进程地址空间都有一个共享存储器的映射区,当这块区域都映射到相同的真正的物理地址空间时,可以通过这块区域进行数据交换,例如共享库就是这么实现的,很多进 阅读全文

posted @ 2018-02-26 14:34 AlanTu 阅读(2024) 评论(0) 推荐(0) 编辑

消息队列实现回射客户/服务器和 msgsnd、msgrcv 函数
摘要:一、msgsnd 和 msgrcv 函数 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 功能:把一条消息添加到消息队列中 原型 int msgsnd(int msqid, const void *msgp, size 阅读全文

posted @ 2018-02-26 14:33 AlanTu 阅读(1520) 评论(0) 推荐(0) 编辑

消息队列内核结构和msgget、msgctl 函数
摘要:一、消息队列 1、消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 2、每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 3、消息队列与管道不同的是,消息队列是基于消息的,而管道是基于字节流的,且消息队列的读取不一定是先入先出。 4、消息队列也有管道一样的不足,就 阅读全文

posted @ 2018-02-26 14:30 AlanTu 阅读(5971) 评论(0) 推荐(0) 编辑

进程间通信概述
摘要:一、顺序程序与并发程序特征 顺序程序特征 顺序性 封闭性:(运行环境的封闭性) 确定性 可再现性 并发程序特征 共享性 并发性 随机性 二、进程互斥 1、由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥 2、系统中某些资源一次只允许一个进程使 阅读全文

posted @ 2018-02-26 14:27 AlanTu 阅读(278) 评论(0) 推荐(0) 编辑

Posix消息队列
摘要:消息队列可以认为是一个消息链表,某个进程往一个消息队列中写入消息之前,不需要另外某个进程在该队列上等待消息的达到,这一点与管道和FIFO相反。Posix消息队列与System V消息队列的区别如下:1. 对Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列的读则可以返回任 阅读全文

posted @ 2018-02-25 11:50 AlanTu 阅读(252) 评论(0) 推荐(0) 编辑

管道和FIFO
摘要:管道(pipe) 管道在Unix及Linux进程间通信是最基础的,很容易理解。管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动。管道是典型的单向通信,即计算机网络中所说的“半双工”。管道又名匿名管道,所以只能用在具有公共祖先的进程之间使用,通常使用在父子进程之间通 阅读全文

posted @ 2018-02-25 11:46 AlanTu 阅读(205) 评论(0) 推荐(0) 编辑

System V 共享内存区
摘要:1、概述 系统调用mmap通过映射一个普通文件实现共享内存。System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件。执行过程是先调用shmget,再调用shmat。对于每个共享的内存区,内核维护如下的信息结构,定 阅读全文

posted @ 2018-02-25 09:35 AlanTu 阅读(312) 评论(0) 推荐(0) 编辑

共享内存
摘要:共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 采用共享内存通 阅读全文

posted @ 2018-02-25 09:32 AlanTu 阅读(432) 评论(0) 推荐(0) 编辑

Posix共享内存区
摘要:1、概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就是)。 (2)共享内存区对象:先有shm_open打开一个Posix IPC名字(也可以是文件系统中 阅读全文

posted @ 2018-02-25 09:32 AlanTu 阅读(337) 评论(0) 推荐(0) 编辑

Posix信号量
摘要:1、概述 信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中, 阅读全文

posted @ 2018-02-25 09:30 AlanTu 阅读(324) 评论(0) 推荐(0) 编辑

System V 信号量
摘要:System V 信号量在内核中维护,其中包括二值信号量 、计数信号量、计数信号量集。二值信号量 : 其值只有0、1 两种选择,0表示资源被锁,1表示资源可用;计数信号量:其值在0 和某个限定值之间,不限定资源数只在0 1 之间;计数信号量集 :多个信号量的集合组成信号量集内核维护的信号量集结构信息 阅读全文

posted @ 2018-02-25 09:30 AlanTu 阅读(323) 评论(0) 推荐(0) 编辑

记录锁
摘要:1、概述 记录锁是读写锁的一种扩展类型,可用于亲缘关系或无亲缘关系的进程之间共享某个文件的读与写。被锁住的文件通过文件描述符进行访问,执行上锁的操作函数是fcntl,这种类型的锁通常在内核中维护。 记录锁的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区,即其锁定的是文件 阅读全文

posted @ 2018-02-25 09:26 AlanTu 阅读(680) 评论(0) 推荐(0) 编辑

读写锁
摘要:1、概述 读写锁与互斥量类似,不过读写锁允许更高的并行性。互斥量要么是锁住状态,要么是不加锁状态,而且一次只有一个线程对其加锁。读写锁可以有三种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可用同时占有读模式的读写锁。读写锁也叫做共享-独占 阅读全文

posted @ 2018-02-24 16:04 AlanTu 阅读(238) 评论(0) 推荐(0) 编辑

导航