一、进程和线程
进程和线程的本质区别在于:多进程中每个进程有自己的地址空间,而同一进程的多线程则共享地址空间。
进程间通信:由于每个进程有各自不同的用户地址空间,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间中拷贝到缓冲区,进程2再从缓冲区把数据读走。内核提供的这种机制就是进程间通信。
线程间通信:由于多线程共享地址空间和数据空间,所以线程间数据可以直接相互使用,而不必通过操作系统(也就是内核的调度)。线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
二者通信区别:
因二者的本质区别,只有进程间需要通信,同一进程的线程共享地址空间,没有通信的必要,但要做好同步/互斥,以保护好共享全局变量。而进程间通信无论是信号,管道pipe还是共享内存都是由操作系统保证的,是系统调用。
二、通信
在Linux系统中一切皆文件,管道也是一种文件(特殊文件),可以使用mkfifo命令创建一个管道文件。管道实现进程通信就是让两个进程都能访问该文件。
PIPE
必须有“亲缘关系”的进程之间才可以使用匿名管道来完成进程间通信。父子进程当然可以,“孙子”进程也是可以的。
其本身自带同步互斥效果。所以,也可以用于同一进程下的两个线程间的通信。
单工模式
实例:
linux 线程或进程之间通过管道通信(pipe)
FIFO
可以是半双工模式,也可以是全双工模式。
阅读(3920) | 评论(0) | 转发(0) |