一般我们写的程序都是以单个进程的方式来运行的,比较少涉及到多进程。特别是在windows下,因为Windows是按照线程来分配CPU时间片的,线程是最小的调度单位,所以在Windows下更多的用到多线程,在同一个进程里创建多个线程来执行不同的任务,达到充分利用CPU的目的。线程之间可以共享进程的资源,比如内存、变量,但是多线程有一个不好的地方,由于这些线程是在同一个进程空间里执行,所以只要一个线程崩溃,整个进程也就崩溃了,程序就退出了。多进程由于是在不同的进程空间里,一个进程崩溃,不会影响到其它的进程,但是进程之间要交换信息的话,就比较麻烦了,不像多线程可以简单的通过一个全局变量来通讯。为了解决进程间交换信息的问题,所以操作系统提供了进程间通讯(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。

最新文章

  1. 向nginx发送reopen信号以重新打开日志文件
  2. C#打开关闭数据库连接
  3. T-SQL Transact-SQL 编程
  4. SQL Server Profiler使用方法
  5. jQuery之$('#id')和$('#'+id)
  6. 解决tomcat一闪而过问题
  7. 01-实现图片按钮的缩放、动画效果(block的初步应用)
  8. MVC基础知识-持续更新....
  9. 机器学习真的可以起作用吗?(2)(以二维PLA算法为例)
  10. Java eclipse生成doc文档
  11. 基于Maven的spring_security入门
  12. 《University Calculus》-chaper8-无穷序列和无穷级数-泰勒定理的证明
  13. hibernate 3.* C3P0配置 以及为什么需要连接池!
  14. FPGA知识大梳理(二)verilogHDL语法入门(1)
  15. js获取鼠标点击的对象,点击另一个按钮删除该对象
  16. Linux磁盘 - fdisk,partprobe, mkfs, mke2fs, fsck, badblocks, mount, mknod
  17. day 12 装饰器
  18. 深入理解AMQP协议转载
  19. memcached程序端口监控脚本
  20. 腾讯云JavaWeb环境配置

热门文章

  1. Hadoop命令手册
  2. android自定义控件实例
  3. 选择问题 and 字谜游戏问题
  4. Linux内核(9) - 精华版 之 方法论
  5. WinForm窗体键盘事件,支持方向键和回车键
  6. zookeeper的部署
  7. redis 只允许指定的额内网IP访问,其余的外网IP不允许访问
  8. hadoop详细了解5个进程的作用
  9. [elk]停电日志离线恢复故障处理-elk环境极速搭建
  10. 史上最全的CDN内容分发网络实战技巧(网络优化)