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