目录
一、进程vs线程
1、进程:
进程是系统中程序执行和资源分配的基本单位,每个进程都有自己的数据段、代码段和堆栈段主进程就是master,其他进程就是worker
优点:稳定性高 一个子进程崩溃了,不会影响主进程和其他子进程,但主进程崩溃会、
导致所有子进程崩溃,但是master进程只负责分配任务,崩溃的概率较低
缺点:1、创建进程的代价大,在unix/linux系统下,用fork调用还行,在windows下创建进程开销巨大
2、操作系统能同时运行的进程数有限。在内存和cpu的限制下,如果有几千个进程同时在运行,操作系统的调度都会成问题
2、线程:
在一个进程内部要同时干多件事,就需要同时运行多个‘子任务’,我们把这些子任务称为线程
线程通常叫做轻型的线程。线程是共享内存空间的并发执行的多任务,每一个线程都共享一个进程的资源
线程是最小的执行单元,而进程至少要有一个线程。
如何调度进程和线程,完全由操作系统决定,程序不能决定什么时候执行,执行多长时间
主线程就是master,其他线程就是worker
优点:1、多线程模式通常比多进程快一点,但是也快不到哪去;
2、在windows下,多线程的效率比多进程要高
缺点:任何一个线程挂掉都可能直接造成整个进程崩溃。所有线程共享的内存。在windows上
线程执行的代码出了问题,你经常可以看到提示:程序执行了非法操作,即将关闭。其实往往是某个线程出了问题,但是操作系统会强制结束整个进程
计算密集型
要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数
IO密集型
涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分 时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是I0密集型任务,比如Web应用
二、进程与线程的区别
进程与线程的区别?
1. 地址空间: 同一进程的所有线程共享本进程的地址空间,而不同的进程之间的地址空间是独立的。
2. 资源拥有: 同一进程的所有线程共享本进程的资源,如内存,CPU,IO等。进程之间的资源是独立的,无法共享。
3. 执行过程:每一个进程可以说就是一个可执行的应用程序,每一个独立的进程都有一个程序执行的入口,顺序执行序列。但是线程不能够独立执行,必须依存在应用程序中,由程序的多线程控制机制进行控制。
4. 健壮性: 因为同一进程的所以线程共享此线程的资源,因此当一个线程发生崩溃时,此进程也会发生崩溃。 但是各个进程之间的资源是独立的,因此当一个进程崩溃时,不会影响其他进程。因此进程比线程健壮。
线程执行开销小,但不利于资源的管理与保护。
进程的执行开销大,但可以进行资源的管理与保护。进程可以跨机器前移。
三、多任务原理
现代操作系统(Windows、Linux、Mac OS X、Unix等)都支持多任务 多任务:操作系统同时可以运行多个任务 早期电脑主要是单核CPU 单核CPU实现多任务原理:操作系统轮流让各个任务交替执行,QQ执行2us(微秒),切换到微信,再执行2us,再切换到陌陌,再。。。表面上看,每个任务都反复执行下去,但是CPU调度执行速度太快了。导致我们感觉就像所有任务都在同时执行一样。 多核CPU实现多任务原理:真正的并行执行多任务只能在多核CPU上实现,但是由于任务的数量远远多于CPU数量,所以操作系统也会自动把很多任务轮流调度到每个核心上执行 并发:看上去一起执行,任务数大于CPU核心数 并行:真正一起执行,任务数小于CPU核心数 实现多任务的方式: 多进程模式 多线程模式 协程模式 多进程+多线程模式 multiprocessing:跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象