进程:资源分配的最小单位。
线程:程序执行的最小单位。
心里默念,啥啥啥,写的这是啥。
1、进程
进程是程序执行时的一个实例,即它是程序早已执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
举例说明进程:
想像一位有一手好厨艺的计算机科学家正在为他的儿子烘制生日披萨。他有做生日面包的食谱,卧室里有所需的原料:面条、鸡蛋、糖、香草汁等。在这个比喻中,做面包的食谱就是程序(即用适当方式描述的算法)计算机科学家就是处理器(CPU),而做面包的各类原料就是输入数据。进程就是面点师阅读食谱、取来各类原料以及烘制面包等一系列动作的总和。现今假定计算机科学家的女儿哭着跑了进来,说他的头被一只胡蜂蛰了。计算机科学家就记录下他照着食谱做到哪里了(保存进程的当前状态),之后掏出一本急救指南,根据其中的指示处理蛰伤。这儿,我们看见处理机制是从一个进程(做面包)切换到另一个高优先级的进程(施行医疗救助),每位进程拥有各自的程序(食谱和急救指南)。当胡蜂蛰伤处理完以后,那位计算机科学家又回去做面包,从他离开时的那一步继续做下去。
2、线程
线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一次序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
一个标准的线程有线程ID、当前指令表针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。因为线程之间的互相掣肘,使得线程在运行中呈现处间断性。
线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个风波(如某个讯号量),逻辑上不可执行。每一个程序都起码有一个线程,若程序只有一个线程,那就是程序本身。
举例说明线程:
假定,一个文本程序,须要接受鼠标输入,将内容显示在屏幕上,还须要保存信息到硬碟中。若只有一个进程linux查看进程的线程数,势必导致同一时间只能干一样事的难堪(当保存时,就不能通过鼠标输入内容)。若有多个进程,每位进程负责一个任务,进程A负责接收鼠标输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬碟中的任务。这儿进程A,B,C间的协作涉及到了进程通讯问题,但是有共同都须要拥有的东西——-文本内容,不停的切换导致性能上的损失。若有一种机制,可以使任务A,B,C共享资源linux培训班,这样上下文切换所须要保存和恢复的内容就少了,同时又可以降低通讯所带来的性能耗损,那就好了。这些机制就是线程。
总的来说:进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。
3、多线程
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。其实,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和用户进程。但凡用于完成操作系统的各类功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;所有由用户启动的进程都是用户进程。进程是操作系统进行资源分配的单位。进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。在同一个时间里,同一个计算机系统中若果准许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,才能同时管理多个进程的运行。多任务带来的益处是显著的,例如你可以边听网易云音乐,一边上网,与此同时甚至可以将下载的文档复印出来,而这种任务之间丝毫不会互相干扰。这么这儿就涉及到并行的问题,老话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,便于运行这个进程。我们一般使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每位进程容许占用CPU的时间十分短(例如10微秒),这样用户根本觉得不下来CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。假如一台计算机有多个CPU,情况就不同了,若果进程数大于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行。
并行处理(ParallelProcessing)是计算机系统中能同时执行两个或更多个处理的一种估算方式。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节约小型和复杂问题的解决时间。并发处理(concurrencyProcessing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间linux系统入门学习,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行
并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集。
4、多线程
线程是程序中一个单一的次序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元。在单一程序中同时运行多个想成完成不同的工作,称为多线程。
多线程是为了促使多个线程并行的工作以完成多项任务,以提升系统的效率。线程是在同一时间须要完成多项任务的时侯被实现的。
打个比方:
多进程是立体交通系统(近似于高架桥),尽管造价高,下坡上坡多耗点油,而且不塞车。
多线程是平面交通系统,造价低,但红绿灯太多,老拥堵。
相关视频推荐
BAT笔试必备:多线程、多进程、协程怎样选择及线程池怎样最高效
linux服务端的网路并发,详尽剖析网路io与线程进程关系
须要C/C++Linux服务器构架师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,解释器,DPDK,ffmpeg等),免费分享
5、线程与进程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但起码有一个线程;
(2)资源分配给进程,同一进程内的所有线程共享该进程的所有资源;
(3)线程在执行过程中须要协作同步。不同进程中的线程之间要借助消息通讯的方式实现同步;
(4)处理机分配给线程,即真正在处理机上运行的是线程;
(5)线程是进程的一个执行单元,也是进程内的可调用实体。
6、线程和进程的区别
(1)线程共享显存空间;进程的显存是独立的;
(2)同一个进程的线程之间可以直接交流;两个进程想通讯,必须通过一个中间代理来实现;
(3)创建新进程很简单;创建新进程须要对其父进程进行一个克隆;
(4)一个线程可以控制和操作同一进程里的其他线程;并且进程只能操作子进程;
(5)改变注线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。
(6)调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位
(7)并发性:不进进程之间可以并发执行,同一进程内的线程也可以并发执行
(8)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,并且可以访问隶属于进程的系统资源
(9)系统开支:在创建和撤消进程的时侯,系统都要分配和回收资源,造成系统的显著小于创建和撤消线程时的开支。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程导致影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程挂掉,所以多进程程序要比多线程程序强壮,并且在进程切换的时侯消耗的资源较大,效率差。
根本区别就一点:用多进程每位进程有自己的地址空间(addressspace),线程则共享地址空间。
总结:多线程执行效率高;多进程斥资源,安全。
7、进程的异同点7.1进程的优点
1)次序程序的特征:具有封闭性和可重现性;
2)程序的并发执行和资源共享。多道程序设计出现后,实现了程序的并发执行和资源共享,提升了系统的效率和系统的资源借助率。
7.2进程的缺点
操作系统调度切换多个线程要比切换调度进程在速率上快的多。并且进程间显存未能共享,通信也比较麻烦。线程之间因为共享进程显存空间,所以交换数据十分便捷;在创建或撤销进程时,因为系统都要为之分配和回收资源,造成系统的开支显著小于创建或撤销线程时的开支。
8、线程的异同点8.1线程的优点
1)它是一种十分"俭朴"的多任务操作方法。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,完善诸多的数据表来维护它的代码段、堆栈段和数据段,这是一种"高昂"的多任务工作方法。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部份数据,启动一个线程所耗费的空间远远大于启动一个进程所耗费的空间,并且,线程间彼此切换所需的时间也远远大于进程间切换所须要的时间。其实,在具体的系统上,这个数据可能会有较大的区别;
2)线程间便捷的通讯机制,因为同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这除了快捷,但是便捷;
3)使多CPU系统愈发有效。操作系统会保证当线程数不小于CPU数量时,不同的线程运行于不同的CPU上;
4)改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部份,这样的程序会利于理解和更改。
8.2线程的缺点
1)调度时,要保存线程状态,频繁调度,须要占用大量的机时;
2)程序设计上容易出错(线程同步问题)。
9、多线程的异同点9.1多线程的优点
1)无需跨进程边界;程序逻辑和控制方法简单;
2)所有线程可以直接共享显存和变量等;
3)线程形式消耗的总资源比进程形式好。
9.2多线程的缺点
1)每位线程与主程序共用地址空间,受限于2GB地址空间;
2)线程之间的同步和加锁控制比较麻烦;一个线程的崩溃可能影响到整个程序的稳定性;
3)抵达一定的线程数程度后,虽然再降低CPU也难以提升性能,比如WindowsServer2003,大概是1500个左右的线程数就快到极限了(线程堆栈设定为1M),倘若设定线程堆栈为2M,还达不到1500个线程总量;
4)线程才能提升的总性能有限,但是线程多了以后,线程本身的调度也是一个麻烦事儿,须要消耗较多的CPU。
10、多进程的异同点10.1多进程的优点
1)每位进程相互独立,不影响主程序的稳定性,子进程崩溃没关系;
2)通过降低CPU,就可以容易扩展性能;
3)可以尽量降低线程加锁/解锁的影响,极大提升性能,即使是线程运行的模块算法效率低也没关系;
4)每位子进程都有2GB地址空间和相关资源,总体才能达到的性能上限特别大。
10.2多进程的缺点
1)逻辑控制复杂,须要和主程序交互;
2)须要跨进程边界,假如有大数据量传送,就不太好,适宜小数据量传送、密集运算多进程调度开支比较大。
总结:最好是多进程和多线程结合,即按照实际的须要,每位CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。其实你也可以借助多线程+CPU+协程方法来解决问题……方法和手段是多样的,关键是自己看上去实现便捷有才能满足要求,代价也合适。
根据多个不同的维度(类别),来瞧瞧多线程和多进程的对比(注:由于是感性的比较,因而都是相对的,不是说一个好得不得了,另外一个差的难以忍受)。
1)须要频繁创建销毁的优先用线程
这些原则最常见的应用就是Web服务器了,来一个联接构建一个线程linux查看进程的线程数,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的
2)须要进行大量估算的优先使用线程
所谓大量估算,其实就是要花费好多CPU,切换频繁了,这些情况下线程是最合适的。这些原则最常见的是图象处理、算法处理。
3)强相关的处理用线程,弱相关的处理用进程
哪些叫强相关、弱相关?理论上很难定义,给个简单的反例就明白了。
通常的Server须要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。为此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。其实这些界定方法不是一成不变的,也可以按照实际情况进行调整。
4)可能要扩充到多机分布的用进程,多核分布的用线程
5)都满足需求的情况下,用你最熟悉、最拿手的方法
至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该如何抉择,我只能说:没有明晰的选择方式。但我可以告诉你一个选择原则:假如多进程和多线程都还能满足要求,这么选择你最熟悉、最拿手的那种。须要提醒的是:即使我给了如此多的选择原则,但实际应用中基本上都是“进程+线程”的结合形式,千万不要真的深陷一种非此即彼的误区。
11、多任务(多进程)
现代操作系统例如MacOSX,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。
哪些叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word写论文,这就是多任务,起码同时有3个任务正在运行。还有好多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。
现今,多核CPU早已十分普及了,而且,虽然过去的单核CPU,也可以执行多任务。因为CPU执行代码都是次序执行的,这么,单核CPU是如何执行多任务的呢?
虽然操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每位任务都是交替执行的,而且,因为CPU的执行速率实在是太快了,我们觉得如同所有任务都在同时执行一样。
真正的并行执行多任务只能在多核CPU上实现,并且,因为任务数目远远少于CPU的核心数目,所以,操作系统也会手动把好多任务轮流调度到每位核心上执行。
对于操作系统来说,一个任务就是一个进程(Process),例如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。
有些进程还不止同时干一件事,例如Word,它可以同时进行打字、拼写检测、打印等事情。在一个进程内部,要同时干多件事,就须要同时运行多个“子任务”,我们把进程内的这种“子任务”称为线程(Thread)。
因为每位进程起码要干一件事,所以,一个进程起码有一个线程。其实,像Word这些复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方法和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每位线程都短暂地交替运行,看上去如同同时执行一样。其实,真正地同时执行多线程须要多核CPU才可能实现。