Linux 下进程和线程的选择问题
因为 Linux 对进程的处理异常高效,而线程则有时候会遇到诸如锁定(locking)之类的相关问题,所以通常在 Linux 下总是会去优先使用进程。
但当遇到进程和线程处理能力相当的情况时,比如我要写一个 web 服务器,该如何选择呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
1、Linux内核其实是用进程来实现线程的,所以在内核某些方面的处理,两者资源和开销可能差不多,但其它平台的实现就不一定了。
2、如果要实现一个web服务器,一个client连接对应一个线程,和一个client连接对应一个进程,两者有很大的不同,一个系统最多的进程数是有限制的,数量也不会太多,而线程真的可以有很多(我没研究过)。当然另一个做法可以是开一个进程来处理多个client连接,但是线程间的同步和数据共享,要比在进程间来得容易,而且进程间的通讯开销还是比较大的(比如socket、共享内存、消息队列等)。线程间如果锁使用不当,比如锁粒度太大,导致性能不理想,但这是设计的问题。
3、用多进程的方法来实现某些需求很合适,比如像google chrome,每一个网页(标签)就用一个进程来处理,所以某个标签崩溃了(网页有flash经常会崩溃:)),不会导致整个浏览器崩溃,这是选择进程的优点。缺点也是显而易见的,开一堆网页后,发现系统有一堆的进程,用户和系统内核都不会喜欢这样的:)另外,一个程序有多个进程并发执行任务,每个进程可以在单独的CPU中运行,这是比较高效的利用了多(核)CPU,因为线程在多个CPU调度的时候,有数据的共享和同步,在处理时可能要等待其它CPU(或有CPU间的数据共享)让出锁,这样就会有开销,所以某种程度讲,选用多进程模型有时是有意利用多CPU(不知这样说得不得当?)
4、由于对系统来说,一个进程的资源是有限制的,比如文件打开的最大数量、能创建的线程的数量、网络连接数量等,所以通常对一个服务器程序来说,在一个机器上运行多个实例(多个进程)也是一个提高机器性能使用率的方法。
所以,不能一概而定,线程和进程各有存在的目的和意义,要根据自己程序的需求来选择。以上我只是把一些相关的东西列出来,具体需要你自己去搜索和证实。
多进程服务器的一个重要优势是如果某个处理单元遇到问题崩溃了(比如SIGSEV),那也只是一个进程崩溃了而已,其他提供服务的进程还都在。
但是如果是用线程的话,一个线程挂了,所有的在同一个进程内的线程就都跪了。
不过这只是一个参考因素而已,具体是用线程还是进程,还得看你所要做的服务器的具体的模型,才能真正下定论。
已有项目基本上都是一 CPU 一进程(管理进程除外)。如:
多进程写起来比多线程方便不容易出错又能充分利用 CPU。特别是高级语言如 Python 有全局解释器锁的。