linux进程间通讯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux进程间通讯
管道(FIFO):
管道可分为命名管道和非命名管道(匿名管道),匿名管道只能用于父、子进程间通讯,命名管道可用于非父子进程。

命名管道就是FIFO,管道是先进先出的通讯方式。

消息队列:
消息队列用于2个进程间通讯,首先在1个进程中创建1个消息队列,然后可向消息队列中写数据,而另一进程可从该消息队列中读取数据。

注意,消息队列是以创建文件的方式建立的,若1个进程向某消息队列中写入数据后,另一进程并未读取这些数据,则即使向消息队列中写数据的进程已退出,但保存在消息队列中的数据并未消失,也就是说下次再从这个消息队列中读数据时,还是会读出已退出进程所写入的数据。

信号量:
linux中的信号量类似于windows中的信号量。

共享内存:
共享内存,类似于windows中dll的共享变量,但linux下的共享内存区不需要象DLL这样的东西,只要先创建1个共享内存区,其它进程按照一定步骤就能访问到这个共享内存区中的数据(可读可写)。

信号——signal
套接字——socket
各种ipc机制比较:
1.匿名管道:速度较慢,容量有限,且只有父、子进程间能通讯;
2.命名管道(FIFO):任何进程间都能通讯,但速度较慢;
3.消息队列:容量受系统限制,且要对读出的消息进行测试(读出的是新写入的消息,还是以前写入的,
尚未被读取的消息);
4.信号量:不能传递复杂信息,只能用来同步;
5.共享内存:容量大小可控,速度快,但共享内存区不包含同步保护,对共享内存区的访问需由用户实
现同步保护。

另外,共享内存同样可用于线程间通讯,不过没必要,线程间本来就已共享了同一进程内的一块内存。

线程间同步方法:
1.临界区:使多线程间串行访问公共资源或1段代码,速度较快,适合控制数据访问;
2.互斥量:为同步对共享资源的单独访问而设计的;
3.信号量:为控制1个具有有限数量用户资源而设计;
4.事件对象:用来通知线程有一些事件已发生,从而启动后继任务。

1.事件对象(Event):
用事件(Event)来同步线程是最具弹性的。

1个事件有2种状态:激发态和未激发态,也称为信号态和无信号态。

事件又分2种类型:手动重置事件和自动重置事件。

手动重置事件被设置为激发态后,会唤醒所有等待的线程,且一直保持为激发状态,直到程序重新把它设置为未激发状态. 自动重置事件被设置为激发态后,会唤醒“1个”等待中的线程,然后自动恢复为未激发状态. 所以用自动重置事件来同步2个线程比较理想。

2、临界区(Critical Section):
使用临界区的第1个忠告就是不要长时间锁住1个资源,进入临界区后必须尽快离开,并释放资源。

临界区的1个缺点就是:Critical Section不是1个核心对象,无法获知进入临界区的线程是生是死,若线程在临界区中崩溃,没有释放临界资源,系统无法获知,且没有办法释放该临界资源。

这个缺点在互斥体(Mutex)中得到了弥补。

3、互斥体(Mutex):
互斥体的功能和临界区类似。

区别是:Mutex所花费的时间比Critical Section多,但Mutex是核心对象(Event、Semaphore也是),可以跨进程使用,且等待1个被锁住的Mutex可以设定TIMEOUT,不会像Critical Section那样无法得知临界区域的情况,而一直死等。

4、信号量(Semaphore):
信号量是最具历史的同步机制,信号量是解决producer/consumer(生产者/消费者)问题的关键要素。

线程通信:
1.全局变量:
进程中的线程间共享内存,这是比较常用的通信方式和交互方式。

注:全局变量最好使用volatile来修饰,以防编译器对变量进行优化。

2.Message消息机制:
常用的Message通信接口主要有2个:PostMessage()和PostThreadMessage():
●PostMessage()为线程向主窗口发送消息;
●PostThreadMessage()是任意2个线程间的通信接口。

3.事件对象——CEvent对象
同步与互斥比较:
同步,是指不同进程中的若干代码段,它们必须按照规定顺序来运行,这种先后次序依赖于要完成的特定任务。

互斥,是指不同进程中的若干代码段,当某进程运行其中1个代码段时,其它进程就不能运行它们之中的任一代码段,只能等到该进程退出这个代码段后才可以运行。

死锁:
产生死锁的原因:
1.竞争资源;
2.进程推进顺序不当。

产生死锁的必要条件:
1.互斥条件:1个资源在一段时间内只能被1个进程所使用,具有排它性;
2.请求和保持:1个进程在请求新资源而阻塞时,对已获得资源又保持不放;
3.不剥夺:内核无法剥夺进程已获得的资源,只能由进程自己释放;
4.环路等待:在发生死锁时,必然存在1个进程-资源的环形链,即进程集合{P1,P2,...,Pn}中
的P1正在等待P2占用的资源,P2正在等待P3占用的资源,...,Pn正在等待P1占用的资源
(ABBA型死锁)。

相关文档
最新文档