[转]论多进程与多线程

出于对自己对多进程和多线程概念理解的怀疑,便花时间深入学习了一下。我的目的是将一个生动的围绕CPU运行的动作模型描述出来。

我们先看专业书上是怎么解释的——进程是资源分配的最小单位,线程是CPU调度的最小单位——。
只要能把这句话理解了,那也就对多进程与多线程理解的差不多了。

我们来看一下操作系统是怎么协调程序利用单核CPU,内存来运行的:因为是单核的,原则上讲应该是执行一段线程,再切换到令一个线程,是只能这样,但是操作系统是怎么做使得看起来多个程序同时运行的呢?操作系统给每一个程序的运行实体——>进程分配了一个时间片,既一次周期一个进程能获得的最大运行线程的时间,这样如果那个时间片十分短,那么人看起来就是几个进程同时运行。
        所谓的一个进程就是一至多个线程的集合,真正执行的是线程。

单线程:
        <IGNORE_JS_OP>

多线程:        
        <IGNORE_JS_OP>

还是单核CPU,我们说一个进程的多线程,简单来说就是在一个时间片内每一个线程有同等的几乎同等的机会去获得CPU,这样看起来就像是线程是同时运行了。那有人会说,这样总时间不是没变么?这又涉及到一个问题,就是线程优先级问题:
        windows系统的线程优先级分0-31级不等,只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0~30的线程。高优先级线程往往“打断”低优先级线程的执行。比如,当一个优先级为15的线程正在运行,如果此时系统发现一个优先级比15高的线程可以调度,那么该高优先级线程会“打断”那个低优先级线程的执行,哪怕低优先级的时间片才过了一半。
        由此可知,如果系统运行到了这个优先级的程序,那么基本上就是与这个程序优先级相同的那么几个程序在运行了,并且线程共享程序资源,而只有自己独立的栈空间,所以多线程的CPU利用率更高。
        现在来看多核CPU,如果操作系统不划分时间片的话,那么单核CPU一次能执行一个线程,多核CPU一次就能执行与核数相同的线程数,达到线程并行(并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)
        这样的话一个多核CPU就可以同一时刻运行多个线程。

如果理解了多线程,那么多进程只不过是多线程的功能加上程序资源放到独立的地址上。
        多进程中每一个进程的地址,程序资源,堆栈空间都是独立的。

所以综上所述:多进程与多线程的区别就在于,多线程中每个线程执行的代码地址,利用的资源,都是共享的,只有栈是不同的因为参数不一样,多进程中不同进程的代码地址是不同的,用到资源是拷贝的。
        
        看完以上,你应该能理解多线程与多进程的区别了。

再说点题外话,早期的python的多线程机制采取了GIL,这有别于java语言,python多线程不能实现真正意义上的并行,只能做到并发,但多进程可以,但并不是说多进程效率更高,对于爬虫这种IO密集型程序差不多的了。python这样做是为了数据安全,更详细的请百度吧。
        python多线程I/O密集型:

<IGNORE_JS_OP>

我还是一样,抱着谦虚求教的态度,聆听读者的任何建议

转载自:http://bbs.fishc.com/thread-77899-1-1.html

时间: 2024-10-16 10:05:16

[转]论多进程与多线程的相关文章

多进程与多线程差别

 在Unix上编程採用多线程还是多进程的争执由来已久,这样的争执最常见到在C/S通讯中服务端并发技术 的选型上,比方WEBserver技术中.Apache是採用多进程的(perfork模式,每客户连接相应一个进程,每进程中仅仅存在唯一一个运行线程), Java的Web容器Tomcat.Websphere等都是多线程的(每客户连接相应一个线程,全部线程都在一个进程中). 从Unix发展历史看,伴随着Unix的诞生进程就出现了.而线程非常晚才被系统支持,比如Linux直到内核2.6.才支持符合P

多进程与多线程的区别

多进程与多线程的区别 进程是程序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是死的(静态的),进程是活的(动态的).进程可以分为系统进程和用户进程.凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身:所有由你启动的进程都是用户进程.进程是操作系统进行资源分配的单位.在Windows下,进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位. 在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便

多进程 vs 多线程

今天和一个朋友聊天,谈到了多进程.多线程的区别,回来搜集文章给出结论: 在Linux2.6上,多线程并不比多进程速度快,考虑到线程栈的问题,多进程在并发上有优势. 转载一篇 在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一个执行线程), Java的Web容器Tomcat.Websphere等都是多线程的(每客户连接对应一个

【Linux】多进程与多线程之间的区别

http://blog.csdn.net/byrsongqq/article/details/6339240 网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?  答案一: 1,进程:子进程是父进程的复制品.子进程获得父进程数据空间.堆和栈的复制品. 2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列. 两者都可以提高程序的并发度,提高程序运行效率和响应时间. 线程和进程在使用上各有优缺点:线程执行开

gdb调试多进程和多线程命令

gdb调试多进程和多线程命令 来源:http://blog.csdn.net/pbymw8iwm/article/details/7876797 1. 默认设置下,在调试多进程程序时GDB只会调试主进程.但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序.只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可. follow-fork-mode  detach-on-fork   说明 pare

0730------Linux网络编程----------服务器端模型(迭代,多进程,多线程,select,poll,epoll 等)

1.迭代服务器模型 1.1 迭代服务器是处理多个请求时一种最简单直接的思路,即使用while循环,它不具有并发能力,即必须一个一个的处理客户的请求. 1.2 程序示例. #include "def.h" int listenfd_init(); //返回一个处于监听状态的套接字描述符 void do_service(int peerfd); // 处理客户端的请求 int main(int argc, const char *argv[]) { if(signal(SIGPIPE, S

Python中的多进程与多线程(二)

在上一章中,学习了Python多进程编程的一些基本方法:使用跨平台多进程模块multiprocessing提供的Process.Pool.Queue.Lock.Pipe等类,实现子进程创建.进程池(批量创建子进程并管理子进程数量上限)以及进程间通信.这一章学习下Python下的多线程编程方法. 一.threading 线程是操作系统执行任务的最小单元.Python标准库中提供了threading模块,对多线程编程提供了很便捷的支持. 下面是使用threading实现多线程的代码: 1 #!/us

多进程与多线程区别

 在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一个执行线程), Java的Web容器Tomcat.Websphere等都是多线程的(每客户连接对应一个线程,所有线程都在一个进程中). 从Unix发展历史看,伴随着Unix的诞生进程就出现了,而线程很晚才被系统支持,例如Linux直到内核2.6,才支持符合Posix规范

【转】多进程和多线程的优缺点

在Linux下编程多用多进程编程少用多线程编程. IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多.进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右.当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点