程序,进程,线程的区别和联系
进程和程序区别和联系表现在以下⽅⾯:
1)程序只是⼀组指令的有序集合,它本⾝没有任何运⾏的含义,它只是⼀个静态的实体。⽽进程则不同,它是程序在某个数据集上的执⾏。进程是⼀个动态的实体,它有⾃⼰的⽣命周期。它因创建⽽产⽣,因调度⽽运⾏,因等待资源或事件⽽被处于等待状态,因完成任务⽽被撤消。反映了⼀个程序在⼀定的数据集上运⾏的全部动态过程。
2)进程和程序并不是⼀⼀对应的,⼀个程序执⾏在不同的数据集上就成为不同的进程,可以⽤进程控制块来唯⼀地标识每个进程。⽽这⼀点正是程序⽆法做到的,由于程序没有和数据产⽣直接的联系,既使是执⾏不同的数据的程序,他们的指令的集合依然是⼀样的,所以⽆法唯⼀地标识出这些运⾏于不同数据集上的程序。⼀般来说,⼀个进程肯定有⼀个与之对应的程序,⽽且只有⼀个。⽽⼀个程序有可能没有与之对应的进程(因为它没有执⾏),也有可能有多个进程与之对应(运⾏在⼏个不同的数据集上)。
3)进程还具有并发性和交往性,这也与程序的封闭性不同。
----------------------------------------------------------------------------------------------
进程和线程都是由操作系统所体会的程序运⾏的基本单元,系统利⽤该基本单元实现系统对应⽤的并发
性。进程和线程的区别在于:
简⽽⾔之,⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程。
线程的划分尺度⼩于进程,使得多线程程序的并发性⾼。
另外,进程在执⾏过程中拥有独⽴的内存单元,⽽多个线程共享内存,从⽽极⼤地提⾼了程序的运⾏效率。
线程在执⾏过程中与进程还是有区别的。每个独⽴的线程有⼀个程序运⾏的⼊⼝、顺序执⾏序列和程序的出⼝。但是线程不能够独⽴执⾏,必须依存在应⽤程序中,由应⽤程序提供多个线程执⾏控制。
从逻辑⾓度来看,多线程的意义在于⼀个应⽤程序中,有多个执⾏部分可以同时执⾏。但操作系统并没有将多个线程看做多个独⽴的应⽤,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
进程是具有⼀定独⽴功能的程序关于某个数据集合上的⼀次运⾏活动,进程是系统进⾏资源分配和调度的⼀个独⽴单位。
线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位.线
程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源。
⼀个线程可以创建和撤销另⼀个线程;同⼀个进程中的多个线程之间可以并发执⾏。
----------------------------------------------------------------------------------------------
进程和线程的区别
说法⼀:进程是具有⼀定独⽴功能的程序关于某个数据集合上的⼀次运⾏活动,进程是系统进⾏资源分配和调度的⼀个独⽴单位。
线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位.线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源。
⼀个线程可以创建和撤销另⼀个线程;同⼀个进程中的多个线程之间可以并发执⾏。
说法⼆:进程和线程都是由操作系统所体会的程序运⾏的基本单元,系统利⽤该基本单元实现系统对应⽤的并发性。进程和线程的区别在于:
简⽽⾔之,⼀个程序⾄少有⼀个进程,⼀个进程⾄少有⼀个线程.。
线程的划分尺度⼩于进程,使得多线程程序的并发性⾼。
另外,进程在执⾏过程中拥有独⽴的内存单元,⽽多个线程共享内存,从⽽极⼤地提⾼了程序的运⾏效率。
线程在执⾏过程中与进程还是有区别的。每个独⽴的线程有⼀个程序运⾏的⼊⼝、顺序执⾏序列和程序的出⼝。但是线程不能够独⽴执⾏,必须依存在应⽤程序中,由应⽤程序提供多个线程执⾏控制。
从逻辑⾓度来看,多线程的意义在于⼀个应⽤程序中,有多个执⾏部分可以同时执⾏。但操作系统并没有将多个线程看做多个独⽴的应⽤,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
说法三:多线程共存于应⽤程序中是现代操作系统中的基本特征和重要标志。⽤过UNIX操作系统的读者知道进程,在UNIX操作系统中,每个应⽤程序的执⾏都在操作系统内核中登记⼀个进程标志,操作系统根据分配的标志对应⽤程序的执⾏进⾏调度和系统资源分配,但进程和线程有什么区别呢?
进程和线程都是由操作系统所体会的程序运⾏的基本单元,系统利⽤该基本单元实现系统对应⽤的并发性。进程和线程的区别在于:
进程(Process)是最初定义在Unix等多⽤户、多任务操作系统环境下⽤于表⽰应⽤程序在内存环境中基本执⾏单元的概念。以Unix操作系统为例,进程是Unix操作系统环境中的基本成分、是系统资源分配的基本单位。Unix操作系统中完成的⼏乎所有⽤户管理和资源分配等⼯作都是通过操作系统对应⽤程序进程的控制来实现的。
C、C++、Java等语⾔编写的源程序经相应的编译器编译成可执⾏⽂件后,提交给计算机处理器运⾏。这时,处在可执⾏状态中的应⽤程序称为进程。从⽤户⾓度来看,进程是应⽤程序的⼀个执⾏过程。从操作系统核⼼⾓度来看,进程代表的是操作系统分配的内存、CPU时间⽚等资源的基本单位,是为正在运⾏的程序提供的运⾏环境。进程与应⽤程序的区别在于应⽤程序作为⼀个静态⽂件存储在计算机系统的硬盘等存储空间中,⽽进程则是处于动态条件下由操作系统维护的系统资源管理实体。多任务环境下应⽤程序进程的主要特点包括:
●进程在执⾏过程中有内存单元的初始⼊⼝点,并且进程存活过程中始终拥有独⽴的内存地址空间;
●进程的⽣存期状态包括创建、就绪、运⾏、阻塞和死亡等类型;
●从应⽤程序进程在执⾏过程中向CPU发出的运⾏指令形式不同,可以将进程的状态分为⽤户态和核⼼态。处于⽤户态下的进程执⾏的是应⽤程序指令、处于核⼼态下的应⽤程序进程执⾏的是操作系统指令。
在Unix操作系统启动过程中,系统⾃动创建swapper、init等系统进程,⽤于管理内存资源以及对⽤户进程进⾏调度等。在Unix环境下⽆论是由操作系统创建的进程还要由应⽤程序执⾏创建的进程,均拥有唯⼀的进程标识(PID)。
说法四:应⽤程序在执⾏过程中存在⼀个内存空间的初始⼊⼝点地址、⼀个程序执⾏过程中的代码执⾏序列以及⽤于标识进程结束的内存出⼝点地址,在进程执⾏过程中的每⼀时间点均有唯⼀的处理器指令与内存单元地址相对应。
Java语⾔中定义的线程(Thread)同样包括⼀个内存⼊⼝点地址、⼀个出⼝点地址以及能够顺序执⾏的代码序列。但是进程与线程的重要区别在于线程不能够单独执⾏,它必须运⾏在处于活动状态的应⽤程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。
Unix操作系统和Microsoft Windows操作系统⽀持多⽤户、多进程的并发执⾏,⽽Java语⾔⽀持应⽤程序进程内部的多个执⾏线程的并发执⾏。多线程的意义在于⼀个应⽤程序的多个逻辑单元可以并发地执⾏。但是多线程并不意味着多个⽤户进程在执⾏,操作系统也不把每个线程作为独⽴的进程来分配独⽴的系统资源。进程可以创建其⼦进程,⼦进程与⽗进程拥有不同的可执⾏代码和数据内存空间。⽽在⽤于代表应⽤程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独⽴的执⾏堆栈和程序执⾏上下⽂(Context)。
基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等⽅⾯⾮常廉价。
线程需要操作系统的⽀持,不是所有类型的计算机都⽀持多线程应⽤程序。Java程序设计语⾔将线程⽀持与语⾔运⾏环境结合在⼀起,提供了多任务并发执⾏的能⼒。这就好⽐⼀个⼈在处理家务的过程中,将⾐服放到洗⾐机中⾃动洗涤后将⼤⽶放在电饭锅⾥,然后开始做菜。等菜做好了,饭熟了同时⾐服也洗好了。
需要注意的是:在应⽤程序中使⽤多线程不会增加 CPU 的数据处理能⼒。只有在多CPU 的计算机或者在⽹络计算体系结构下,将Java程序划分为多个并发执⾏线程后,同时启动多个线程运⾏,使不同的线程运⾏在基于不同处理器的Java虚拟机中,才能提⾼应⽤程序的执⾏效率。
⾸先来⼀句概括的总论:进程和线程都是⼀个时间段的描述,是CPU⼯作时间段的描述。
下⾯细说背景:
CPU+RAM+各种资源(⽐如显卡,光驱,键盘,GPS, 等等外设)构成我们的电脑,但是电脑的运⾏,实际就是CPU和相关寄存器以及RAM之间的事情。
⼀个最最基础的事实:CPU太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在
各总线上的设备完全是望其项背。那当多个任务要执⾏的时候怎么办呢?轮流着来?或者谁优先级⾼谁来?不管怎么样的策略,⼀句话就是在CPU看来就是轮流着来。
⼀个必须知道的事实:执⾏⼀段程序代码,实现⼀个功能的过程介绍 ,当得到CPU的时候,相关的资源必须也已经就位,就是显卡
啊,GPS啊什么的必须就位,然后CPU开始执⾏。这⾥除了CPU以外所有的就构成了这个程序的执⾏环境,也就是我们所定义的程序上下⽂。当这个程序执⾏完了,或者分配给他的CPU执⾏时间⽤完了,那它就要被切换出去,等待下⼀次CPU的临幸。在被切换出去的最后⼀步⼯作就是保存程序上下⽂,因为这个是下次他被CPU临幸的运⾏环境,必须保存。
串联起来的事实:前⾯讲过在CPU看来所有的任务都是⼀个⼀个的轮流执⾏的,具体的轮流⽅法就是:先加载程序A的上下⽂,然后开始执⾏A,保存程序A的上下⽂,调⼊下⼀个要执⾏的程序B的程序上下⽂,然后开始执⾏B,保存程序B的上下⽂。。。。
========= 重要的东西出现了========
进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。
进程就是包括上下⽂切换的程序执⾏时间总和 = CPU加载上下⽂+CPU执⾏+CPU保存上下⽂
线程是什么呢?
进程的颗粒度太⼤,每次都要有上下的调⼊,保存,调出。如果我们把进程⽐喻为⼀个运⾏在电脑上的软件,那么⼀个软件的执⾏不可能是⼀条逻辑执⾏的,必定有多个分⽀和多个程序段,就好⽐要实现程序A,实际分成 a,b,c等多个块组合⽽成。那么这⾥具体的执⾏就可能变成:
程序A得到CPU =》CPU加载上下⽂,开始执⾏程序A的a⼩段,然后执⾏A的b⼩段,然后再执⾏A的c⼩段,最后CPU保存A的上下⽂。
这⾥a,b,c的执⾏是共享了A的上下⽂,CPU在执⾏的时候没有进⾏上下⽂切换的。这⾥的a,b,c就是线程,也就是说线程是共享了进程的上下⽂环境,的更为细⼩的CPU时间段。
到此全⽂结束,再⼀个总结:
进程和线程都是⼀个时间段的描述,是CPU⼯作时间段的描述,不过是颗粒⼤⼩不同。
⼀、进程
进程:指在系统中能独⽴运⾏并作为资源分配的基本单位,它是由⼀组机器指令、数据和堆栈等组成的,是⼀个能独⽴运⾏的活动实体。
注意,进程⼀般有三个状态:就绪状态、执⾏状态和等待状态【或称阻塞状态】;进程只能由⽗进程建⽴,系统中所有的进程形成⼀种进程树的层次体系;挂起命令可由进程⾃⼰和其他进程发出,但是解除挂起命令只能由其他进程发出。
进程控制块(PCB):PCB不但可以记录进程的属性信息,以便操作系统对进程进⾏控制和管理,⽽且PCB标志着进程的存在,操作系统根据系统中是否有该进程的进程控制块PCB⽽知道该进程存在与否。系统建⽴进程的同时就建⽴该进程的PCB,在撤销⼀个进程时,也就撤销其PCB,故进程的PCB对进程来说是它存在的具体的物理标志和体现。⼀般PCB包括以下三类信息:进程标识信息;处理器状态信息;进程控制信息。
由程序段、相关的数据段和PCB三部分构成了进程实体(⼜称进程印像),⼀般,我们把进程实体就简称为进程。
进程的特征:
1.动态性:进程的实质是程序的⼀次执⾏过程,进程是动态产⽣,动态消亡的。
2.并发性:任何进程都可以同其他进程⼀起并发执⾏。
3.独⽴性:进程是⼀个能独⽴运⾏的基本单位,同时也是系统分配资源和调度的独⽴单位。
4.异步性:由于进程间的相互制约,使进程具有执⾏的间断性,即进程按各⾃独⽴的、不可预知的速度向前推进。一个线程可以包含多个进程
⼆、线程
线程:线程是进程中的⼀个实体,作为系统调度和分派的基本单位。Linux下的线程看作轻量级进程。
线程的性质:
1.线程是进程内的⼀个相对独⽴的可执⾏的单元。若把进程称为任务的话,那么线程则是应⽤中的⼀个⼦任务的执⾏。
2.由于线程是被调度的基本单元,⽽进程不是调度单元。所以,每个进程在创建时,⾄少需要同时为该进程创建⼀个线程。即进程中⾄少要有⼀个或⼀个以上的线程,否则该进程⽆法被调度执⾏。
3.进程是被分给并拥有资源的基本单元。同⼀进程内的多个线程共享该进程的资源,但线程并不拥有资源,只是使⽤他们。
4.线程是操作系统中基本调度单元,因此线程中应包含有调度所需要的必要信息,且在⽣命周期中有状态的变化。
5.由于共享资源【包括数据和⽂件】,所以线程间需要通信和同步机制,且需要时线程可以创建其他线程,但线程间不存在⽗⼦关系。
多线程使⽤的情形:前台和后台⼯作情况;异步处理⼯作情况;需要加快执⾏速度情况;组织复杂⼯作的情况;同时有多个⽤户服务请求的情况等。
线程机制的优点:
多线程运⾏在同⼀个进程的相同的地址空间内,和采⽤多进程相⽐有以下优点:
1.创建和撤销线程的开销较之进程要少。创建线程时只需要建⽴线程控制表相应的表⽬,或有关队列,⽽创建进程时,要创建PCB表和初始化,进⼊有关进程队列,建⽴它的地址空间和所需资源等。
2.CPU在线程之间开关时的开销远⽐进程要少得多。因开关线程都在同⼀地址空间内,只需要修改线程控制表或队列,不涉及地址空间和其他⼯作。
3.线程机制也增加了通讯的有效性。进程间的通讯往往要求内核的参与,以提供通讯机制和保护机制,⽽线程间的通讯是在同⼀进程的地址空间内,共享主存和⽂件,⽆需内核参与。
三、进程和线程的区别
(1)调度:
在传统的操作系统中,CPU调度和分派的基本单位是进程。⽽在引⼊线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位,从⽽使传统进程的两个属性分开,线程编程轻装运⾏,这样可以显著地提⾼系统的并发性。同⼀进程中线程的切换不会引起进程切换,从⽽避免了昂贵的系统调⽤,但是在由⼀个进程中的线程切换到另⼀进程中的线程,依然会引起进程切换。
(2)并发性:
在引⼊线程的操作系统中,不仅进程之间可以并发执⾏,⽽且在⼀个进程中的多个线程之间也可以并发执⾏,因⽽使操作系统具有更好的并发性,从⽽更有效地提⾼系统资源和系统的吞吐量。例如,在⼀个为引⼊线程的单CPU操作系统中,若仅设置⼀个⽂件服务进程,当它由于某种原因被封锁时,便没有其他的⽂件服务进程来提供服务。在引⼊线程的操作系统中,可以在⼀个⽂件服务进程设置多个服务线程。当第⼀个线程等待时,⽂件服务进程中的第⼆个线程可以继续运⾏;当第⼆个线程封锁时,第三个线程可以继续执⾏,从⽽显著地提⾼了⽂件服务的质量以及系统的吞吐量。
(3)拥有资源:
不论是引⼊了线程的操作系统,还是传统的操作系统,进程都是拥有系统资源的⼀个独⽴单位,他可以拥有⾃⼰的资源。⼀般地说,线程⾃⼰不能拥有资源(也有⼀点必不可少的资源),但它可以访问其⾪属进程的资源,亦即⼀个进程的代码段、数据段以及系统资源(如已打开的⽂件、I/O设备等),可供同⼀个进程的其他所有线程共享。
(4)独⽴性:
在同⼀进程中的不同线程之间的独⽴性要⽐不同进程之间的独⽴性低得多。这是因为
为防⽌进程之间彼此⼲扰和破坏,每个进程都拥有⼀个独⽴的地址空间和其它资源,除了共享全局变量外,不允许其它进程的访问。但是同⼀进程中的不同线程往往是为了提⾼并发性以及进⾏相互之间的合作⽽创建的,它们共享进程的内存地址空间和资源,如每个线程都可以访问它们所属进程地址空间中的所有地址,如⼀个线程的堆栈可以被其它线程读、写,甚⾄完全清除。
(5)系统开销:
由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统为此所付出的开销将显著地⼤于在创建或撤消线程时的开销。类似的,在进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运⾏的CPU环境的设置,⽽线程切换只需保存和设置
少量的寄存器的内容,并不涉及存储器管理⽅⾯的操作,可见,进程切换的开销也远⼤于线程切换的开销。此外,由于同⼀进程中的多个线程具有相同的地址空间,致使他们之间的同步和通信的实现也变得⽐较容易。在有的系统中,现成的切换、同步、和通信都⽆需操作系统内核的⼲预。
(6)⽀持多处理机系统:
在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运⾏在⼀个处理机上。但对于多线程进程,就可以将⼀个进程中的多个线程分配到多个处理机上,使它们并⾏执⾏,这⽆疑将加速进程的完成。因此,现代处理机OS都⽆⼀例外地引⼊了多线程。
下⾯举个Windows下例⼦:
我只运⾏了⼀个浏览器,为什么有多个进程呢?
因为现在的浏览器为了增强稳定性,使⽤户有个好的上⽹体验,每打开⼀个⽹页就做为独⽴进程,当浏览器浏览的某个⽹页由于某种问题不得不退出的时候,不会影响到你同时打开的其它⽹页,因为其它⽹页在其它进程内存空间⾥,不在同空间。否则,如果不管打开多少⽹页,只有⼀个进程,那所有进程都在同⼀内存空间,那⼀个⽹页崩溃的时候,会导致你同时打开的所有⽹页关掉,那⽤户体验会⾮常糟糕的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论