精华内容
下载资源
问答
  • 线程、进程、多线程多进程 多任务 小结

    千次阅读 多人点赞 2019-04-20 11:59:56
    目录 1 进程 2 线程 3 多进程 4 多线程 5 线程与进程的关系 ...6 线程进程的区别 ...9 多线程的优缺点 ...9.1 多线程的优点 ...9.2 多线程的缺点 ...10多进程的优缺点 ...10.1 多进程的优点 ...8 多任务(多进...

    目录

    1 进程

    2 线程

    3 多进程

    4 多线程

    5 线程与进程的关系

    6 线程和进程的区别

    7 进程的优缺点

    7.1 进程的优点

    7.2 进程的缺点

    8 线程的优缺点

    8.1 线程的优点

    8.2 线程的缺点

    9 多线程的优缺点

    9.1 多线程的优点

    9.2 多线程的缺点

    10多进程的优缺点

    10.1 多进程的优点

    10.2 多进程的缺点

    8 多任务(多进程)

    参考资料


    最近经常看到 多进程,多线程和多任务等名词,很容易混。网上查了很多资料,内容很多。作为Linux初学者,还是想从最基础的开始了解,找通俗的例子了解,由浅入深。我把网上查阅的资料整理的一下,一次性全部摸透,还是有点难度的。写个博客,记录一下,以便后期查阅复习。

    首先,从定义开始,先看一下教科书上 进程线程定义:

    进程:资源分配的最小单位。

    线程:程序执行的最小单位。

    心中默念,啥啥啥,写的这是啥。于是乎 我就想到王宝强一脸懵逼的表情。

     

    1 进程

    进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。

    举例说明进程

    想象一位有一手好厨艺的计算机科学家正在为他的女儿烘制生日蛋糕。他有做生日蛋糕的食谱,厨房里有所需的原料:面粉、鸡蛋、糖、香草汁等。在这个比喻中,做蛋糕的食谱就是程序(即用适当形式描述的算法)计算机科学家就是处理器(CPU),而做蛋糕的各种原料就是输入数据。进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和。现在假设计算机科学家的儿子哭着跑了进来,说他的头被一只蜜蜂蛰了。计算机科学家就记录下他照着食谱做到哪儿了(保存进程的当前状态),然后拿出一本急救手册,按照其中的指示处理蛰伤。这里,我们看到处理机制是从一个进程(做蛋糕)切换到另一个高优先级的进程(实施医疗救治),每个进程拥有各自的程序(食谱和急救手册)。当蜜蜂蛰伤处理完之后,这位计算机科学家又回来做蛋糕,从他离开时的那一步继续做下去。

     

    2 线程

    线程是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

    一个标准的线程有线程ID、当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现处间断性。

    线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

     

    举例说明线程

    假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西——-文本内容,不停的切换造成性能上的损失。若有一种机制,可以使任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内容就少了,同时又可以减少通信所带来的性能损耗,那就好了。这种机制就是线程

    总的来说进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。

     

     

    3 多进程

    进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;所有由用户启动的进程都是用户进程。进程是操作系统进行资源分配的单位。 进程又被细化为线程,也就是一个进程下有多个能独立运行的更小的单位。在同一个时间里,同一个计算机系统中如果允许两个或两个以上的进程处于运行状态,这便是多任务。现代的操作系统几乎都是多任务操作系统,能够同时管理多个进程的运行。 多任务带来的好处是明显的,比如你可以边听网易云音乐,一边上网,与此同时甚至可以将下载的文档打印出来,而这些任务之间丝毫不会相互干扰。那么这里就涉及到并行的问题,俗话说,一心不能二用,这对计算机也一样,原则上一个CPU只能分配给一个进程,以便运行这个进程。我们通常使用的计算机中只有一个CPU,也就是说只有一颗心,要让它一心多用,同时运行多个进程,就必须使用并发技术。实现并发技术相当复杂,最容易理解的是“时间片轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运行的进程轮流使用CPU,每个进程允许占用CPU的时间非常短(比如10毫秒),这样用户根本感觉不出来 CPU是在轮流为多个进程服务,就好像所有的进程都在不间断地运行一样。但实际上在任何一个时间内有且仅有一个进程占有CPU。 如果一台计算机有多个CPU,情况就不同了,如果进程数小于CPU数,则不同的进程可以分配给不同的CPU来运行,这样,多个进程就是真正同时运行的,这便是并行

    并行处理(Parallel Processing)是计算机系统中能同时执行两个或更多个处理的一种计算方法。并行处理可同时工作于同一程序的不同方面。并行处理的主要目的是节省大型和复杂问题的解决时间。并发处理(concurrency Processing):指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机(CPU)上运行,但任一个时刻点上只有一个程序在处理机(CPU)上运行

    并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。所以说,并行是并发的子集。

     

     

    4 多线程

    线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单元。在单一程序中同时运行多个想成完成不同的工作,称为多线程

    多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。

    打个比方:

    多进程是立体交通系统(近似于立交桥),虽然造价高,上坡下坡多耗点油,但是不堵车。

    多线程是平面交通系统,造价低,但红绿灯太多,老堵车。

     

     

    5 线程与进程的关系

    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;

    (2)资源分配给进程,同一进程内的所有线程共享该进程的所有资源;

    (3)线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;

    (4)处理机分配给线程,即真正在处理机上运行的是线程;

    (5)线程是进程的一个执行单元,也是进程内的可调用实体。

     

     

    6 线程和进程的区别

    (1)线程共享内存空间;进程的内存是独立的;

    (2)同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现;

    (3)创建新进程很简单;创建新进程需要对其父进程进行一个克隆;

    (4)一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程;

    (5)改变注线程(如优先权),可能会影响其他线程;改变父进程,不影响子进程。

    (6)调度:线程作为分配和调度的基本单位,进程作为拥有资源的基本单位

    (7)并发性:不进进程之间可以并发执行,同一进程内的线程也可以并发执行

    (8)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但是可以访问隶属于进程的系统资源

    (9)系统开销:在创建和撤销进程的时候,系统都要分配和回收资源,导致系统的明显大于创建和撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式的下不会对其他进程造成影响,而线程只是进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有独立的地址空间,一个线程死后就等于整个进程死掉,所以多进程程序要比多线程程序健壮,但是在进程切换的时候消耗的资源较大,效率差。

    根本区别就一点:用多进程每个进程有自己的地址空间(address space),线程则共享地址空间。

    总结:多线程执行效率高;  多进程耗资源,安全。

     

     

    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也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;

    4)线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU 。

     

    10多进程的优缺点

    10.1 多进程的优点

    1)每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

    2)通过增加CPU,就可以容易扩充性能;

    3)可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;

    4)每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大。

     

    10.2 多进程的缺点

    1)逻辑控制复杂,需要和主程序交互;

    2)需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大。

     

    总结:最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+CPU+轮询方式来解决问题……方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

     

    按照多个不同的维度(类别),来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受)。

        对比类别

                                        多进程

                                     多线程

         总结

    数据共享、同步

    数据共享复杂,需要用IPC;数据是分开的,同步简单

    因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂

     各有优势

        内存、CPU

    占用内存多,切换复杂,CPU利用率低

    占用内存少,切换简单,CPU利用率高

     线程占优

     创建销毁、切换

    创建销毁、切换复杂,速度慢

    创建销毁、切换简单,速度很快

     线程占优

        编程、调试

    编程简单,调试简单

    编程复杂,调试复杂

     进程占优

           可靠性

    进程间不会互相影响

    一个线程挂掉将导致整个进程挂掉

     进程占优

           分布式

    适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单

    适应于多核分布式

     进程占优

    其实没有绝对的好与坏,只有哪个更加合适的问题。我们来看实际应用中究竟如何判断更加合适。

    1)需要频繁创建销毁的优先用线程

    这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

     

    2)需要进行大量计算的优先使用线程

    所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。这种原则最常见的是图像处理、算法处理。

     

    3)强相关的处理用线程,弱相关的处理用进程

    什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

    一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

     

    4)可能要扩展到多机分布的用进程,多核分布的用线程

     

    5)都满足需求的情况下,用你最熟悉、最拿手的方式

    至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:没有明确的选择方法。但我可以告诉你一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。需要提醒的是:虽然我给了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。

     

    8 多任务(多进程)

    现代操作系统比如Mac OS X,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才可能实现。

     

     

    参考资料

    [1] https://www.cnblogs.com/pingqiang/p/8007549.html#多进程多线程

    [2] https://www.cnblogs.com/ww36315610/p/3881533.html?tdsourcetag=s_pctim_aiomsg

    [3] http://www.cnblogs.com/Yogurshine/p/3640206.html

    [4] https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868322563729e03f6905ea94f0195528e3647887415000?tdsourcetag=s_pctim_aiomsg

    [5] https://www.cnblogs.com/yuanchenqi/articles/6755717.html#_label3?tdsourcetag=s_pctim_aiomsg

    [6] https://www.cnblogs.com/zhanht/p/5401685.html?tdsourcetag=s_pctim_aiomsg

    [7] https://www.kafan.cn/edu/85866456.html

     

    展开全文
  • C语言多任务多进程多线程

    千次阅读 2018-04-03 15:44:08
    Linux就是一种支持多任务的操作系统,它支持多进程多线程多任务处理任务之间的多种通信机制。Linux下多任务机制的介绍多任务处理是指用户在同一时间内运行多个应用程序,每个应用程序被称做一个任务。Linux...

    多任务的概念人们已经非常熟悉了,它是指用户可以在同一时间内运行多个应用程序。Linux就是一种支持多任务的操作系统,它支持多进程、多线程等多任务处理和任务之间的多种通信机制。

    Linux下多任务机制的介绍

    多任务处理是指用户在同一时间内运行多个应用程序,每个应用程序被称做一个任务。Linux就是一个支持多任务的操作系统,它比单任务系统的功能增强了许多。当多任务操作系统使用某种任务调度策略允许两个或更多进程并发共享一个处理器时,事实上处理器在某一时刻只会给一个任务提供服务。由于任务调度机制保证了不同的任务之间的切换速度十分迅速,因此给人多个任务同时运行的错觉。多任务系统中有3个功能单位:任务、进程和线程,下面分别进程介绍。

    1、任务

    任务是一个逻辑概念,指由一个软件完成的活动,或者是一系列共同达到某一个目的的操作。通常一个任务是一个程序的一次运行,一个任务包含一个或多个完成独立功能的子任务,这个独立的子任务就是进程或线程。例如,一个杀毒软件的一次运行是一个任务,目的是从各种病毒的侵害中保护计算机系统,这个任务包含多个独立功能的子任务(进程或线程),包含实时监控功能、定时查杀功能、防火墙功能及用户交互功能等。个人理解:就好比假设一个应用程序中由一个或多个可执行文件共同执行组成,那么此应用程序的一次执行就是一个任务,而这些可执行文件的执行就是一个进程的执行,而可执行文件是由一个线程或多个线程构成的,当只有一个线程构成了这个进程,则此时进程和线程就是一样的概念(可执行文件的一次运行)。

    2、进程

    进程的基本概念

    进程是一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的基本单位(个人理解:系统好比是一个大型的任务,由多个进程(可执行文件)构成,而资源分配和资源调度分别都是一个进程,所以进程是系统进行资源分配和调度的基本单位)。一次任务的运行可以并发激活多个进程,这些进程相互合作来完成该任务的一个最终的目标。

    进程具有并发性、动态性、交互性、独立性和异步性等主要特性

    • 并发性:指的是系统中多个进程可以同时并发执行,相互之间不受干扰。
    • 动态性:指的是进程都有完整的生命周期,而且在进程的生命周期内,进程的状态是不断变化的。另外,进程具有动态的地址空间(包括代码、数据和进程控制块)。
    • 交互性:指的是进程在执行过程中可能会与其他进程发生直接和间接的交互操作,如进程同步和进程互斥等,需要为此添加一定的进程处理机制。
    • 独立性:指的是进程是一个相对完整的资源分配和调度的基本单位,各个进程的地址空间是相互独立的,只有采用某些特定的通信机制才能实现进程间的通信。
    • 异步性:指的是每个进程都按照各自独立的、不可预知的速度向前执行。
    进程和程序是有本质的区别:程序是静态的一段代码,是一些保存在非易失性存储器的指令的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序执行的过程,包括动态创建、调度和消亡的整个过程,它是程序执行和资源管理的最小单位。
    Linux系统中包括以下几种类型的过程:
    • 交互式过程:这类进程进程与用户进程交互,因此要花很多时间等待用户的交互操作(键盘和鼠标操作等)。当接收到用户的交互操作后,这类进程应该很快被允许,而且相应时间的变化也应该很小,否则用户就会觉得系统反应迟钝或者不太稳定。典型的交互式进程有shell命令进程、文本编辑器和图形应用程序运行等。
    • 批处理进程:这类进程不必与用户进行交互,因此进程在后台运行。因为这类进程通常不必很快地相应,因此往往受到调度器的“慢待”。典型的批处理进程有编译器的编译操作、数据库搜索引擎等。
    • 实时进程:这类进程通常对调度响应时间有很高的要求,一般不会被低优先级的进程阻塞。它们不仅要求很短的响应时间,而且更重要的是响应时间的变化应该很小。典型的实时进程有视频和音频的应用程序、实时数据采集系统程序等。

    Linux下的进程结构

    进程不但包括程序的指令和数据,而且包括程序计数器和处理器的所有寄存器以及存储临时数据的进程堆栈,因此正在执行的进程包括处理器当前的一切活动。
    因为Linux是一个多进程的操作系统,所以其他的进程必须等到系统将处理器使用权分配各自己之后才能运行。当正在运行的进程等待其他的系统资源时,Linux内核将取得处理器的控制权,并将处理器分配给其他正在等待的进程,它按照内核中的调度算法决定处理器分配给哪个进程。
    内核将所有进程存放在双向循环链表(进程链表)中,其中链表的头是init_task描述符。链表的每一项都是类型为task_struct,称为进程描述符的结构,该结构包含了与一个进程相关的所有信息,定义在<include/linux/sched.h>文件中。task_struct内核结构比较大,它能完整地描述一个进程,如进程的状态、进程的基本信息、进程标识符、内存相关信息、父进程相关信息、与进程相关的终端信息、当前工作目录、打开的文件信息、所接收到的信号信息等。
    下面详细讲解task_struct结构中最为重要的两个域:state(进程状态)和pid(进程标识符,即进程号)。
    1)进程状态,Linux中的进程有以下几种状态
    • 运行状态(TASK_RUNNING):进程当前正在运行,或者正在运行队列中等待调度。
    创建一个task.c文件,task.c文件内容如下:

    保存后,输入gcc task.c -o task编译生成二进制代码task,输入./task运行task进程

    打开另一个终端,输入 ps -aux查看进程状态:( ps -axjf 可查看进程有哪些子进程, ps -e 也 可以查到进程的状态,但只显示进程的PID、TTY、TIME和CMD)
    ps工具标识进程的5中状态码:
    D 不可中断 uninterruptible sleep (usually IO)
    R 运行 runnable (on run queue)
    S 中断 sleeping
    T 停止 traced or stopped
    Z 僵尸 a defunct ("zombie") process
    注:其它状态还包括W(无驻留页),<(高优先级进程),N(低优先级进程),L(内存锁页)
    每列对应关系:
    USER:进程所有者      
    PID:进程ID    
    %CPU:占用CPU的使用率   
    %MEM:占用内存的使用率   
    VSZ:占用虚拟内存大小 
     RSS:占用内存大小 
    TTY:终端次要装置号码   
    STAT:进程状态  
    START:进程启动时间    
    TIME:进程消耗cup时间   
    COMMAND:命令的名称和参数


    • 可中断的阻塞状态(TASK_INTERRUPTIBLE):进程处于阻塞(睡眠)状态,正在等待某些事件发生或能够占用某些资源。处在这种状态下的进程可以被信号中断。接收到信号或被显式的唤醒呼叫(如调用wake_up系列宏:wake_up、wake_up_interruptible等)唤醒之后,进程转变为TASK_RUNNING状态。
    • 不可中断的阻塞状态(TASK_UNINTERRUPTIBLE):此进程状态类似于可中断的阻塞状态(TASK_INTERRUPTILBE),只是它不会处理信号,把信号传递到这种状态下的进程不能改变它的状态。在一些特定的情况下(进程必须等待,直到某些不可被中断的事件发生),这种状态是很有用的。只有在它所等待的事件发生时,进程被显式的唤醒呼叫唤醒。
    • 可终止的阻塞状态(TASK_KILLABLE):Linux内核2.6.25引入了一种新的进程状态,名为TASK_KILLABLE。该状态的运行机制类似于TASK_UNINTERRUPTILBE,只不过在该状态下的进程可以响应致命信号。它可以替代有效但可能无法终止的不可中断的阻塞状态,以及易于唤醒安全性欠佳的可中断的阻塞状态。
    • 暂停状态(TASK_STOPPED):进程的执行被暂停,当进程收到SIGTOP、SIGTSTP、SIGTTIN、SIGTTOU等信号时,就会进入暂停状态。
    • 跟踪状态(TASK_TRACED):进程的执行被调试器暂停。当一个进程被另一个进程监控是(如调试器使用ptrace()系统调用监控测试程序),任何信号都可以把这个进程置于跟踪状态。
    • 僵尸状态(EXIT_ZOMBIE):进程运行结束,父进程尚未使用wait函数族(如使用waitpid()函数)等系统调用来“收尸”,即等待父进程销毁它。处于该状态下的进程“实体”已经放弃了几乎所有的内存空间,没有任何可执行代码,也不能调度,仅仅在进程列表保留一个位置,记载该进程的退出状态等信息供其他进程收集。
    • 僵尸撤销状态(EXIT_DEAD):这是最终状态,父进程调用wait函数族“收尸”后,进程彻底有系统删除。
    它们之间的转换关系如图所示:

    内核可以使用set_task_state和set_current_state宏来改变指定进程的状态和当前执行进程的状态。
    2)进程标识符
    Linux内核通过唯一的进程标识符PID来标识每个进程。PID存放进程描述符的pid字段中,新创建的PID通常是前一个进程的PID加1,不过PID的值有上限(最大值 = PID_MAX_DEFAULT - 1,通常为32767),我们可以在终端输入 vim /proc/sys/kernel/pid_max 来确定该系统的进程数上限。
    当系统启动后,内核通常作为一个进程的代表。一个指向task_struct的宏current用来记录正在运行的进程。current经常作为进程描述符结构指针的形式出现在内核代码中,例如,current->pid表示处理器正在执行进程的PID。当系统需要查看所有的进程时,则调用for_each_process()宏,这将比系统搜索数组的速度要快得多。
    在Linux中获得当前进程的进程号(PID)和父进程号(PPID)的系统调用函数分别为getpid()和getppid()。
    测试代码:

    测试结果:

    输入  ps -axjf 命令查看所有进程与父进程

    我们在次输入 ps -aux命令查看所有进程,可以得知父进程为bash

    进程的创建、执行和终止

    1)进程的创建和执行
    许多操作系统提供的都是产生进程的机制,也就是说,首先在新的地址空间里创建进程、读入可执行文件、最后在开始执行。Linux中进程的穿件很特别,它把上述步骤分解到两个单独的函数中去执行:fork()和exec函数族。首先fork()函数通过复制当前进程创建一个子进程,子进程与父进程的区别在于不同的PID、PPID和某些资源及统计量。exec函数族负责读取可执行文件并将其载入地址空间开始运行。
    要注意的是,Linux中的fork()函数使用的是写时复制页的技术,也就是内核在创建进程时,其资源并没有被复制过来,资源的复制仅仅只有在需要写入数据时才发生,在此之前只是以只读的方式共享数据。写时复制技术可以使Linux拥有快速执行的能力,因此这个优化是非常重要的。
    2)进程的终止
    进程终结也需要做很多繁琐的收尾工作,系统必须保证回收进程所占的资源,并通知父进程。Linux首先把终止的进程设置为僵尸状态,这时,进程无法投入运行,它的存在只为父进程提供信息,申请死亡。父进程得到信息后,开始调用wait函数族,最后终止子进程,子进程占用的所有资源被全部释放。

    进程的内存结构

    Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。该地址空间是大小为4GB的线性虚拟空间(当然是指32位系统),用户所看到和接触到的都是该虚拟地址,无法看到实际的物理内存地址。利用这种虚拟地址不但能起到保护操作系统的效果(用户不能直接访问物理内存),而且更重要的是,用户程序可以使用比实际物理内存更大的地址空间。
    我们可以通过命令getconf LONG_BIT 来查询当前自己的系统是多少位的?

    我的安装的UbuntKylin是64位的,即实际内存最大可能达到2^64 = 128GB。(2^10 = 1kb,2^30 = 1GB)。
    4GB的进程地址空间会被分出两部分:用户空间与内核空间。用户地址空间是从0~3GB(0xC0000000),内存地址空间占据3GB~4GB。用户进程通常情况下只能访问用户控件的虚拟地址,不能访问内核空间的虚拟地址。只有用户进程使用系统调用(代表用户进程在内核执行)时可以访问内核空间的虚拟空间。 每当进程切换时,用户空间就会跟着变化;而内核空间有内核负责映射,它并不会跟着进程改变而改变,是固定的。内核空间地址有自己对应的页表,用户进程各自用不同的页表。每个进程用户空间都是完全独立、互不相干的。进程的虚拟内存地址空间如图所示:

    其中用户空间包括以下几个功能区域:
    • 只读段:包含程序代码(.init和.exit)和只读数据(.rodata)
    • 数据段:存放的是全局变量和静态变量。其中可读可写数据段(.data)存放已经初始化的全局变量和静态变量,BSS数据段(.bss)存放未初始化的全局变量和静态变量
    • 堆:由系统自动分配释放,存放函数的参数值、局部变量的值、返回地址等
    • 堆栈:存放动态分配的数据,一般由程序员动态分配和释放。若程序员不释放,程序结束时可能由操作系统回收。
    • 共享库的内存映射区域:这是Linux动态连接器和其他共享库代码的映射区域。
    由于在Linux系统中每一个进程都会有/proc文件系统下与之对应的一个目录(如将init进程的相关信息在/proc/1 目录下的文件中描述,1表示init进程的进程号),因此通过proc文件系统可以查看某个进程的地址空间的映射情况。
    测试代码:

    运行此程序:

    输入  size task

    text:存放的是代码     data:存放的是初始化过的全局变量或静态变量   bss:存放的是未初始化的全局变量或静态变量
    输入命令  cat /proc/3834/maps   其中3834是task的PID

    3、线程

    前面已经提到,进程是系统中程序执行和资源分配的基本单位。每个进程都拥有自己的数据段、代码段和堆栈段,这就造成了进程进程切换等操作时需要较复杂的上下文切换等动作。为了进一步减少处理机制的空转时间,支持多处理器及减少上下文切换开销,进程在演化中出现了另一个概念——线程。它是进程内独立的一条运行路线,是处理器调用的最小单元,也可以成为轻量级进程。线程可以对进程的内存空间和资源进程访问,并与同一个进程中的其他线程共享。因此,线程上下文切换的开销比创建进程小得多。
    一个进程可以拥有多个线程,每个线程必须有一个父进程。线程不拥有系统资源,它只具有运行所必需的一些数据,如堆栈、寄存器与线程控制块(TCB),线程与其父进程的其他线程共享该进程所拥有的全部资源。要注意的是,由线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都会给其他线程带来影响。由此可知,多线程中的同步是非常重要的问题。在多线程系统中,进程与线程的关系如图所示:

    在Linux系统中,线程可以分为以下3种:
    用户级线程
    用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自己选择决定,在运行时不需要特定的内核支持。在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建、调度和撤销等功能,而内核仍然仅对进程进行管理。 如果一个进程中的某一个线程调用了一个阻塞的系统调用函数,那么该进程好吧该进程中的其他所有线程也同时被阻塞。这种用户级线程的主要缺点是在一个进程的多个线程的调度中无法发挥多处理器的优势。
    轻量级进程
    轻量级进程是内核支持的用户线程,是内核线程的一种抽象对象。每个线程拥有一个或多个轻量级进程,而每个轻量级进程分别被绑定在一个内核线程上。
    内核线程
    内核线程允许不同进程中的线程按照同一相对优先调度方法进行调度,这样就可以发挥多处理器的并发优势。现在大多数系统都采用用户级线程与核心级线程并存的方法。一个用户级线程可以对应一个或几个核心级线程,也就是“一对一”或“多对一”模型。这样既可以满足多处理系统的需要,也可以最大限度地减少调度开销。
    使用线程机制大大加快了上下文切换速度,而节省了很多资源。但是因为在用户态和内核态均要实现调度管理,所有会增加实现的复杂度和引起优先级翻转的可能性。同时,一个多线程程序的同步设计与调试也会增加程序实现的难道。
    展开全文
  • 多任务多线程和多进程区别

    万次阅读 多人点赞 2019-04-26 14:22:22
    多任务多线程和多线程区别

    多任务中 多线程和多进程的区别

    首先来说下为什么要实现多任务,众所周知,程序执行的时候都是自上而下的运行的,然而随着代码量的增加,执行单一任务的效率会非常差。就好比你以前都是先做完语文作业,再做数学作业,然后再做英语作业,那有没有一种方法,类似于分身术一般,在做语文作业的同时,把数学作业和英语作业一起做了。这就是多任务的实现。多任务,打破了原来从上而下的规规矩矩的执行方式。能帮助你在同一时间执行多种任务。

    多进程

    进程其实是资源的分配的单位,包括代码、内存、CPU等等,多进程类似程序的多开,比如qq的多开。
    下面是一个简单的多进程的创建,我们可以看到在main函数下创建了两个子进程。

    import multiprocessing
    import time
    
    def test1():
        while True:
            print('--- this is process 1 ---')
            time.sleep(2)
    def test2():
        while True:
            print('--- this is process 2 ---')
            time.sleep(2)
    
    def main():
        t1 = multiprocessing.Process(target=test1)
        t2 = multiprocessing.Process(target=test2)
        t1.start()
        t2.start()
    

    下图解释了多进程工作的原理,在主进程下,子进程1和子进程2分别复制了主进程的代码以及资源,而子进程1则只运行test1这个函数,子进程2则只运行test2这个函数,进程之间的全局变量互不影响,对资源的开销比较大。

    在这里插入图片描述打开任务管理器,结束任意子进程,发现主进程和子进程2没有受到影响,仍然继续运行,而当我们结束主进程的时候,所有子进程全部结束。
    在这里插入图片描述在这里插入图片描述

    多线程

    在一个进程中我们也可以使用多任务,这就是线程,线程其实是操作系统资源调度的单位。多线程可以共享全局变量。
    下面是一个简单的使用方法来创建多线程的例子。

    import threading
    import time
    
    
    num = 100
    
    def test1():
        global num
        num += 1
        print('-----子线程1---num=%d' % num)
    
    
    def test2():
        print('-----子线程2---num=%d' % num)
    
    
    def main():
        t1 = threading.Thread(target=test1)
        t2 = threading.Thread(target=test2)
    
        t1.start()
        time.sleep(1)
    
        t2.start()
        time.sleep(1)
    
        print('-----main进程---num=%d' % num)
    
    if __name__ == '__main__':
        main()
    

    多线程并不会复制主进程的代码和资源,而是共享全局变量,相比多进程来说,资源开销更加小。在同一时间,子线程1和子线程2同时运行,实现多任务,而他们会共享全局变量num,所以print的值都是101.
    在这里插入图片描述

    多进程多线程的区别和选择(总结)

    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受其害。

    经常在网络上看到有的XDJM问“多进程好还是多线程好?”、“Linux下用多进程还是多线程?”等等期望一劳永逸的问题,我只能说:没有最好,只有更好。根据实际情况来判断,哪个更加合适就是哪个好。

    我们按照多个不同的维度,来看看多线程和多进程的对比(注:因为是感性的比较,因此都是相对的,不是说一个好得不得了,另外一个差的无法忍受)。

    在这里插入图片描述
    在这里插入图片描述1)需要频繁创建销毁的优先用线程

    原因请看上面的对比。

    这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的

    2)需要进行大量计算的优先使用线程

    所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。

    这种原则最常见的是图像处理、算法处理。

    3)强相关的处理用线程,弱相关的处理用进程

    什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。

    一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。

    当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。

    4)可能要扩展到多机分布的用进程,多核分布的用线程

    原因请看上面对比。

    5)都满足需求的情况下,用你最熟悉、最拿手的方式

    至于“数据共享、同步”、“编程、调试”、“可靠性”这几个维度的所谓的“复杂、简单”应该怎么取舍,我只能说:没有明确的选择方法。但我可以告诉你一个选择原则:如果多进程和多线程都能够满足要求,那么选择你最熟悉、最拿手的那个。

    需要提醒的是:虽然我给了这么多的选择原则,但实际应用中基本上都是“进程+线程”的结合方式,千万不要真的陷入一种非此即彼的误区。
    消耗资源:

    从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

    线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计,总的说来,一个进程的开销大约是一个线程开销的30倍左右,当然,在具体的系统上,这个数据可能会有较大的区别。
    此段转载自https://blog.csdn.net/yu876876/article/details/82810178

    展开全文
  • python中的多任务-多线程和多进程

    千次阅读 2019-03-10 11:12:29
    多线程和多进程都是实现多任务的一种方式,但是对于很多初学者来说想分清楚他们往往是一件非常头疼的事,首先我们需要了解多任务的概念。 所谓的多任务就是在同一时刻同时做很多事情,比如我们一边使用浏览器...

    多线程和多进程都是实现多任务的一种方式,但是对于很多初学者来说想分清楚他们往往是一件非常头疼的事,首先我们需要了解多任务的概念。

    python中的多任务-多线程和多进程

     

    所谓的多任务就是在同一时刻同时做很多事情,比如我们一边使用浏览器上网一边听着网易云音乐歌曲,同时又登录着QQ和微信,这时候至少有3个以上的任务同时运行,当然还有很多后台的程序运行着,只是我们看不到而已。

    现在的多核CPU可以说是非常普及了,但即使是以前的单核老电脑同样也是可以运行多任务的,但由于代码的顺序执行特性,单核CPU是怎样执行多任务的呢?

    python中的多任务-多线程和多进程

     

    答案就是操作系统使用了时间片轮转的算法让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样,这种执行方式叫做并发。

    python中的多任务-多线程和多进程

     

    python中的多任务-多线程和多进程

     

    如果任务数小于等于cpu核数,即任务真的是一起执行,这种执行方式叫做并行,真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

    实际程序开发中会大量使用多任务,如微信在发信息的同时需要接收信息,网易云音乐在下载的同时又需要播放歌曲。python语言中实现多任务的方式有三种:线程,进程和协程,协程会在后面的文章中给大家单独讲解,首先我们来分析一下线程和进程。

    python中的多任务-多线程和多进程

     

    如上代码,在main()函数中调用了load()和play()的函数分别用来模拟下载和播放音乐,但由于程序运行的时候只有一个主线程,所以先执行完下载音乐的代码再去执行播放音乐代码,程序的效率非常低。

    python中的多任务-多线程和多进程

     

    实际上我们在下载音乐的同时可以播放音乐,python中有一个实现多线程的类Thread,但由于这个类的代码太底层了,一般情况下我们会使用threading这个高级的类,threading其实也是对Thread类的封装,但里面包含了很多强大的功能,同时使用也是非常地方便。

    python中的多任务-多线程和多进程

    使用多线程完成多任务

    python中的多任务-多线程和多进程

    运行结果

    我们发现下载音乐和播放音乐的代码几乎是同时在进行的,这样程序执行效率会非常高,线程是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。如果把进程比做是一个办公室,则线程是办公室里面工作的一个员工,实际上完成工作的是员工而不是办公室,一个办公室里面配置两个员工的工作效率是要比一个员工高很多的。一个进程至少要有一个线程,就如同一个办公室至少需要配备一个员工,上面的程序实际上有三个线程,运行main函数的父线程,可以想象成是办公室中的老板,另外两个就是执行load和play函数的子线程,就如同是老板招来的员工。

    线程间的数据是相互共享的,就如同办公室里面的一台饮水机,办公室所有员工和老板都可以去打水喝,如下代码,load函数和play函数都可以访问到变量song_name里的歌曲名。

    python中的多任务-多线程和多进程

     

    接下来我们使用多进程的方式完成同时下载和播放音乐,在Python中,存在一个跨平台的包multiprocessing,通过引入包中的Process类,就可以创建多进程程序了,可以创建一个进程p=Process(target=func,args=(*,)),然后利用p.start()及p.join()来执行就可以了,代码如下:

    python中的多任务-多线程和多进程

     

    这时候我们发现运行代码后没有任何输出,主要的原因是进程之间是相互独立的,所以运行后的数据不会在运行的控制台显示。调用完子进程程start()方法后,主进程会马上结束,但子进程仍然会继续运行,如果我们想等待某一个子进程结束后再结束主进程,可以调用子进程的join()方法。

    另外,可以用进程池的方式,例如p=Pool(n),然后p.apply_async(func,args),这里可以使用n种不同的参数传入,建立不同的进程。用这种方式时,在调用join()方法前,要先调用close()方法,使得不能再添加新进程。

    python中的多任务-多线程和多进程

     

    进程之间的数据是相互独立的,所以不能使用全局变量共享数据,就如同两个完全独立的办公室,在不出办公室的情况下这个办公室的员工是不能喝到另外一个办公室里面饮水机的水的。如果需要数据共享, mutiprocessing包里提供了Queue、Pipe等多种进程间通信的方法。可以直接引入队列Queue类,然后实例化一个对象。则不同的进程可以使用put方法发信息,同时可以使用get方法取信息。

    python中的多任务-多线程和多进程

     

    运行效果如下:

    python中的多任务-多线程和多进程

     

    最后来说一下两者的优缺点。多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源,并且,操作系统对进程的总数会有一定的限制,若进程过多,操作系统调度都会存在问题,会造成假死状态。

    多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩溃,因为它们共享了进程的内存资源池。 对于任务数来说,无论是多进程或者多线程,都不能太多。因为操作系统在切换任务时,会有一系列的保护现场措施,这要花费相当的系统资源,若任务过多,则大部分资源都被用做干这些了,结果就是所有任务都做不好,所以操作系统会限制进程的数量。 另外,考虑计算密集型及IO密集型应用程序。对于计算密集型,多任务势必造成资源浪费。对于IO密集型,因为IO速度远低于CPU计算速度,所以使用多任务方式可以大大增大程序运行效率。

    好了,今天和大家分享的多任务的知识就到这里了,下一篇文章将继续为大家讲解python中实现多任务的第三种方式: 协程。作者是一名热爱编程的老师,熟练掌握c,c++,java,javascript,python,c#,go等热门编程语言,欢迎共同学习交流,发一篇文章真心不容易,喜欢作者的记得关注哦(*^_^*)

    https://www.toutiao.com/a6665988558018314759/

    展开全文
  • 进程和线程区别: 1、一个程序至少有一个进程,一个进程至少有一个线程; 2、资源(内存、寄存器等)分配给进程进程在执行过程拥有独立的内存空间,而同一进程下的所有线程共享所有资源,从而提高程序的运行效率...
  • 多任务操作系统环境下,进程线程的同步控制是多线程和多进程编程的一个重点,稍作总结  一、临界区(criticalsection)  1、临界区是线程同步的一种方式,即它在同一时刻只允许一个线程进入,其他线程只能等...
  • python中的多任务-多线程和多进程.pdf
  • 多进程多线程区别

    万次阅读 多人点赞 2016-04-21 10:01:16
    在Unix上编程采用多线程还是多进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用多进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一...
  • 进程和线程区别(超详细)

    万次阅读 多人点赞 2019-10-03 21:57:46
    进程和线程 进程 一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有线程,比如...与进程不同的是同类的线程共享进程的堆方法区资源,但每个线程有自己的程序计数器、虚拟...
  • 要认识多线程就要从操作系统的原理说起。  ... 现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN好友聊天。听歌聊天就是两个任
  • 1:请问QT的多线程是不是可以理解成Linux下的多进程? 2:如果不是,那么请问Qt下怎么进行多进程编程?进程之间的通信同步互斥什么的Qt有没有提供支持的类?还是得用Linux下的消息队列、管道、信号量什么的? 3:...
  • 多任务多进程多线程解析

    千次阅读 2011-03-06 11:21:00
    先弄清几个基本概念: 进程和线程都是操作系统中的概念,主要是面向计算机而言的。进程是执行中的程序,包括当前活动(通过处理器的值处理器寄存器的内容来表示)。通常还包括进程栈,数据段堆。程序本身不是...
  • 线程和进程 概念 进程(process):是指具有已一定功能的独立程序,是系统资源分配的基本单位,在内存中有其完备的数据空间代码空间,拥有完整的虚拟空间地址。一个进程所拥有的数据变量只属于它自己。 线程...
  • c语言多进程多线程编程c语言多进程多线程编程c语言多进程多线程编程c语言多进程多线程编程
  • 多线程和多进程区别

    千次阅读 多人点赞 2018-05-03 16:28:26
    线程:是进程的一个实体,是CPU调度分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器栈),但是它...
  • 进程-线程-多线程 1、进程(process) 狭义定义:进程就是一段程序的执行过程 简单的来讲进程的概念主要有两点: 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)...
  • 一、Python多进程多线程 关于python多进程多线程的相关基础知识,在我之前的博客有写过,并且就关于python多线程的GIL锁问题,也在我的一篇博客中有相关的解释。 为什么python多线程在面对IO密集型任务的时候会产生...
  • 多进程和多线程的较量

    千次阅读 2020-03-10 22:53:22
    通常多任务的实现,我们都是设计 Master-Worker,Master 负责分配任务,Worker 负责执行任务,因此多任务环境下,通常是一个 Master 多个 Worker。 如果用多进程实现 Master-Worker,主进程就是 Master,其...
  • 如果不作特殊处理,程序是无法执行多任务的。因为它只有一个进程,且此进程只包含一个线程。 更多内容,见www.vcshare.net
  • 多线程和多进程

    千次阅读 2013-04-30 09:49:57
    关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深受...
  • python多进程和多线程谁更快

    千次阅读 2019-06-16 11:34:39
    Python IO密集型任务、计算密集型任务,以及多线程多进程 - tsw123 - 博客园 https://www.cnblogs.com/tsw123/p/9504460.html Python IO密集型任务、计算密集型任务,以及多线程多进程选择 对于IO密集型...
  • 多线程和多进程区别

    千次阅读 2017-11-25 11:32:42
    多线程和多进程区别? 线程: 线程是操作系统能够进行运算调度的最小单位(程序执行流的最小单元)。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中...
  • 要认识多线程就要从操作系统的原理说起。  以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用...
  • 多进程和多线程区别

    千次阅读 2013-09-26 10:26:58
    PHP交流群:45503780  写这个的时候,才恍然意识到自己到底有多菜鸟。...  第一部分:概括  1. “进程是资源分配的最小单位,线程是CPU调度的最小单位”  2. 用多进程时每个进程都有自己的地址空间,线程
  • Python多进程和多线程(跑满CPU)

    万次阅读 多人点赞 2019-05-07 15:06:16
    Python多进程和多线程(跑满CPU) 概念 任务可以理解为进程(process),如打开一个word就是启动一个word进程。在一个word进程之中不只是进行打字输入,还需要拼写检查、打印等子任务,我们可以把进程中的这些子...
  • VC++多线程开发,多任务多进程的程序开发
  • Java多线程和多进程的对比1、多进程(1)多进程的优点(2)多进程的缺点2、多线程(1)多线程的优点(2)多线程的缺点 1、多进程 当前的操作系统都是多任务OS。每个独立执行的任务就是一个进程。 操作系统OS将时间...
  • 多进程和多线程编程操作

    千次阅读 2018-08-18 17:17:22
    1.什么是进程 进程是系统最小的资源管理单元,是一个程序在一个数据集上的一次动态执行过程。...一个进程可以有线程,而一个线程只服务于一个进程。 3.程序执行方法 串行 按照一定的步骤执行每个环节 ...
  • 多进程和多线程

    千次阅读 2010-10-09 10:39:00
    什么是多线程: <br />多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。 <br />使用线程的好处有以下几点: <br />·...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 315,762
精华内容 126,304
关键字:

多任务和多线程和多进程区别