操作系统知识点——进程与线程(一)

一、进程的基本概念

(一)对进程的描述

1、在操作系统中,进程是资源分配的基本单位,也是独立运行的基本单位。

2、进程是值一段正在执行的程序。

3、进程是系统进行资源分配和调度的一个独立单位。

4、在操作系统级别上,程序的执行都是以进程为单位的。

(二)进程的特征

1、动态性。

2、并发性。

3、独立性:进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。

4、异步性。

5、结构特征:为了描述和记录进程的运动变化过程,并使之能正确运行,应为每个进程配置一个进程控制块(PCB)。PCB是为了保证程序的并发执行,创建进程实质上是创建进程的PCB;撤销进程,实质上是撤销进程的PCB

(三) 进程的3中基本状态

1、就绪状态:进程已经获得了除了处理器之外的所有资源,一旦获得处理器,就可以立即执行,此时进程处于的状态为就绪状态。

2、执行状态(运行状态):当一个进程获得必要的资源并正在CPU上执行时,该进程所处的状态为执行状态。

3、阻塞状态(等待状态):正在执行的进程,由于发生某事件而暂时无法执行下去(如等待I/O完成),此时进程所处的状态为阻塞状态。当进程处于阻塞状态时,即使把处理器分配给该进程,它也无法运行。

(四) 进程状态的相互转换

1、就绪状态——>执行状态。当进程调度程序按照一定的进程调度算法选中一个就绪进程,并为之分配了处理器后,该进程便由就绪状态变为执行状态。

2、执行状态——>阻塞状态。请求并等待某个事件发生。如果正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,例如进程提出I/O请求而变成等待外部设备传输信息的状态,进程申请资源(主存控件或外部设备)得不到满足时变成等待资源状态,进程执行中出现了故障(程序出错或主存储器读写错等)编程等待干预状态等。

3、阻塞状态——>就绪状态。进程因等待的某个条件发生而被唤醒。处于阻塞状态的进程,当其等待的事件已经发生,例如I/O完成,资源得到满足或错误处理完成时,处于阻塞状态的进行并不会马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将该进程转为执行状态。

4、执行状态——>就绪状态。正在执行的进程,因为时间片用完而被暂停执行,或在采用抢占式优先级调度算法的系统中,当由更高优先级的进程要执行而被迫让出处理器时,该进程便由执行状态变为就绪状态。 


(五) 进行通信方式

1、共享存储器系统(共享内存)。

2、消息传递系统(消息队列)。

3、管道通信系统。

4、信号量。

二、 线程基本概念

(一)对线程的描述

1、线程是进程内的一个执行单元,比进程更小。

2、线程是进程内的一个可调度实体。

3、线程是程序(或进程)中相对独立的一个控制流序列

4、线程本身不能单独运行,只能包含在进程中,只能在进程中执行,每个进程通常都会有多个线程互不影响地并发执行。

5、线程是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)及一些进程级资源(例如打开的文件),但是各个线程拥有自己的栈空间。

6、在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。 


(二)Java中线程的4种状态

1、运行。

2、就绪。

3、挂起。

4、结束。

三、 进程与线程的比较

(一)进程和线程的关系

1、一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。

2、资源分配给进程,同一进程的所有线程共享该进程的资源。

3、处理机分配给线程,即真正在处理机上运行的是线程。

4、线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程值的是进程内的一个执行单元,也是进程内的可调度实体。

(二)进程和线程的相同点

1、二者都具有ID、一组寄存器、状态、优先级以及所以遵循的调度策略。

2、每个进程都有一个进程控制块,线程也拥有一个线程控制块。

3、线程和子进程共享父进程中的资源;线程和子进程独立于它们的父进程,竞争使用处理器资源;线程和子进程的创建者可以在线程和子进程上实行某些控制,例如创建者可以取消、挂起、继续和修改线程和子进程的优先级;线程和子进程可以改变其属性并创建新的资源。

(三)进程和线程的不同的

1、线程是进程的一部分,一个没有线程的进程可以被看作是单线程的,如果一个进程内拥有多个 线程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。

2、启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。

3、系统在运行的时候会为每一个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),同一个进程内的线程可以共享进程的资源。对不同进程来说,它们具有独立的数据空间,要进行数据传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。

4、与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少了很多。

5、进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。

(四) 多线程的优点

1、无须跨进程边界。

2、程序逻辑和控制方式简单。

3、所有线程可以直接共享内存和变量等。

4、线程方式消耗的总资源比进程方式少。

(五)多线程的缺点

1、每个线程与主程序共用地址空间,受限于2GB地址空间。

2、线程之间的同步和加锁控制比较麻烦。

3、一个线程的崩溃可能影响到整个程序的稳定性。

4、到达一定的线程数程度后,即使再增加CPU也无法提高性能。

5、线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也很烦琐,需要消耗较多的CPU

(六)多进程的优点

1、每个进程互相独立,不影响主程序的稳定性,子进程崩溃也没有关系;

2、通过增加CPU,就可以容易扩充性能。

3、可以尽量减少线程加锁/解锁的影响,即使线程运行的模块算法效率低,也可极大提高性能。

4、每个子进程都拥有2GB地址空间和相关资源,总体能够达到的性能上限非常大。

(七)多进程的缺点

1、逻辑控制复杂,需要和主程序交互。

2、需要跨进程边界,如果有大数据量传送,就不太适用,适合于小数据量传送、密集运算、多进程调度开销比较大。

3、最好是多进程和多线程结合,即根据实际需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然也可以利用多线程+多进程+轮询方式来解决问题。

四、 调度

(一)进程调度方式

1、抢占方式(可剥夺方式):当一个进程正在处理上执行时,若有某个优先级更高的进程进入就绪队列,则立即暂停正在执行的进程,将处理器分配给新进程。

2、非抢占方式(不可剥夺方式):当一个进程正在处理器上执行时,即使某个优先级更高的进程进入就绪队列,仍然让正在执行的进程继续执行,知道该进程完成或因某种事件而进入完成或阻塞状态时,才把处理器分配给新进程。

(二)常见调度算法

1、先来先服务(FCFS)(作业调度、进程调度)

基本思想是按照进程进入就绪队列的先后次序来分配处理器。采用的是非抢占的调度方式。先来先服务调度算法有利于长进程(作业),不利于短进程(短作业)。

2、短作业(进程)优先(SJF)(作业调度、进程调度)

基本思想是把处理器分配给最快完成的作业(或进程)。在所有作业同时到达时,SJF调度算法是最佳算法,平均周转时间最短,但是该调度算法明显对长作业不利,当有很多短作业不断进入就绪队列时,长作业会因长期得不到调度而产生“饥饿”现象。

3、优先级(作业调度、进程调度)

基本思想是把处理器分配给优先级最高的进程。进程的优先级通常分为两种:静态优先级(指在创建进程时确定的,确定后在整个进程运行期间不再改变)和动态优先级。

基于优先级的调度算法还可以按照调度方式的不同分为:非抢占式优先级调度算法(实现思想是系统一旦将处理器分配给就绪队列中优先级最高的进程,该进程就会一直运行下去,知道由于自身原因主动让出处理器时,才将处理器分配给另一个当前优先级最高的进程)和抢占式优先级调度算法(实现思想是将处理器分配给优先级最高的进程,并使之运行。在进程运行过程中,一旦出现了另一个优先级更高的进程进入就绪队列,进程调度程序就停止当前的进程,而将处理器分配给新出现的优先级更高的进程)。

在优先级先沟通的情况下,通常按照FCFS或者SJF的顺序执行。

4、时间片轮转(进程调度)

在分时系统中,进程调度通常采用时间片轮转调度算法。系统将所有就绪进程按照到达时间的先后次序排成一个队列,进程调度程序总是选择队列中第一个进程执行,并规定执行一定时间,成为时间片。当该进程用完这一时间片时(即使进程并没有执行结束),系统将它送至就绪队列队尾,再把处理器分配给下一个就绪进程。这样,处于就绪队列中的进程就可以依次轮流获得一个时间片的处理时间,然后重新回到队尾排队等待执行,如此不断循环,直至完成。

在时间片轮转调度算法中,时间片的大小对系统性能的影响很大。如果时间片设置得太大,所有进程都能在一个时间片内执行完毕,那么该调度算法就退化为FCFS;如果时间片设置得太小,那么处理器将在进程之间频繁切换,处理器真正用于执行用户进程的时间将减少。因此时间片的大小应设置适当。

5、高响应比优先(作业调度)

基本思想是每次进行作业调度时,先计算就绪队列中每个作业的响应比,挑选响应比最高的作业投入运行。响应比的计算公式如下:

响应比 = 作业响应时间 / 估计运行时间,即

响应比 = (作业等待时间 + 估计运行时间) / 估计运行时间。

从公式可以看出,该算法有利于短作业(作业等待时间相同时,估计运行时间越短,响应比越高),同时考虑长作业(只要作业等待时间足够长,响应比就会变高)。该算法对于长短作业都有所考虑,但由于要计算每个后备作业的响应比,因此增加了系统开销。

6、多级队列(进程调度)

基本思想是根据进程的性质或类型,将就绪队列划分为若干个独立的队列,每个进程固定地属于一个队列。每个队列采用一种调度算法,不同的队列可以采用不同的调度算法。

7、多级反馈队列(进程调度)

首先,应设置多个就绪队列,并为每个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列的优先级次之,其余队列的优先级逐次降低。

其次,每个队列中的进程执行时间片的大小也各不相同,进程所在队列的优先级越高,其相应的时间片就越短。通常,第(i+1)队列的时间片是第i队列时间片的两倍。

再次,当一个新进程进入系统是,应先将其放入第一个队列的队尾,按照FCFS的原则排队等待调度。当轮到该进程执行时,如能在此时间片完成,便可准备撤离系统;如果该进程在一个时间片结束时尚未完成,调度程序便将该进程转入第二个队列末尾,再同样按照FCFS原则等待调度执行;如果该进程在第二个队列中运行一个时间片后仍未完成,再以同样方法转入第三个队列。如此下去,最后一个队列中使用时间片轮转调度算法。

最后,仅当第一个队列空闲时,调度程序才调度第二个队列中的进程运行;仅当第一个至第(i-1)个队列均为空时,才会调度第i个队列中的进程运行。当处理器正在为第i个队列中的某进程服务时,若又有新进程进入优先级较高的队列中,则此时新进程将抢占正在运行进程的处理器,即由调度程序把正在执行的进程放回第i个队列末尾,并重新将处理器分配给新进程。

猜你喜欢

转载自blog.csdn.net/weixin_36378917/article/details/80835311