ipc
文章平均质量分 74
ctthuangcheng
这个作者很懒,什么都没留下…
展开
-
UNIX环境高级编程——管道读写规则和pipe Capacity、PIPE_BUF
一、当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止。O_NONBLOCK enable:read调用返回-1,errno值为EAGAIN。示例程序如下:#include#include#include#include#include#include#include#include#include#define ERR转载 2013-07-07 16:27:20 · 2129 阅读 · 0 评论 -
UNIX环境高级编程——system V信号量
system V信号量通过定义如下概念给信号量增加了另外一级复杂度。计数信号量集:一个或多个信号量(构成一个集合),其中每个都是计数信号量。每个集合的信号量数存在一个限制,一般在25个数量级。1.semget函数 semget函数创建一个信号量集或访问一个已存在的信号量集。#include int senget(key_t key,int nsems,int oflag);nsems参数指原创 2013-07-07 18:20:44 · 1726 阅读 · 0 评论 -
UNIX环境高级编程——存储映射I/O(mmap函数)
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通原创 2013-07-09 10:02:48 · 3635 阅读 · 2 评论 -
UNIX环境高级编程——无名管道和有名管道
一、进程间通信每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。如下图所示。二、管道是一种最基本的IPC机制,由pipe函数创建:#inclu转载 2013-07-07 15:12:18 · 2085 阅读 · 0 评论 -
UNIX环境高级编程——创建与打开IPC通道
创建或打开一个IPC对象的三个getXXX函数的第一个参数key是类型为key_t的IPC键,返回值identifier是一个整数标识符。该标识符不同于ftok函数的id参数。对于key值,应用程序有两种选择。(1)调用ftok,给它传递pathname和id。(2)指定key为IPC_PRIVATE,这将保证创建一个新的,唯一的IPC对象。所有三个getXXX函数都有一个名为oflag的参数,它原创 2013-07-07 18:11:42 · 1672 阅读 · 0 评论 -
UNIX环境高级编程——管道和FIFO的额外属性
一个描述符能以两种方式设置成非阻塞。(1)调用open时可以指定O_NONBLOCK标志。 writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0);(2)如果一个描述符已经打开,那么可以调用fcntl以启用O_NONBLOCK标志。对于管道来说,必须使用这种技术,因为管道没有open调用,在pipe调用中也无法指定O_NONBLOCK标志。使用fcntl时原创 2013-07-07 16:12:58 · 2125 阅读 · 0 评论 -
UNIX环境高级编程——进程间通讯方法整理
一.无名管道pipe#include int pipe(int fd [2])二.fifo#include int mkfifo(const char *path, mode_t mode);三.信号#include void (*signal(int sig, void (*func)(int)))(int);#include int sigaction(int sig, const s转载 2013-07-07 18:45:00 · 1487 阅读 · 0 评论 -
UNIX环境高级编程——System V 共享内存区
对于每个共享内存区,内核维护如下的信息结果,它定义在头文件中: struct shmid_ds { struct ipc_perm shm_perm; /* Ownership and permissions */ size_t shm_segsz; /* Size of segment (原创 2013-07-08 14:19:06 · 1738 阅读 · 0 评论 -
UNIX环境高级编程——进程间通信概念
进程间通信 --- IPC1. 进程间通信的目的a. 数据传输: 一个进程需要将他的数据发送给另一个进程b. 资源共享: 多个进程之间共享同样的资源c. 通知事件: 一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。d. 进程控制: 有些进程希望完全控制另一个进程的执行(如debug进程),此时控制进程希望能拦截另一个进程的所有操作,并能够及时直到它的状态改变。2. linux进程间原创 2013-07-07 14:46:34 · 1482 阅读 · 0 评论 -
UNIX环境高级编程——管道和FIFO限制
系统加于管道和FIFO的唯一限制为:OPEN_MAX 一个进程在任意时刻打开的最大描述符数;PIPE_BUF 可原子的写往一个管道或FIFO的最大数据量。 OPEN_MAX的值可通过调用sysconf函数查询。它通过可通过执行ulimit命令(Bourne shell或Korn Shell)或limit命令(C shell)从shell中修改。它也可以通过调用setr原创 2013-07-07 17:51:54 · 1650 阅读 · 0 评论 -
UNIX环境高级编程——system V消息队列
system V消息队列使用消息队列标识符标识。具有足够特权的任何进程都可以往一个给定队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息。 对于系统中的每个消息队列,内核维护一个定义在头文件中的信息结构。struct msqid_ds { struct ipc_perm msg_perm; struct msg *msg_first; /* first mess原创 2013-07-08 10:47:48 · 2444 阅读 · 0 评论 -
UNIX环境高级编程——IPC总结
IPC主要包括:管道,消息队列,信号量,共享内存, 套接字(SOCKET)。一、IPC对象的持久性每种IPC机制都会借助一种数据结构,这种数据结构的实例称为该IPC机制的对象(相应的,用于同步互斥的数据结构的实体也可以称为该机制的对象)。理清IPC对象的持久性,有助于理解相应的IPC的工作机制。1.对象持久性大致上IPC对象的持久性可以分为三种:进程持久性:具有这种持久性的对象在持有它的最后一个进原创 2013-07-15 17:16:12 · 2183 阅读 · 0 评论 -
UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测
去原创 2013-07-10 11:37:20 · 3711 阅读 · 0 评论 -
POSIX 消息队列相关问题
一、查看和删除消息队列要想看到创建的posix消息队列,需要在root用户下执行以下操作:# mkdir /dev/mqueue# mount -t mqueue none /dev/mqueue删除队列使用 rm 命令即可。二、查看和调整消息队列限制参考 《Linux进程通信之POSIX消息队列》1、查看消息队列大小的限制# ulimit -a |grep messagePOSIX messag转载 2016-04-22 14:29:48 · 7797 阅读 · 0 评论 -
由mmap引发的SIGBUS
一直以来都觉得使用mmap读文件是非常高效、非常优雅的做法(参见《从"read"看系统调用的耗时》)。mmap之后,就可以通过内存访问的方式访问到文件里的内容,省去了read这样的系统调用。却不曾想过,mmap以后,如果读文件出错会发生什么……今晚看到一篇介绍apache bug的文章,里面说到,apache使用mmap来实现对静态文件的访问。在读文件之前,apache使用stat系统原创 2013-05-12 00:32:01 · 4730 阅读 · 2 评论 -
linux并发控制之自旋锁
自旋锁是一种对临界资源进行互斥访问的典型手段,其名来源于它的工作方式。通俗的讲,自旋锁就是一个变量,该变量把一个临界区标记为“我当前在运行,请等待”或者标记为“我当前不在运行,可以被使用”, 如果A执行单元首先获得锁,那么当B进入同一个例程时将获知自旋锁已被持有,需等待A释放后才能进入,所以B只好原地打转(自旋)。特点: 1.自旋锁主要针对SMP或单CPU且内核可抢占的情转载 2013-01-31 17:14:14 · 1157 阅读 · 0 评论 -
linux并发控制之读写自旋锁
读写自旋锁(rwlock)是一种比自旋锁粒度更小的自旋锁机制,它保留了“自旋”的概念。但是在写操作方面,只能最多有一个写进程,在读方面,同时可拥有多个执行单元,当然读和写也不能同时进行。一句话:防写不防读 理解推荐: http://blog.sina.com.cn/s/blog_6d7fa49b01014q86.html操作:定义于#include或#include转载 2013-01-31 17:15:06 · 1735 阅读 · 0 评论 -
linux并发控制之RCU
RCU:读-拷贝-更新众所周知,为了保护共享数据,需要一些同步机制,如自旋锁(spinlock),读写锁(rwlock),它们使用起来非常简单,而且是一种很有效的同步机制,在UNIX系统和Linux系统中得到了广泛的使用,但是它存在两个问题。1.它的开销相对于CPU速度而言就越来越大随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问转载 2013-01-31 17:16:38 · 1732 阅读 · 0 评论 -
linux并发控制之原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。分为两类:整型原子操作 和 位原子操作。特点:1.任何情况下操作都是原子的。2.都依赖底层的CPU的原子操作来实现,所以和CPU架构密切相关。注意: 1.原子操作在不同体系架构实现的方法不同,基本采用汇编实现 2.上述的整数原子函数集仅针对32位,内核中关于64位有另一套函数 3转载 2013-01-31 17:23:12 · 3662 阅读 · 0 评论 -
linux并发控制之总章
一.概念1.并发(concurrency)指多个执行单元同时,并行被执行。2.并发的执行单元对共享资源,(比如说,硬件资源,全局变量,静态变量等)访问很容易导致竞态(race conditions)。举个简单事例,古代皇帝有很多妃子,皇帝第一个时辰是宜妃的,第二个时辰是萱妃,最后时间是皇后的,这是原来正常的顺序。假如宜妃让皇帝赖床了,萱妃不爽了,然后萱妃时间冲突了,皇后也不爽了,竞争就转载 2013-01-31 17:24:02 · 1163 阅读 · 0 评论 -
linux并发控制之信号量
信号量(semaphore)是用于保护临界区的一种常用方法,它的使用方式与自旋锁类似与自旋锁相同的是:只有得到信号量的进程才能执行临界区的代码与自旋锁不同的是:当获取不到信号量的时候,进程不会在原地打转,而是进入休眠等待状态;理解:定义于#includestruct semaphore { spinlock_t lock; unsigned int count;转载 2013-01-31 17:08:02 · 1149 阅读 · 0 评论 -
linux并发控制之读写信号量
读写信号量与信号量之间的关系类似于自旋锁与读写自旋锁。读写信号量可能会引起进程阻塞,但是它允许N个读执行单元同时访问共享资源,而最多只允许有一个写执行单元访问共享资源;因此,读写信号量是一种相对放宽条件的、粒度稍大于信号量的互斥机制。注意:信号量不允许任何操作之间有并发。理解:定义于#include 实际上在arch/X86/include/asm/rwsem.h转载 2013-01-31 17:11:21 · 2007 阅读 · 0 评论 -
linux并发控制之顺序锁
顺序锁是对读写锁的一种优化。 1.读执行单元绝对不会被写执行单元阻塞。即读执行单元可以在写执行单元对被顺序锁保护的共享资源进行写操作的同时仍然可以继续读,而不必等待写执行单元完成之后再去读,同样,写执行单元也不必等待所有的读执行单元读完之后才去进行写操作 2.写执行单元与写执行单元之间仍然是互斥的。 3.如果读执行单元在读操作期间,写执行单元已经发生了写操作,那么,读转载 2013-01-31 17:19:06 · 1646 阅读 · 0 评论 -
linux并发控制之中断屏蔽
在单CPU范围内避免竞态的一个简单方法。注意: 中断对系统正常运行很重要,长时间屏蔽很危险,所以中断屏蔽后应尽可能快的执行完毕。 宜与自旋锁联合使用。使用 local_irq_disable() local_irq_enable()只能禁止和使能本地CPU的中断,所以不能解决多CPU引发的竞态 local_i转载 2013-01-31 17:22:24 · 1403 阅读 · 0 评论 -
linux并发控制之完成量
完成量:表示一个执行单元需要等待另一个执行单元完成某事后方可执行。1.它是一种轻量级机制,为了完成进程间的同步而设计2.使用完成量等待时,调用进程是以独占睡眠方式进行等待的3.不是忙等待理解:定义于#include其结构体为struct completion {unsigned int done;wait_queue_head_t wait;};转载 2013-01-31 17:12:11 · 1643 阅读 · 0 评论 -
进程间通信:用信号量实现对共享内存读写顺序的控制
这本是一道题:一本是一个全局变量来做的控制共享内存通信方式,一个已经实现的信号量通信,最终的结果是让这两个掺和在一起。用信号量来控制共享内存通信的读写顺序。 原本信号量通信方式的函数在这是,原本的共享内存程序在这里。 做的最新的结果是可以通信了,但是在客户端有一点点异常,就是在服务器端还没有释放信号量,但是客户端不可以获取的,这使我很疑惑。服转载 2013-02-01 15:08:11 · 1773 阅读 · 0 评论