文章目录
- 1.为什么引入进程
- 2.进程究竟是什么?进程的定义和属性:
- 3.进程的状态和转换
- 4.什么是进程上下文
- 5.进程的控制和管理
- 6.为什么要引入线程
- 7.线程的概念
- 8.引入线程的好处
- 9.进程和线程的区别
1.为什么引入进程
1、我们知道,最早出现的OS系统是单道批处理系统,它是顺序执行程序的,即一个一个地按先到先执行的顺序依次执行。
作业运行过程中如果发生I/O请求,高速的CPU便需要等待低速的I/O操作完成,导致CPU资源利用率和系统吞吐量降低。
2、 而后为了缓解这个矛盾,人们引入了多道批处理系统,该系统让程序宏观上并发执行,即在一道程序发起I/O请求时CPU不再选择等待I/O完全运行结束,而是当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序,用户既不能了解自己程序的运行情况,也不能控制计算机【因为万一有其中一道程序根本不会占用CPU资源,但是系统还是会给它分配了同等的资源,所以根本不能达到人工控制】
3、再然后就诞生了分时操作系统,把处理器的运行时间分成很短的时间片,按时间片轮流把处理器分配给各联机作业使用。若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时停止运行,把处理器让给其他作业使用,等待下一轮再继续运行;将程序分成一小片一小片的,这个进程执行一点,那个进程执行一点。虽然在内部进程的执行是一段一段的,但是CPU的速度很快的(速度都是纳秒级别的),所以我们是感受不到进程执行过程中的停顿。
解释:
1.上面的简单操作系统通过一些系统指令去操作程序,然而程序本身也是一组指令的集合,指令操作指令,这是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系。
2.多道程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性的特征.这些特征都是在程序的执行过程中发生的,是动态的过程。
3.程序这个静态概念已不能如实反映程序并发执行过程的特征.**为了深刻描述程序动态执行过程的性质,**人们引入“进程(Process)”概念。
4.引入进程想要实现的目标是什么呢?
-资源对多个应用程序是可用的;
-物理处理器在多个应用程序间切换以保障所有程序都在执行中;
-处理器和IO设备能得到充分利用。
5.所有现代操作系统采用的方法都是依据对应于一个或多个进程存在的应用程序执行的一种模型。
2.进程究竟是什么?进程的定义和属性:
程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程
1、从理论角度看:进程是对正在运行的程序过程的抽象;
怎么理解这句话呢
正在运行的程序过程的抽象
你想象一下你在打LOL程序的时候,电脑需要把程序抽象成进程进行管理,什么时候操作什么指令。
从实现角度看:是一种数据结构,目的在于清晰地刻划动态系统的内在规律,有效管理和调度进入计算机系统主存储器运行的程序。
2、上面的话也许有点难以理解,那是因为没了解它的狭义和广义定义:
狭义定义:进程就是一段程序的执行过程。
广义定义【官方定义】:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
仔细看就会发现,进程的目的是在于清晰地刻画动态系统的内在规律,进而才能有效管理和调度进入计算机系统主存储器运行的程序
进程的定义总结为一句话:一个执行中的程序的实例!
进程提供给应用程序的关键抽象:
①进程是一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器。
②进程是一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用存储器系统。
3、进程的一般特征:
**动态性:**进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。【这个很关键】
**并发性:**任何进程都可以同其他进程一起并发执行
**独立性:**进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;【这个也很关键】
**异步性:**由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
4、进程的结构特征:进程由进程控制块【PCB】、数据段和正文段三部分组成:
进程控制块(PCB):进程控制块包含了充分的信息,这样就可以中断一个进程的执行,并且在后来恢复执行进程时就好像进程未被中断过一样。PCB是进程存在的唯一标志,PCB与进程同生死。系统创建进程时会产生一个PCB,撤销进程时,PCB也自动消失。
数据段系统把进程的数据段又划分成三部分:
用户栈区(供用户程序使用的信息区);
用户数据区(包括用户工作数据和非可重入的程序段);
系统数据区(包括系统变量和对换信息)。
正文段能被若干进程共享,为了管理可共享的正文段,UNIX设置了一张正文表,每个正文段都占用一个表目,用来指出该正文段在内存和磁盘上的位置、段的大小以及调用该段的进程数等情况。
**注意:**多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;
但是执行过程中,程序不能发生改变。
可以这么说:进程 = 程序代码 + 相关数据 + 进程控制块
3.进程的状态和转换
进程的三种基本状态:
**1. 就绪状态:**进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
**2. 运行状态:**进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以 执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
**3. 阻塞状态:**由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生 前即使把处理机分配给该进程,也无法运行。
进程状态的转换:
运行—>就绪:这是由资源调度引起的,主要是进程占用CPU的时间过长,人家嫌弃它就让它去等待一下
就绪—>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行—>阻塞:发生了I/O请求或等待某件事的发生,突然就有别的请求发生,导致运行变阻塞
阻塞—>就绪:进程所等待的事件发生,就进入就绪队列【队列是先进先出的表】
这里可以比喻成去超市排队买菜,【运行—>就绪】摊位只有一个窗口的时候一次性只能和一个人买菜,买菜时间太久了就一边去继续排队,排队的过程其实就是就绪状态,【就绪—>运行】轮到你了才可以再次购买,【运行—>阻塞】当你正在窗口前买菜的时候,突然有人插队了,直接推开你,【阻塞—>就绪】这时候你只能重新去排队,谁让插队那个人比较霸道。
以上4种情况可以相互正常转换,不是还有两种情况吗?
阻塞–>运行:即使给阻塞进程分配CPU,也无法执行,操作系统載进行调度时不会載阻塞队列进行挑选,其调度的选择对象为就绪队列:
就绪–>阻塞:因为就绪态根本就没有执行,何来进入阻塞态?
这里可以比喻成,你去超市买菜的时候,看到很多很多人在排队买菜,【阻塞–>运行】你想强制插队进去窗口直接买菜,但是排队的人就不同意了,同样,【就绪–>阻塞】你在排队买菜的时候快排到自己了会考虑强制插队吗?
4.什么是进程上下文
一开始小编也是很疑惑,什么是上下文,上面和下面的内容吗?其实不然,我们都知道万物必有因果,有上文才有下文,因此
操作系统中把进程运行的时的物理实体和运行的环境合称为进程上下文
△那么进程上下文我们知道其实是系统运行时提供的环境了,系统调度新进程占有处理器【可以暂时看做CPU】的时候,新老进程随之发生上下文切换,这个上下文是什么概念呢?老进程退出处理器的时候需要先保存其退出运行环境,然后退出,也就是说保存其退出进程上下文,然后退出处理器,这时候新进程要进来处理器了,为了适应处理器的环境,新进程需要先创建新的运行环境,也就是说先创建新的进程上下文。新老进程发生上下文切换,进程的运行被认为是在上下文中执行。
进程切换的步骤:
1.保存中断进程的处理器现场情况
2.修改被中断进程的进程控制块有关信息,相当于创建一个新的上下文环境
3.把被中断进程的PCB加入有关队列
4.选择下一个占有处理器运行的进程,这时候新进程要准备进来了,因为第二步已经为它创建好了环境
5.修改被选中进程的PCB的有关信息
6.设置被选中进程的地址空间,回复存储管理信息
7.根据被选中进程的上下文信息恢复处理器现场
8.处理器开始新的进程处理
怎么样,是不是觉得进程的切换很简单。
5.进程的控制和管理
上面说了进程从何而来,进程有什么定义,进程有什么状态的切换,进程切换的进程上下文是什么…说了这些,相信你一定很好奇,进程这么厉害,那么进程是如何控制,谁来控制的呢?
进程是由处理器控制,控制的内容包括:进程创建、进程撤销、进程阻塞和唤醒进程等,这种功能由操作系统中的原语实现
原语是什么呢?
原语是在管态下执行的,就是有管理员权限的时候执行,这个原语和我们所学的机器指令类似,其特点就是执行过程中不允许被中断,是一个不可分割的基本单位,执行的时候是顺序的不是并发的。
因此进程有两种执行模式:
一种是:非特权态常称为用户态/目态,这是因为用户程序通常在该模式下运行
另一种是特权态可称为系统态/内核态/管态
既然知道了处理器可以进行进程的控制,现在,我们用掌握的知识创建一个进程吧
步骤:给新进程分配一个唯一的进程标识符->给进程分配空间->初始化进程控制块PCB->设置正确的连接->创建或扩充其他数据结构
创建成功后假设计算机里面有很多进程该如何切换呢?
步骤:在某一时刻,一个正在运行的进程被中断,操作系统指定另一个进程为运行态,并把控制权交给这个进程
这时候系统不需要一个进程该如何撤销呢?
进程的阻塞和唤醒:
1.引起进程阻塞和唤醒的事件
1)请求系统服务
2)启动某种操作
3)新数据尚未到达
4)无新工作可做
2.进程阻塞过程:
正在执行的进程,当发现上述某事件后,由于无法继续执行,于是进程便通过调用阻塞原语block把自己阻塞。可见,进程的阻塞是进程自身的一种主动行为。进入block过程后,由于此时该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由执行改为阻塞,并将PCB插入阻塞队列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞 (等待)队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即, 保留被阻塞进程的处理机状态(在PCB中),再按新进程的PCB中的处理机状态设置CPU环境。
3.进程唤醒过程:
当被阻塞的进程所期待的事件出现时,如I/O完成或者其所期待的数据已经到达,则由有关进程(比如, 用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。唤醒原语执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。
6.为什么要引入线程
前面所学的进程我们了解到,创建和切换进程的时候既有进程上下文环境初始化,又有进程退出处理器时要保存其进程结束的上下文环境,这样对系统的时间空间开销都很大,效率很低,这时候,围绕着效率低这件事情,我们引入线程的概念,以小的开销来提高进程内的并发程度。
那么要提高效率,我们提供了一种基本思路:
- 把进程的两项功能①独立分配资源②被调度分派执行进行分离
- 进程作为系统资源分配和保护的独立单位,不需要频繁地切换和加载
- 线程作为系统调度和分派执行的基本单位,会被频繁地调度和切换
7.线程的概念
线程是进程内的一个相对独立的可执行单元;
线程是操作系统中的基本调度单元,在线程中包含调度所需的信息。
一个进程至少有一个线程,可有多个线程。
线程并不拥有资源,而是共享和使用包含它的进程所拥有的所有资源。
线程在需要时也可创建其他线程。线程有自己的生命期,也有状态变化。
和进程一样,进程有进程控制块【PCB】里面存储了充分被调用的信息,因此,每一个线程都有一个线程控制块【thread】,用于保护自己私有信息,主要由四个基本部分组成:
一个唯一的线程标识符 、一组寄存器 、两个栈指针 、一个私有存储区
为什么线程又被叫做轻量级进程呢?
线程运行在进程的上下文中,并共享使用进程的资源和环境。
系统调度的基本单位是线程而不是进程,每当创建一个进程时,至少要同时为该进程创建一个线程。
线程状态有:运行、就绪、等待和终止,状态转换也类似于进程。
线程必须在某个进程内执行,一个进程可以包含一个线程或多个线程
8.引入线程的好处
1.两个线程的调度切换方便:线程是调度的基本单位,进程是资源的拥有单位。
2.进程可以由一个或多个线程组成。在同一进程中,线程的切换不会引起进程的切换,不同进程间的线程切换则会引起进程切换。
3.共享同一地址空间资源:不同进程间的地址空间是相对独立的,而同一进程的各线程共享同一地址空间,可访问其隶属的进程资源。
4.线程通信方便:同一进程内的线程共享内存和文件,因此它们之间可以相互通信,无须调用内核。
5.占用资源少:线程除了必不可少的一点资料 (私有堆栈和程序计数器)外,自己不拥有系统资源.
9.进程和线程的区别
1.进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。以前进程既是资源分配也是调度的最小单位,后来为了更合理的使用cpu(实际上是cpu性能越来越好),才将资源分配和调度分开,就有了线程。线程是建立在进程的基础上的一次程序运行单位。
2.进程是应用程序的执行实例。比如说,当你双击的Microsoft Word的图标,你就开始运行的Word的进程。线程是执行进程中的路径。另外,一个过程可以包含多个线程。启动Word时,操作系统创建一个进程并开始执行该进程的主线程。由于一个进程可以由多个线程,线程可以被认为是“轻量级”的过程。【参考】
内核不知道线程的活动,但仍然管理线程的进程的活动。当线程调用系统调用时,整个进程阻塞,但对线程库来说,线程仍然是运行状态,即线程状态是与进程状态独立的。