每个进程有自己的地址空间,两个进程中的地址即使值相同,实际指向的位置也不同。进程间的通信一般通过操作系统的公开区进行。
同一进程中的线程因属于同一地址空间,可直接通信,不仅是系统内部独立运行的实体,而且是独立竞争资源的实体。
线程也被称为轻权进程,同一进程的线程共享地址空间,没有通信的必要,但是要做好同步/互斥,保护共享的全局变量。
线程拥有自己的栈。同步/互斥是原语primitives(在操作系统中叫原语,是执行过程中不可被打算的基本操作),而进程通信无论是信号,管道pipe还是共享内存,都是操作系统保证的,是系统调用。
线程间通信:由于多线程共享地址空间和数据空间,所以多个线程间的通信是一个线程的数据可以直接提供给其他线程使用,而不必通过操作系统(内核)的调度。
进程间的通信:他的数据空间的独立性决定了它的通信比较复杂,需要通过操作系统。以前进程间的通信只能单机版,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信就不局限于单台计算机了,实现网络通信。
进程间的通信方式:
管道:pipe,一种半双工的通信方式,数据只能单向流动,而且只能在具有亲爱关系的进程间进行。进程间的亲缘关系通常是指父子进程关系。有名管道:namepipe,一种半双工的通信方式,允许无亲缘关系进程间的通信。信号量:semaphore,信号量是一个计数器,可以用来控制多个线程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源,其他进程也访问该资源,因此,主要作为进程间及统一进程内不同线程之间的同步手段。消息队列:messagequeue,消息队列是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能传递无格式字节流及缓冲区大小受限制等缺点。信号:sinal,是一种比较复杂的通信方式,用于通知接收线程某个事件已经发生。共享内存:shared memory,共享内存就是映射一段能够被其他进程所访问的内容,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,,它是针对其他进程间通信方式运行效果低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。套接字:socket,与其他通信机制不同,它可用于不同计算机间的进程通信。
线程间的通信方式:
锁机制:包括互斥锁、条件变量、读写锁。互斥锁提供了以排他方式防止数据结构被并发修改的方法;读写锁允许多个线程同时读取共享数据,而对写操作是互斥的;条件变量可以以原子的方式阻塞线程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。信号量:semaphore,包括无名线程信号量和命名线程信号量。信号:sinal,类似进程间的信号处理
线程间的通信目的主要用于线程同步,所以线程没有类似进程通信中用于数据交换的通信机制。