一 进程通信
进程通信是指进程之间信息的交换。当进程之间需要传送大量数据时,需要利用操作系统提供的高级通信工具。其中windows和linux系统有不同的通信工具。
windows:管道、共享内存、消息队列、socket。
linux:管道、信号、消息队列、共享内存、socket。
(1)管道
管道连接一个读进程和一个写进程以及实现两个进程通信的一个共享文件(管道)。写进程向管道中输入字符流数据,读进程从管道中读字符流数据。为了协调通信,管道必须提供互斥、同步以及确认对方是否存在的机制。
(2)共享内存
在内存中划出一块共享区域,通信进程可以通过读或者写共享区进行进程之间的通信。还有一种方式是基于共享的数据结构,即定义一个共享数据结构,通信进程之间共用这个数据结构。
(3)消息队列
建立一个消息的链表,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程可以从进程中读走队列的消息。
(4)socket
主要用于网络中两个进程之间通信。通信双方豆被分配了一个套接字。一个属于发送进程,一个属于接收进程。每个套接字都有一个唯一的套接字号,可以确保通信双方逻辑链路的唯一性。
二 线程同步
首先说明一下我个人对于通信和同步的理解。不论是进程还是线程,都涉及到同步和通信。我个人认为,通信是指两个进程或者线程之间交换信息,而进程同步或者线程同步,在本质上其实也是一种通信。因此同步和互斥都属于通信的范畴。只不过通信一般是指大量数据的交换,可称为高级通信;而同步属于一种低级通信。以信号量机制来说明其低级表现在:
(1)效率低。每次交换的消息只有一个。
(2)通信对用户不透明。需要程序员自己去实现同步和互斥机制以及数据的传送。
线程通信方式主要有:临界区、互斥量、信号量、事件。
(1)临界区
确保在某一时刻只有一个线程可以访问数据的简便方法。在任意时刻只允许一个线程对临界资源进行访问。多个线程同时访问临界区时,只有一个线程可以进入临界区,其它线程线程将会被挂起,直到进入临界区的线程离开。临界区被释放后,其它线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。
(2)互斥量
只有拥有互斥对象的线程才具备访问资源的权限。由于互斥对象只有一个,因此只有当拥有互斥对象的线程释放对象后,其它线程才可以获得互斥对象并访问资源。互斥量使用范围广,可以在同一进程中的线程之间,也可以在不同进程中的线程之间。
(3)信号量
(4)事件
事件对象能够通过通知操作的方式来保持线程的同步,并可以实现不同京城中线程的同步。
参考文献:
计算机操作系统 ;
VC++深入详解 ;
深入理解计算机操作系统。