程序,进程,线程的区别和联系
- 格式:pdf
- 大小:235.27 KB
- 文档页数:4
程序,进程,线程的区别和联系
c++多线程并发编程视频:
提取码:z9w1
进程和程序区别和联系表现在以下⽅⾯: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⼯作时间段的描述,不过是颗粒⼤⼩不同。
作者:zhonyong
链接:https://www.zhihu.com/question/25532384/answer/81152571
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。