进程、线程、协程之概念理解+线程和进程各⾃有什么区别和优
劣
⼀、概念
⾸先,根据图了解⼀下串⾏,并⾏和并发的基本概念:
1、进程
资源分配的基本单位
进程(Process)是计算机中的程序关于某数据集合上的⼀次运⾏活动,是系统进⾏资源分配和调度的基本单位,是操作系统结构的基础。在早期⾯向进程设计的计算机结构中,进程是程序的基本执⾏实体;在当代⾯向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 Linux系统函数fork()可在⽗进程中创建⼀个⼦进程,在⽗进程接到新请求时,复制出⼀个⼦进程来处理,即⽗进程监控请求,⼦进程处理,实现并发处理。注意:必须是Linux系统,windows不能⽤fork。
组成
进程间通信和线程间通信的区别进程是⼀个实体。每⼀个进程都有它⾃⼰的地址空间,⼀般情况下,包括⽂本区域(text region)、数据区域(data region)和堆栈(stack region)。⽂本区域存储处理器执⾏的代码;数据区域存储变量和进程执⾏期间使⽤的动态分配的内存;堆栈区域存储着活动过程调⽤的指令和本地变量。
特征
动态性:进程的实质是程序在多道程序系统中的⼀次执⾏过程,进程是动态产⽣,动态消亡的。
并发性:任何进程都可以同其他进程⼀起并发执⾏
独⽴性:进程是⼀个能独⽴运⾏的基本单位,同时也是系统分配资源和调度的独⽴单位;
异步性:由于进程间的相互制约,使进程具有执⾏的间断性,即进程按各⾃独⽴的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:⼀个程序在不同的数据集⾥就构成不同的进程,能得到不同的结果;但是执⾏过程中,程序不能发⽣改变。
进程的⼏种状态
(1)run(运⾏状态):正在运⾏的进程或在等待队列中等待的进程,等待的进程只要以得到cpu就可以运⾏
(2)Sleep(可中断休眠状态):相当于阻塞或在等待的状态
(3)D(不可中断休眠状态):在磁盘上的进程
(4)T(停⽌状态):这中状态⽆法直观的看见,因为是进程停⽌后就释放了资源,所以不会留在linux中
(5)Z(僵⼫状态):⼦进程先与⽗进程结束,但⽗进程没有调⽤wait或waitpid来回收⼦进程的资源,所以⼦进程就成了僵⼫进程,如果⽗进程结束后任然没有回收⼦进程的资源,那么1号进程将回收
2、线程
CPU调度和分配的基本单位,程序执⾏的最⼩单位。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执⾏流的最⼩单元。⼀个标准的线程由线程ID,当前指令(PC),集合和组成。另外,线程是进程中的⼀个实体,是被系统独⽴调度和分派的基本单位,线程⾃⼰不拥有系统资源,只拥有⼀点⼉在运⾏中必不可少的资源,但它可与同属⼀
个进程的其它线程共享进程所拥有的全部资源。⼀个线程可以创建和撤消另⼀个线程,同⼀进程中的多个线程之间可以并发执⾏。由于线程之间的相互制约,致使线程在运⾏中呈现出间断性。线程也有、和三种基本状态。就绪状态是指线程具备运⾏的所有条件,逻辑上可以运⾏,在等待处理机;运⾏状态是指线程占有处理机正在运⾏;阻塞状态是指线程在等待⼀个事件(如某个信号量),逻辑上不可执⾏。每⼀个程序都⾄少有⼀个线程,若程序只有⼀个线程,那就是程序本⾝。
线程是程序中⼀个单⼀的顺序控制流程。进程内⼀个相对独⽴的、可调度的执⾏单元,是系统独⽴调度和分派CPU的基本单位指中的程序的调度单位。在单个程序中同时运⾏多个线程完成不同的⼯作,称为。
线程是程序中⼀个单⼀的顺序控制流程。进程内⼀个相对独⽴的、可调度的执⾏单元,是系统独⽴调度和分派CPU的基本单位指中的程序的调度单位。在单个程序中同时运⾏多个线程完成不同的⼯作,称为。
在同⼀时间⽚只能有⼀个线程针对⼀个cpu执⾏指令,⽽且其他的线程必须被挂起。然后内核调度程序不断的唤醒/挂起线程来模拟多个任务的执⾏。
⼀个进程可以由很多个线程组成,线程间共享进程的所有资源。线程有⾃⼰的堆栈、局部变量。
线程的创建调⽤pthread_create
线程中执⾏时⼀般都要进⾏同步和互斥,保证数据的⼀致性,因为他们共享同⼀进程的所有资源。
同步:防⽌竞争(因同时修改导致数据的不⼀致)
互斥:使⽤互斥锁防⽌多个线程同时读写某⼀块内存区域。互斥锁⽌允许⼀个线程进⼊临界区。
信号量:内存区域只允许固定个数的线程进⼊,就要使⽤信号量,防⽌线程之间产⽣冲突。信号量许多个线程同时进⼊临界区。
3、协程
协程,⼜称微线程,纤程,coroutine 。
⼀个程序可以包含多个协程,可以对⽐与⼀个进程包含多个线程,因⽽下⾯我们来⽐较协程和线程。我们知道多个线程相对独⽴,有⾃⼰的上下⽂,切换受系统控制;⽽协程也相对独⽴,有⾃⼰的上下⽂,但是其切换由⾃⼰控制,由当前协程切换到其他协程由当前协程来控制。
协程是⼀个线程执⾏,两个⼦过程通过相互协作完成某个任务。协程和⼦程序调⽤很像,但协程是在⼦程序内部中断去执⾏别的⼦程序,适当时候返回接着执⾏,中断有别于函数调⽤。
4、Daemon
Daemon()程序是⼀直运⾏的服务端,⼜称为。通常在系统后台运⾏,没有控制终端,不与前台交互,Daemon程序⼀般作为使⽤。Daemon是长时间运⾏的进程,通常在系统启动后就运⾏,在系统关闭时才结束。⼀般说Daemon程序在后台运⾏,是因为它没有控制终端,⽆法和前台的⽤户交互。Daemon程序⼀般都作为服务程序使⽤,等待客户端程序与它通信。我们也把运⾏的Daemon程序称作守护进程。
所谓守护线程,是指在程序运⾏的时候在后台提供⼀种通⽤服务的线程,⽐如垃圾回收线程就是⼀个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的⾮守护线程结束时,程序也就终⽌了,同时会杀死进程中的所有守护线程。反过来说,只要任何⾮守护线程还在运⾏,程序就不会终⽌。
⽤户线程和守护线程两者⼏乎没有区别,唯⼀的不同之处就在于虚拟机的离开:如果⽤户线程已经全部退出运⾏了,只剩下守护线程存在了,虚拟机也就退出了。因为没有了被守护者,守护线程也就没有⼯作可做了,也就没有继续运⾏程序的必要了。
5、多进程和多线程
进程是资源分配的最⼩单位,线程是CPU调度的最⼩单位。线程和进程的区别在于,⼦进程和⽗进程有不同的代码和数据空间,⽽多个线程则共享数据空间,每个线程有⾃⼰的执⾏堆栈和程序计数器为其执⾏上
下⽂.多线程主要是为了节约CPU时间,发挥利⽤,根据具体情况⽽定. 线程的运⾏中需要使⽤计算机的内存资源和CPU。
多进程:进程是程序在计算机上的⼀次执⾏活动。当你运⾏⼀个程序,你就启动了⼀个进程。显然,程序是死的(静态的),进程是活的(动态的)。进程可以分为系统进程和⽤户进程。凡是⽤于完成操作系统的各种功能的进程就是系统进程,它们就是处于运⾏状态下的操作系统本⾝;所有由⽤户启动的进程都是⽤户进程。进程是操作系统进⾏资源分配的单位。进程⼜被细化为线程,也就是⼀个进程下有多个能独⽴运⾏的更⼩的单位。在同⼀个时间⾥,同⼀个计算机系统中如果允许两个或两个以上的进程处于运⾏状态,这便是多任务。现代的操作系统⼏乎都是多任务操作系统,能够同时管理多个进程的运⾏。多任务带来的好处是明显的,⽐如你可以边听mp3边上⽹,与此同时甚⾄可以将下载的⽂档打印出来,⽽这些任务之间丝毫不会相互⼲扰。那么这⾥就涉及到并⾏的问题,俗话说,⼀⼼不能⼆⽤,这对计算机也⼀样,原则上⼀个CPU只能分配给⼀个进程,以便运⾏这个进程。我们通常使⽤的计算机中只有⼀个CPU,也就是说只有⼀颗⼼,要让它⼀⼼多⽤,同时运⾏多个进程,就必须使⽤并发技术。实现并发技术相当复杂,最容易理解的是“时间⽚轮转进程调度算法”,它的思想简单介绍如下:在操作系统的管理下,所有正在运⾏的进程轮流使⽤CPU,每个进程允许占⽤CPU的时间⾮常短(⽐如10毫秒),这样⽤户根本感觉不出来 CPU是在轮流为多个进程服务,就好象所有的进程都在不间断地运⾏⼀样。但实际上在任何⼀个时间内有且仅有⼀个进程占有CPU。如果⼀台计算机有多个CPU,情况就不同了,如果进程数
⼩于CPU数,则不同的进程可以分配给不同的CPU来运⾏,这样,多个进程就是真正同时运⾏的,这便是并⾏。但如果进程数⼤于CPU数,则仍然需要使⽤并发技术。进⾏CPU分配是以线程为单位的,⼀个进程可能由多个线程组成,这时情况更加复杂,但简单地说,有如下关系:
总线程数<= CPU数量:并⾏运⾏
总线程数> CPU数量:并发运⾏
并⾏运⾏的效率显然⾼于并发运⾏,所以在多CPU的计算机中,多任务的效率⽐较⾼。但是,如果在多CPU计算机中只运⾏⼀个进程(线程),就不能发挥多CPU的优势。这⾥涉及到多任务操作系统的问题,多任务操作系统(如Windows)的基本原理是:操作系统将CPU的时间⽚分配给多个线程,每个线程在操作系统指定的时间⽚内完成(注意,这⾥的多个线程是分属于不同进程的).操作系统不断的从⼀个线程的执⾏切换到另⼀个线程的执⾏,如此往复,宏观上看来,就好像是多个线程在⼀起执⾏.由于这多个线程分属于不同的进程,因此在我们看来,就好像是多个进程在同时执⾏,这样就实现了多任务
多线程:在计算机编程中,⼀个基本的概念就是同时对多个任务加以控制。许多程序设计问题都要求程序能够停下⼿头的⼯作,改为处理其他⼀些问题,再返回主进程。可以通过多种途径达到这个⽬的。最开始的时候,那些掌握机器低级语⾔的程序员编写⼀些“中断服务例程”,主进程的暂停是通过硬件级的中断实现的。尽管这是⼀种有⽤的⽅法,但编出的程序很难移植,由此造成了另⼀类的代价⾼昂问题。
中断对那些实时性很强的任务来说是很有必要的。但对于其他许多问题,只要求将问题划分进⼊独⽴运⾏的程序⽚断中,使整个程序能更迅速地响应⽤户的请求。
最开始,线程只是⽤于分配单个处理器的处理时间的⼀种⼯具。但假如操作系统本⾝⽀持多个处理器,那么每个线程都可分配给⼀个不同的处理器,真正进⼊“并⾏运算”状态。从程序设计语⾔的⾓度看,多线程操作最有价值的特性之⼀就是程序员不必关⼼到底使⽤了多少个处理器。程序在逻辑意义上被分割为数个线程;假如机器本⾝安装了多个处理器,那么程序会运⾏得更快,⽏需作出任何特殊的调校。根据
前⾯的论述,⼤家可能感觉线程处理⾮常简单。但必须注意⼀个问题:共享资源!如果有多个线程同时运⾏,⽽且它们试图访问相同的资源,就会遇到⼀个问题。举个例⼦来说,两个线程不能将信息同时发送给⼀台打印机。为解决这个问题,对那些可共享的资源来说(⽐如打印机),它们在使⽤期间必须进⼊锁定状态。所以⼀个线程可将资源锁定,在完成了它的任务后,再解开(释放)这个锁,使其他线程可以接着使⽤同样的资源。
多线程是为了同步完成多项任务,不是为了提⾼运⾏效率,⽽是为了提⾼资源使⽤效率来提⾼系统的效率。线程是在同⼀时间需要完成多项任务的时候实现的。
⼀个采⽤了多线程技术的应⽤程序可以更好地利⽤系统资源。其主要优势在于充分利⽤了CPU的空闲
时间⽚,可以⽤尽可能少的时间来对⽤户的要求做出响应,使得进程的整体运⾏效率得到较⼤提⾼,同时增强了应⽤程序的灵活性。更为重要的是,由于同⼀进程的所有线程是共享同⼀内存,所以不需要特殊的数据传送机制,不需要建⽴共享存储区或共享⽂件,从⽽使得不同任务之间的协调操作与运⾏、数据的交互、资源的分配等问题更加易于解决。
进程间通信(IPC,Inter-Process Communication),指⾄少两个进程或线程间传送数据或信号的⼀些技术或⽅法。进程是计算机系统分配资源的最⼩单位。每个进程都有⾃⼰的⼀部分独⽴的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进⾏协调⼯作,才有了进程间通信。这些进程可以运⾏在同⼀计算机上或⽹络连接的不同计算机上。
进程间通信技术包括消息传递、同步、共享内存和远程过程调⽤。IPC是⼀种标准的Unix通信机制。
使⽤IPC 的理由:
信息共享
加速;
模块化;
⽅便; 以及
私有权分离.
主要的 IPC ⽅法
⽅法提供⽅(操作系统或其他环境)
⽂件多数操作系统
信号多数操作系统
Socket 多数操作系统
消息队列(en:Message queue) 多数操作系统
管道(en:Pipe) 所有的 POSIX systems, Windows.
具名管道(en:Named Pipe) 所有的 POSIX 系统, Windows.
信号量(en:Semaphore) 所有的 POSIX 系统, Windows.
共享内存所有的 POSIX 系统, Windows.
Message passing(en:Message passing) ⽤于 MPI规范,Java RMI, CORBA, MSMQ, MailSlot 以及其他.
线程和进程各⾃有什么区别和优劣呢?
进程是资源分配的最⼩单位,线程是程序执⾏的最⼩单位。
进程有⾃⼰的独⽴地址空间,每启动⼀个进程,系统就会为它分配地址空间,建⽴数据表来维护代码段、堆栈段和数据段,这种操作⾮常昂贵。⽽线程是共享进程中的数据的,使⽤相同的地址空间,因此CPU切换⼀个线程的花费远⽐进程要⼩很多,同时创建⼀个线程的开销也⽐进程要⼩很多。
线程之间的通信更⽅便,同⼀进程下的线程共享全局变量、静态变量等数据,⽽进程之间的通信需要以通信的⽅式(IPC)进⾏。不过如何处理好同步与互斥是编写多线程程序的难点。
但是多进程程序更健壮,多线程程序只要有⼀个线程死掉,整个进程也死掉了,⽽⼀个进程死掉并不会对另外⼀个进程造成影响,因为进程有⾃⼰独⽴的地址空间。
协程与多线程的区别
(1)开销。协程执⾏效率⾼,协程是单个线程执⾏,以⼦程序中断的形式切换,没有多线程切换的开销。
(2)协程不需要多线程的锁机制。不存在同时写变量冲突。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论