对于软件开发人员来说,不管你做的是前端、WEB、中间件、底层,还是其他,掌握进程相关知识都是非常重要的。最近,我被问到了一个问题:进程间通信的方式都有哪些?作为一位多年的开发者,我竟然一时答不上来(相当的尴尬)。后来,我在网上查阅了相关资料,算是对这个问题有了大致的了解。在这篇文章中,根据查阅到的资料,我介绍一下进程及进程间通信的方式,供大家温习基础知识,也希望大家在从事开发工作的同时,不要忘了强化自己的基础知识。
进程简介
进程的概念已经出现有半个多世纪了,它是60年代初首先在麻省理工学院的MULTICS系统和IBM公司的CTSS/360系统中引入的。
进程的定义有广义和狭义之分。狭义的进程是指正在运行的程序的实例;广义的进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是操作系统动态执行的基本单元。
关于进程,需要注意的有两点:***,进程是一个实体,每一个进程都有它自己的地址空间;第二,进程是一个“执行中的程序”(只有当操作系统执行它的时候,它才能成为一个活动的实体)。
进程间通信的方式
进程之间通信的方式有以下8种:
***种,无名管道(pipe):它是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用(进程的亲缘关系通常是指父子进程关系)。
第二种,高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式称为高级管道方式。具体的程序执行可参考这篇文章:http://blog.csdn.net/zhouzhaoxiong1227/article/details/50403299。
第三种,有名管道(named pipe):它也是半双工的通信方式,但是它允许无亲缘关系的进程进行通信。
第四种,消息队列(message queue):它是一种数据结构,存放在内核中并由消息队列标识符标识;它克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。具体的队列操作可参考这篇文章:http://blog.csdn.net/zhouzhaoxiong1227/article/details/52186663
第五种,信号量(semaphore):它是一个计数器,可以用来控制多个进程对共享资源的访问;它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,它主要作为进程间以及同一进程内不同线程之间的同步手段。
第六种,信号(signal):它是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
第七种,共享内存(shared memory):它是由程序映射的一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问;它是针对其他进程间通信方式运行效率低而专门设计的,往往与其他通信机制(如信号量)配合使用来实现进程间的同步和通信。
第八种,套接字(socket):它也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。具体的socket的消息流程可参考这篇文章:http://blog.csdn.net/zhouzhaoxiong1227/article/details/46416555。
【本文是51CTO专栏作者“周兆熊”的原创文章,作者微信公众号:周氏逻辑(logiczhou)】