一、进程简介
1.1 进程概念的引入
计算机中,CPU是最宝贵的资源,为了提高CPU的利用率,引入了多道程序设计的概念。当内存中多个程序存在时,如果不对人们熟悉的“程序”的概念加以扩充,就无法刻画多个程序共同运行时系统呈现出的特征。
多道程序设计:是指允许多个作业(程序)同时进入计算机系统的内存并启动交替计算的方法。
也就是说,内存中多个相互独立的程序均处于开始和结束之间。
从宏观上看是并行的,多道程序都处于运行过程中,但尚未运行结束;
从微观角度上看是串行的,各道程序轮流的占用CPU交替的执行。
引入多道程序设计技术可以提高CPU的利用率,充分发挥计算机硬部件的并行性。
多道程序系统中,程序具有:并行、制约以及动态的特征。程序概念难以便是和反映系统中的情况,所以引入了进程这一概念。
1.2 程序是什么
说起进程,就不得不说下程序。先看定义:程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。系统实际上是出于不断变化的状态中,程序不能反映这种动态性。
而进程则是在处理机上的一次执行过程,它是一个动态的概念。这个不难理解,其实进程是包含程序的,进程的执行离不开程序,进程中的文本区域就是代码区,也就是程序。
1.3 进程是什么
1.3.1 进程的概念
进程的定义: 进程是据有独立功能的程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位。
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
从原理角度上看:进程是支持程序执行的一种系统机制,它对处理器上运行程序的活动规律进行抽象。
从实现角度看:进程是一种数据结构,用来准确的刻画运行程序的状态和系统动态变化状况。
简单的来讲进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个 “执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
1.3.2 进程的类型
- 系统进程:操作系统用来管理资源的进程,当系统进程处于运行态时,CPU处于管态,系统之间的关系由操作系统负责。
- 用户进程:操作系统可以独立执行的的用户程序段,当用户进程处于运行态时,CPU处于目态,用户进程之间的关系由用户负责。
1.3.3 进程控制块
- 进程的三个组成部分
a. 程序
b. 数据
c. 进程控制块(PCB):为了管理和控制进程,系统在创建每个进程时,都为其开辟一个专用的存储区,用以记录它在系统中的动态特性。系统根据存储区的信息对进程实施控制管理。进程任务完成后,系统收回该存储区,进程随之消亡,这一存储区就是进程控制块
PCB随着进程的创建而建立,撤销而消亡。系统根据PCB感知一个进程的存在,PCB是进程存在的唯一物理标识(这一点可以类比作业控制块JCB)
- 进程控制块的内容
PCB在不同的语言中,可能用不同的数据结构表示。为了系统管理和控制进程方便,系统常常将所有进程的PCB存放在内存中系统表格区(这是什么区?不懂,待我仔细查查),并按照进程内部标号由小到大顺序存放。
整个系统中各进程的的PCB集合可用数组表示。这时进程内部标号可以与数组元素下标联系。
各系统预留的PCB空间往往是固定的,如UNIX系统中规定进程数量不超过50个(这一点我有点怀疑)
操作系统不同,PCB的格式、大小及内容也不尽相同。一般的,应该包含如下四个信息
a. 标识信息:进程名
b. 说明信息:进程状态、程序存放位置
c. 现场信息:通用寄存器内存、控制寄存器内存、断点地址
d. 管理信息:进程优先数、队列指针
1.3.4 进程的重要特征
1. 动态特征:进程对应于程序的运行,动态产生、消亡,在其生命周期中进程也是动态的、
2. 并发特征:任何进程都可以同其他进程一起向前推进
3. 独立特征:进程是相对完整的调度单位,可以获得CPU,参与并发执行
4. 交往特征:一个进程在执行过程中可与其他进程产生直接或间接关系
5. 异步特征:每个进程都以相对独立、不可预知的速度向前推进
6. 结构特征:每个进程都有一个PCB作为他的数据结构
进程最基本的特征是并发和共享特征
1.3.5 进程的状态与转换
- 进程的三种基本状态
a. 运行状态:获得CPU的进程处于此状态,对应的程序在CPU上运行着
b. 阻塞状态:为了等待某个外部事件的发生(如等待I/O操作的完成,等待另一个进程发来消息),暂时无法运行。也成为等待状态
c. 就绪状态:具备了一切运行需要的条件,由于其他进程占用CPU而暂时无法运行
- 进程状态之间的转换
a. 运行状态 ===> 阻塞状态:例如正在运行的进程提出I/O请求,由运行状态转化为阻塞状态
b. 阻塞状态 ===> 就绪状态:例如I/O操作完成之后,由阻塞状态转化为就绪状态
c. 就绪状态 ===> 运行状态:例如就绪状态的进程被进程调度程序选中,分配到CPU中运行,由就绪状态转化为运行状态
d. 运行状态 ===> 就绪状态:处于运行状态的进程的时间片用完,不得不让出CPU,由运行状态转化为就绪状态
1.4 进程与程序的区别
A.进程是一个动态的概念
进程是程序的一次执行过程,是动态概念
程序是一组有序的指令和数据集和,是静态概念
B.进程有自己的生命周期
当操作系统要完成某个任务时,它会创建一个进程。当进程完成任务之后,系统就会撤销这个进程,收回它所占用的资源。从创建到撤销的时间段就是进程的生命周期。而程序可以作为一种软件资料永久保存。
C.进程之间存在并发性
并发是指两个或多个事件在同一时间间隔内发生。在多道程序环境下,并发性是指在一段时间宏观上有多个程序在同时运行,但在单处理机系统中,每一时刻却仅能只有一道程序在执行,故微观上这些程序只能时分时交替执行。
进程是一个动态的概念,是一个可以独立运行的单位。在一个系统中,同时会存在多个进程。他们轮流占用CPU和各种资源。
D.进程与程序之间无一一对应关系
不同的进程可以包含同一程序,同一程序在执行中也可以产生多个进程。
- 不同的进程可以执行同一个程序
区分进程的条件:所执行的程序和数据集合。
两个进程即使执行在相同的程序上,只要他们运行在不同的数据集合上,他们也是两个进程。
- 一个进程可以执行多个程序
比如Word,它可以同时进行打字、拼写检查、打印等事情。打开word是一个进程,而编写word则执行了多个程序。(不知道是否恰当)
E.进程间存在着相互制约
进程是系统中资源分配和运行调度的单位,在对资源的共享和竞争中,必然相互制约,影响各自向前推进的速度。
F.程序是记录在介质上指令的有序集合,而进程则由程序、数据和进程控制块(Process Control Block, PCB)3部分组成
G. 进程可以创建子进程,程序不能创建子程序
一个用户进程在运行过程中可以创建一个或多个子进程为其服务。当一个进程创建另一个进程时,生成进程称为父进程,被生成进程称为子进程,父进程还可以创建多个子进程,从而形成树状族系关系。
二、线程简介
2.1 线程概念的引入
如果说操作系统中引入进程的目的是为了使多个程序并发执行,以便改善资源利用率和提高系统效率,那么,在进程之后再引入线程概念则是为了减少程序并发执行时所付出的时空开销,使得并发粒度更细、并发性更好。解决问题的基本思路是:把进程的两项功能“独立分配资源”和“被调度分配执行”分离开来,前一项任务仍然由进程完成,作为系统资源分配和保护的独立单位,无须频繁切换;后一项任务交给称作线程的实体来完成,线程作为系统调度和分配的基本单位,会被频繁的调度和切换。在这种思想的指导下产生了多线程的概念,及多线程(结构)进程。
2.2线程是什么
2.2.1 线程的概念
线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。是被系统独立调度和分派的基本单位。
是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。线程有就绪、阻塞和运行三种基本状态。
一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
进程可以简单的理解为一个可以独立运行的程序单位。它是线程的集合,进程就是有一个或多个线程构成的,每一个线程都是进程中的一条执行路径。
2.2.2 线程的重要特征
1、线程是轻量级的进程
2、线程没有独立的地址空间(内存空间)
3、线程是由进程创建的(寄生在进程)
4、一个进程可以拥有多个线程-->这就是我们常说的多线程编程
5、独立调度和分配的基本单位
在多线程OS中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。
6、可并发执行
在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。
7、共享进程资源
在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。
8、线程是一种轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。
线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括以下信息:
(1)线程状态。
(2)当线程不运行时,被保存的现场资源。
(3)一组执行堆栈。
(4)存放每个线程的局部变量主存区。
(5)访问同一个进程中的主存和其它资源。
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。
2.2.3线程的状态
线程的状态有:运行态、就绪态、阻塞态、终止态。线程的状态转换与进程类似。
三、进程与线程的联系
- 多线程环境中进程可定义为操作系统中除处理器以外的资源分配和保护的基本单位,它有一个独立的虚拟地址空间,用来容纳进程映像,并以进程为单位对各种资源,如文件、I/O设备等资源实施保护。
- 线程是进程中能够并发执行的实体,是进程的组成部分,也是处理器调度和分派的基本单位。
- 允许进程包含多个线程,这些线程共享进程所获得的内存空间和资源,可以为完成某一项任务而协同工作。
- 进程可以分为两部分:资源集合和线程集合。进程要支撑线程运行,为线程提供虚拟地址空间和各种资源。
进程封装了管理信息,包括对指令代码、全局数据、打开的文件和信号量等共享部分的管理。
线程封装了执行信息,包括状态信息、寄存器、执行栈(用户栈指针与核心栈指针)和局部变量、过程调用参数、返回值等私有部分的管理。
由于线程具有传统进程的许多特征,所以也把线程称为轻量进程。
从一定意义上讲,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行。 程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。 通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
四、进程与线程的区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
1.调度 :从上面的定义可以看出一个是调度和分派的基本单位,一个是拥有资源的基本单位
2.共享地址空间,资源:进程拥有各自独立的地址空间,资源,所以共享复杂,需要用IPC,同步简单; 线程共享所属进程的资源,共享简单,但同步复杂,要通过加锁等措施。
3.占用内存,cpu: 进程占用内存多,切换复杂,CPU利用率低; 线程占用内存少,切换简单,CPU利用率高。
4.相互影响: 进程间不会相互影响; 一个线程挂掉会导致整个进程挂掉。
- 一个程序至少有一个进程, 一个进程至少有一个线程。
- 线程的划分尺度小于进程,使得多线程程序的并发性高。
- 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文 多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定。线程的运行中需要使用计算机的内存资源和CPU。 进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源, 只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
(如有错误,还望指正)
参考文章:https://www.cnblogs.com/tianlangshu/p/5224178.html
来源:CSDN
作者:*夜空中最亮的星*
链接:https://blog.csdn.net/weixin_38054045/article/details/104099234