• home > theory > CST > Constitution >

    进程管理—操作系统基础

    Author:[email protected] Date:

    做了多年的码农,但是,操作系统原理对照上面的书,还真的不明觉厉。死板的把人整的死翘翘。这里系统进程的讲解也不是趣解,只是整理下便于记忆和区分。

    一、进程概念

      多道程序设计系统中,需要外部设备与处理机具有并行工作的能力。各程序在执行过程中出现相互制约关系,其执行过程是动态的,而传统的程序本身是一组指令的集合,是静态的,无法描述程序在内存中的执行情况,为深刻描述程序活动,引入进程概念。

      进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。可描述为三部分:

      (1) 程序段:表该进程所进行的操作。

      (2) 数据段:表与进程相关联的数据集合,包括程序运行时所需工作区。

      (3) 进程控制块(PCB):进程存在唯一标志,记录进程块重要信息。

    二、进程的状态

      进程执行时的间断性,决定了进程可能具有多种状态。为便于管理,一般划分为以下三种基本状态:

      (1) 就绪状态:进程已获得除处理器外的所需资源,等待分配处理器资源。只要分配了处理器进程就可执行。

      (2) 运行状态:进程占用处理器资源,处于此状态的进程的数目小于等于处理器的数目。

      (3) 阻塞状态:由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理机分配给该进程,也无法运行。

    进程的状态


    五状态转换: 


    1490956700636267.jpg

    五状态队列模型调度:

    五状态队列模型调度.jpg

    挂起概念

    挂起:操作系统中将进程换出内存,我们将这称为进程的挂起。 

    三、进程控制块

    OS根据PCB来对并发执行的进程进行控制和管理的。PCB通常是系统内存占用区中的一个连续存区。

    1、包含信息

      (1) 进程标志符:通常由字符和数字组成。

      (2) 当前状态:说明进程当前所处的状态,作为系统调度管理进程依据。通常会将不同状态进程排成队列。

      (3) 现场信息:当进程因某种原因不能继续占用CPU时,保留CPU现场信息,使再次运行时恢复现场,继续执行。

      (4) 存储信息:指出进程对应程序数据存储情况,如程序存放地址、数据块地址等。

      (5) 管理信息:调用一个进程相关信息,如所需设备资源、优先级等。

      (6) 链接字:指出该进程所在队列中下一进程PCB首地址。

      (7) 其他信息:进程之间隶属关系、文件参数、通信信息等。

    2、PCB的管理

      (1) 线性表:不分进程状态,把所有PCB组成一数组,系统通过下标变化访问PCB中每一个PCB。节省存储空间,但时间开销大。

    PCB1PCB2  ...  PCBn

      (2) 链接表:将同一状态PCB组成队列,队列中PCB按优先级排列。便于管理,但占用较大存储空间。


    四、进程的通信

    1、同步与互斥

      (1) 进程的同步:系统中多个进程共同完成一项任务。

      (2) 进程的互斥:当一个进程进入临界区使用临界资源时,另一个进程必须等待。临界资源指一次只能允许一个进程使用的资源,如打印机。临界区为进程内访问临界资源的代码。

      (3) 信号量与 P-V 操作:信号量,又称信号灯,用来保证两个或多个关键代码段不被并发调用,但只能被特殊操作使用(如 P-V 操作)。P-V 操作为原语(若干机器指令构成的一段程序,用以完成特定功能)。通过设置一个表示资源个数的信号量S,对信号量S的 P-V 操作来实现进程间的同步和互斥。

      P和V操作分别来自荷兰语Passeren和Vrijgeven,分别表示占有和释放。

      P操作首先减少信号量,表示有一个进程将占用或等待资源,然后检测S是否小于0,如果小于0则阻塞,如果大于0则占有资源进行执行。

      V操作是和P操作相反的操作,首先增加信号量,表示占用或等待资源的进程减少了1个。然后检测S是否小于0,如果小于0则唤醒等待使用S资源的其它进程。

    2、进程的通信

      并发程序运行过程中需要进行信息交换,信息量少时可利用信号量与 P-V 操作,P-V 操作只是低级原语,信号量大时需引进高级原语。常用高级通信机制主要有以下三种:

      (1) 消息缓冲通信:系统管理若干消息缓冲区,用以存放消息。每当一进程向另一进程发送消息时,申请一个消息缓冲区,将已准备好消息送到缓冲区,插入接收进程消息队列,最后通知接收进程。接收进程收到发送进程通知后,摘下消息缓冲区,取出信息,将缓冲区还给系统。

      (2) 管道通信:管道是指连接两进程间的一打开的共享文件,专门用于进程之间的数据通信。管道通信由UNIX首创,以文件系统为基础,实际上,管道是一个固定大小的缓冲区,管道通信实质是以外存来进行数据通信,因而具有传送数据量大的优点。

      (3) 信箱通信:设立一个通信体制,信箱,用来发送接收信件。通信时发送进程将信件投入信箱,接收进程可以在任何时刻取走信件。分为单向、双向信箱两种,区别在于接收进程是否予以回答。

    五、处理机调度

      处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。一般情况下,当占用处理机的进程因为某种请求得不到满足而不得不放弃CPU进入等待状态时,或者当时间片到,系统不得不将CPU分配给就绪队列中另一进程的时候,都要引起处理机调度。

    进程调度在一个队列中,按照某种方法(算法),选择一个合适的个体的过程。

    进程调度–面向系统原则

    优先权:队列可以根据进程的优先权不同,组织不同的就绪队列。进程调度时,首先选择高优先权队列中的进程,当优先权高的队列没有进程的时候,在选择较低优先权的队列中的进程。

    进程调度 优先权.jpg

    1、功能


      (1) 记住进程状态,如进程名、指令计数器等,将这些信息记录在相应PCB中。

      (2) 根据一定算法决定哪个进程能获得处理机,需占用多长时间。

      (3) 收回处理机。

    调度目标:公平性,处理机利用率,提高系统吞吐量,尽量减少进程的响应时间。

    2、调度算法

      (1) 先来先服务调度算法(FIFO):最简单处理机调度算法,按进程进入就绪队列先后顺序调度并分配处理机执行。(适合长程,中程,短程调度

      (2) 时间片轮转调度算法(RR):对就绪队列每一进程分配一时间片,将其看为环状结构,按时间片长度调度进程。(适用于短进程调度

      (3) 优先数法:按某种规则定义优先数来表示就绪队列中的进程,优先数的设置可分为静态、动态两种方式。

    为每个进程定义一个优先级,优先级越高的进程,将优先获取处理机的调度。(这个算法可以和上面的时间片轮转方法结合使用,相互完善) 

    静态优先级:一旦确定,则进程运行期间优先级一直不改变。 

    态优先级:系统首先赋予进程一个初始优先级,该优先级将随着进程的运行而改变。(剩余时间最短者优先,响应比高者优先)

    剩余时间最短者优先:进程的剩余时间越短,优先级越高 
    响应比高者优先:进程(预期执行时间)越长,优先级越低;而随着进程的等待时间越长,优先级越高

        

      (4)反馈调度算法:反馈调度算法是一种根据进程执行历史调整调度方式调度方法,它结合了时间片轮转调度思想。 

    调度顺序:首先将进程放到第一个就绪队列中。如果在这个队列中无法完成进程,将进程移动到下一个就绪队列中,等待执行。


    问题:为什么要在不同的队列中设置不同的时间片? 

    因为,没有在上一级队里中完成的进程,说明它的需要运行的时间比较多。我们将它放到下一级队列中,并提供较大的时间片,这样可以减少处理机内存的换进换出,提高系统效率。 

    问题:当一个进程运行完毕后,需要从哪里调用新的进程? 

    从第一个就绪队列中,调用新的进程。调用新的进程的时候,我们选择优先级高的进程先调用。

    当一个进程运行完毕后,需要从哪里调用新的进程.jpg

    3、进程调度方式

    剥夺方式:时间片到了,进程被剥夺;有新的优先权高的进程插入。

    非剥夺方式:执行进程只有在执行完毕,或者申请I/O阻塞自己时,才中断其执行,释放处理机,调入新进程。

    4、进程调度类型

    长程调度 :又称为作业调度,它为被调度作业或用户程序创建进程,分配必要的系统资源,并将创建的进程插入就绪队列,等待短程调度。或者将新建的进程插入到就绪/挂起队列,等待中程队列。

    中程调度:内外存之间的对换功能的一部分。当内存空间紧张的时候,将内存中的进程换到外存挂起;当内存空闲的时候,将外存中挂起的进程换到内存。

    短程调度:也称为进程调度,即就绪队列中的哪个进程将获取处理机。 

    进程调度类型.jpg

    六、线程

    1、基本概念


      线程是比进程更小的能独立运行的基本单位。


      线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制,但与进程不同的是,同类的多个线程是共享同一块内存空间和一组系统资源的,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。线程本身基本不拥有系统资源。


      所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小得多,正因如此,线程也被称为轻型进程(light-weight process)。一个进程中可以包含多个线程。

    2、属性

      (1) 每个线程有一个唯一的标识符与一张线程描述表。

      (2) 不同线程可以执行相同程序。

      (3) 同一进程中的各个线程共享该进程的内存地址空间。

      (4) 线程是处理器独立调度单位,多个线程可以并发执行。充分利用发挥处理器与外围设备的并行工作能力。


      线程进一步提高了系统的并发性,为现代操作系统的一个重要指标。

    进程和程序区别

    1.程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的。

    2.程序和进程无一一对应关系。一个程序可以由多个时程公用;另一一方面,一个进程在活动中有可顺序地执行若干个程序



    进程与线程有什么区别

    进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来。


    线程是进程的一个实体,是CPU调度和分配的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属于一个进程的其他的线程共享进程所拥有的全部资源。。。


    在没有实现线程的操作系统中,进程既是资源分配的基本单位,又是调度的基本单位,它是系统中并发执行的单元。而在实现了线程的操作系统中,进程是资源分配的基本单位,但线程是调度的基本单位,是系统中并发执行的单元。


    引入线程主要有以下4个方面的优点: 

    (1)易于调度 

    (2)提高并发现。通过线程可以方便有效地实现并发 

    (3)开销小。创建线程比创建进程要快,所需的开销也更小 

    (4)有利于发挥多处理器的功能。通过创建多线程,每个线程都在一个处理器上运行,从而实现应用程序的并行,使每个处理器都得到充分运行。

    需要注意的是,尽管线程与进程很相似,但两者也存在着很大的不同,区别如下: 

    (1)一个线程必定属于也只能属于一个进程;而一个进程可以拥有多个线程并且至少拥有一个线程。 

    (2)属于一个进程的所有线程共享该线程的所有资源,包括打开的文件、创建的Socket等。不同的进程互相独立。

     (3)线程又被称为轻量级进程。进程有进程控制块,线程也有线程控制块。但线程控制块比进程控制块小得多。线程间切换代价小,进程间切换代价大 

    (4)进程是程序的一次执行,线程可以理解为程序中一段程序片段的执行 

    (5)每个进程都有独立的内存空间,而线程共享其所属进程的内存空间。

    程序、进程与线程的区别是什么

    线程进程区别.jpg

    父子进程的关系


    1.子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程

    2.在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。

    3.父进程终止子进程自然终止。

    进程的两种执行模式:

    系统模式(系统态):具有最高特权,运行系统特定的指令。 

    用户模式(用户态):较低的特权,用户一般运行在用户模式

    进程切换和模式切换

    进程切换:作用于进程之间的一种操作。当分派程序收回当前进程的CPU并准备把它分派给某个就绪进程时,该进程将被引用。 

    模式切换:是进程内部所引用的一种操作。当用户程序转入系统调用,或者相反时,该操作将被调用。


    前台进程和后台进程

    前台进程


    在shell提示处理打入命令后,创建一个子进程,运行命令,Shell等待命令退出,然后返回到对用户给出提示符。这条命令与Shell异步运行,即在前台运行,用户在它完成之前不能执行别一个命令

    前台进程.png

    很简单,我们在执行这个查找命令时,无法进行其它操作,这个查找就属于前台进程

    后台进程

    在Shell提示处打入命令,若后随一个&,Shell创建子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与Shell同步运行,即在后台运行。“后台进程必须是非交互式的”

    后台进程.png

    再来看这个命令就变成了后台进程,我们用同样的条件进行查找,把查找记过放到hzh/test/init.find这个文件中。不影响我们前台其它的操作。

    线程同步有哪些机制

    现在流行的进程线程同步互斥的控制机制,其实是由最原始、最基本的4种方法实现的:临界区、互斥量、信号量和事件。。。

    (1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。


    (2)互斥量:为协调共同对一个共享资源的单独访问而设计。只有拥有互斥对象的线程才有权限去访问系统的公共资源,因为互斥对象只有一个,所以能够保证资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。


    (3)信号量:为控制一个具有有限数量的用户资源而设计。它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。


    (4)事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

    内核线程和用户线程的区别

    根据操作系统内核是否对线程可感知,可以把线程分为内核线程和用户线程。


    内核线程建立和销毁都是由操作系统辅助、通过系统调用完成的,操作系统在调度时,参考各进程内的线程运行情况作出调度决定。如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。


    和内核线程相对应的是用户线程,用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。用户线程多见于一些历史悠久的操作系统,如UNIX操作系统,不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位的,所以每个线程执行的时间相对减少。为了在操作系统中加入线程支持,采用了在用户控件增加运行库来实现线程,这些运行库被称为“线程包”,用户线程是不能被操作系统所感知的。


    引入用户线程有以下4个方面的优势: 

    (1)可以在不支持线程的操作系统中实现。 

    (2)创建和销毁线程、线程切换等线程管理的代价比内核线程少的多。 

    (3)允许每个进程定制自己的调度算法,线程管理比较灵活 

    (4)线程能够利用的表空间和堆栈空间比内核级线程多。

    用户线程的缺点主要有以下两点: 

    (1)同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。

    (2)页面失效也会产生类似的问题


    内核线程的优缺点刚好跟用户线程相反。实际上,操作系统可以使用混合的方式来实现线程。

    参考文章:

    http://ce.sysu.edu.cn/hope/Item/102791.aspx

    http://www.voidcn.com/blog/omenglishuixiang1234/article/p-5993213.html

    http://www.cnblogs.com/fnng/archive/2012/05/20/2510641.html


    拓展阅读:Linux进程优先级的处理--Linux进程的管理与调度


    转载本站文章《进程管理—操作系统基础》,
    请注明出处:https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/Constitution/2017_0331_7976.html