一般我们写的程序都是以单个进程的方式来运行的,比较少涉及到多进程。特别是在windows下,因为Windows是按照线程来分配CPU时间片的,线程是最小的调度单位,所以在Windows下更多的用到多线程,在同一个进程里创建多个线程来执行不同的任务,达到充分利用CPU的目的。
线程之间可以共享进程的资源
,比如内存、变量,但是多线程有一个不好的地方,由于这些线程是在同一个进程空间里执行,所以
只要一个线程奔溃,整个进程也就奔溃了(#add 多线程的弱点)
,程序就退出了。多进程由于是在不同的进程空间里,
一个进程奔溃,不会影响到其它的进程
,但是进程之间要交换信息的话,就比较麻烦了,不像多线程可以简单的通过一个全局变量来通讯。为了解决进程间交换信息的问题,所以操作系统提供了进程间通讯(
IPC
)的技术。
1、管道(Pipe)
一个进程往管道里写数据,另一个进程从管道里取数据。管道又可以分为
匿名管道
,匿名管道只能在父、子进程之间通讯。还有一种
命名管道
(named pipes),Linux下叫做FIFO,
命名管道可以在任意进程之间通讯。
2、油槽(Slot)
Linux下叫做
消息队列
(Message)。就像我们日常通过邮局寄送信件。一个进程寄送,另一个进程接收。
3、消息(Message)
Linux下叫做
信号
(Signal)。Windows是消息驱动的,进程可以调用WIN32 API函数SendMessage或者PostMessage向另一个进程发送消息,Windows系统也可以向进程发送消息。
Linux下可以通过kill、raise、alarm、pause这些信号处理系统调用来实现。
4、共享内存(Shared Memory)
进程之间通过共享一块内存的方式来交换数据。
5、Socket
通常我们使用socket来进行网络通讯,一方作为客户机,另一方作为服务器。同样的,socket也可以作为进程之间通讯的一种方式。
以上方式是Windows和Linux共有的通讯方式。Windows下进程之间还可以通过
系统剪贴板
的方式来通讯,一个进程把数据复制到剪贴板,另一个进程把数据从剪贴板上粘贴过来。
其实除了以上这些比较常用的通讯方式,个人认为还可以通过文件的方式。一个进程把数据写入文件,另一个进程从文件里读取数据。
当然还可以通过一个中间件的方式,比如Windows下的msmq(消息队列)中间件,Apache上也提供了一个用Java写的开源消息中间件
Apache ActiveMQ
。
相关文章
- linux和windows下安装python拓展包及requirement.txt安装类库
- 虚拟机中如何Linux系统如何访问PC硬盘中的文件(如何将windows下的文件夹挂载到linux虚拟机下)
- Linux下telnet windows主机出现乱码
- linux下使用mount命令挂载windows共享目录出错的解决办法
- 读写文本文件时,在windows系统正常,在linux下出现乱码!
- windows下SSH客户端远程访问Linux出现错误
- Windows下fabric sdk连接Linux上fabric网络的调试过程
- windows下部署.netcore+docker系列一(安装linux (ubuntu18.4))
- Windows下的eclipse(with Hadoop Plug-in)向Linux集群提交MapReduce任务
- 把windows下的字体安装到Linux系统下的方法介绍