1.进程与线程区别
(1)定义
进程是资源拥有的基本单位,线程是独立调度的基本单位,一个进程中可以有多个线程。
(2)开销
创建与撤销进程要为之分配与回收资源,如内存空间I/O设备等,开销远大于线程。而进程切换的时候涉及当前CPU环境的保存及新进程CPU环境设置,而线程切换仅需保存和设置少量寄存器内容,因此开销很小。
(3)资源
进程地址空间之间相互独立,同一进程的各个进程共享进程地址空间。
2.进程间通信
(1)管道
管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子)。Linux的管道主要包括两种:无名管道和有名管道。这一节主要讲无名管道,首先介绍一下这两个管道。(特点很重要啊!)
1、无名管道
无名管道是Linux中管道通信的一种原始方法,如图一(左)所示,它具有以下特点:
① 它只能用于具有亲缘关系的进程之间的通信(也就是父子进程或者兄弟进程之间);
② 它是一个半双工的通信模式,具有固定的读端和写端;
③ 管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read()、write()等函数。但它不是普通的文件,并不属于其他任何文件系统并且只存在于内存中。
2、有名管道(FIFO)
有名管道是对无名管道的一种改进,如图1(右)所示,它具有以下特点:
① 它可以使互不相关的两个进程间实现彼此通信;
② 该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当做普通文件一样进行读写操作,使用非常方便;
③ FIFO严格地遵循先进先出规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则是把数据添加到末尾,它们不支持如 lseek()等文件定位操作。
(2)信号(Signal)
信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。
(3)报文(Message)队列(消息队列)
消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
(4)共享内存
使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
(5)信号量(semaphore)
主要作为进程间以及同一进程不同线程之间的同步手段。
(6)套接口(Socket)
更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。