1)需要频繁创建销毁的优先用线程。
实例:web服务器。来一个建立一个线程,断了就销毁线程。要是用进程,创建和销毁的代价是很难承受的。
2)需要进行大量计算的优先使用线程。
所谓大量计算,当然就是要消耗很多cpu资源,为最大限度利用cpu,并且交换数据方便,这种情况选线程是最合适的。
实例:图像处理、算法处理
3)强相关的处理用线程,弱相关的处理用进程。
什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。
一般的server需要完成如下任务:消息收发和消息处理。消息收发和消息处理就是弱相关的任务,而消息处理里面可能又分为消息解码、业务处理,这两个任务相对来说相关性就要强多了。因此消息收发和消息处理可以分进程设计,消息解码和业务处理可以分线程设计。
4)可能扩展到多机分布的用进程,多核分布的用线程。
5)都满足需求的情况下,用你最熟悉、最拿手的方式。
- 一个程序至少有一个进程,一个进程至少有一个线程。
- 一个线程可以创建和销毁另一个线程;同一个进程中的多个线程之间可以并发执行。
- 每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在进程中,同样由内核调度。
linux下进程间通信IPC的几种主要手段简介:
- 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
- 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;
- 报文队列(消息队列):消息队列是消息的链接表,包括Posix消息队列,system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
- 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
- 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
Chrome浏览器: 采用独立进程设计,浏览器、标签页、插件和扩展都是独立进程,所以Chrome内核浏览器即使网页崩溃,其他功能都可以正常使用,整个浏览器也不会受到影响。为了安全、稳定、性能。
1、浏览器主进程 2、渲染进程:对页面的HTML、JavaScript和CSS等部分内容进行渲染,一般一个进程渲染一个站点的多个标签页 3、插件进程:浏览器中如AdobeFlash Player等插件的进程 4、扩展进程:各种用户自己添加的扩展程序,比如比较出名的Adblock Plus
多进程需要面对的问题包括:
- 内存占用大,因为无法像多线程模型共享公共的内存开销,比如使用的库,或者某些全局的数据缓存等。
- 进程间通讯的成本大。特别是使用共享内存交换数据的成本。
- 进程启动的开销大。