分享

linux中进程间通信与同步

 木芙蓉的图书馆 2011-04-11
linux中进程间通信与同步
 

1.管道中还有命名管道和非命名管道之分,非命名管道只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式 
2.消息队列是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据。需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!! 
3.信号量,它与WINDOWS下的信号量是一样的,所以就不用多说了 
4.共享内存,类似于WINDOWS下的DLL中的共享变量,但LINUX下的共享内存区不需要像DLL这样的东西,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写 

几种方式的比较: 
1.管道:速度慢,容量有限,只有父子进程能通讯 
2.FIFO:任何进程间都能通讯,但速度慢 
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 
4.信号量:不能传递复杂消息,只能用来同步 
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的

从理论上来讲,同步也是通信的一个子集,它是一种不传递实际数据的通信,也就是告诉对方,现在还不能用某个变量等,或者通知对方现在可以用了 
从实现方式来讲,的确,同步和通信不是一回事儿,用于进程间的信号量就是用来同步的,而不能进行数据通信,共享内存区既是一种通信手段,但同时也需要同步与互斥,也就是说要保护共享内存区。

linux内核提供了两种机制进行互斥访问:锁与信号量。


1. 自旋锁
自旋锁禁止抢占,但本身可能导致无限延期、甚至死锁,通常通过抢占锁计数器进行控制。


2. 阅读程序/写程序锁
阅读锁可以被多重持有,写入锁只能被一个程序持有。


3. 顺序锁
有写入程序在等待时,拒绝新的读取程序进入。内核信号量计数的信号量, 由等待队列与计数器表示。

进程间通信

1. 信号
不支持进程间交换多于一个字的数据;
进程或者线程以三种方式中的一种处理信号,这三种方式分别是:
忽略信号;
捕捉信号;
执行内核为信号定义的默认动作,包括放弃、执行内存转储、简单忽略信号、停止和继续。

2. 管道
利用生产者消费者模型进行通信。

3. 套接字
主要类型包括:
流套接字,以字节流传输信息;
数据文报套接字,在数据文报的独立单元中传输信息。

4. 消息队列

5. 共享内存

6. System V信号量

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多