操作系统概念学习笔记 第四章 进程

进程概念:

  进程包括:

    1 程序代码(文本段)

    2 程序计数器

    3 处理器寄存器

    4 进程堆栈段(包含临时数据,如方法参数、返回地址和局部变量)

    5 数据段(包含全局变量)

  程序本身不是进程,程序只是被动实体,如存储在磁盘上的文件内容。进程是活动实体

  进程的状态:

    1 新的:进程正在被创建

    2 运行:指令正在被执行

    3 等待:进程等待一定事件的出现

    4 就绪:进程等待被分配给某个处理器

    5 终止:进程已完成执行。

  进程控制块:

    每个进程在操作系统内用进程控制块来表示。它包含与特定进程有关的许多信息:

      1 进程状态:包括新的、就绪、运行、等待、停止等

      2 程序计数器:计数器表示这个进程要执行的下个指令的地址

      3 cpu寄存器:根据计算机体系结构的不同,寄存器的数量和类型也不同。它们包括累加器,索引寄存器、堆栈指针、通用寄存器、和其他条件码信息寄存器。与程序计数器一样,这些状态信息在出现中断时也需要被保存,以便进程以后能正确地继续执行。

      4 CPU调度信息:包括进程优先级、调度队列的指针和任何其他调度参数。

      5 内存管理信息:这类信息包括基址寄存器和界限寄存器的值、页表或段表(与操作系统所使用的内存系统有关)

      6 记账信息:CPU时间、实际使用时间、时间界限、记账数量、作业或进程数量等。

      7 I/O状态信息:包括分配给该进程的I/O设备列表、打开文件的列表等

    PCB简单地作为这些信息的仓库,这些信息在进程与进程之间是变化的。

 

 

进程调度:

  调度队列:

    进程进入系统,会被加到作业队列中。该队列包括系统中的所有进程。驻留在内存中就绪的等待运行的进程保存在就绪队列表上。该队列通常用链表形式来存储,其头节点包括指向链表的第一个和最后一个PCB块的指针。可以为每个PCB增加一个指针域来指向就绪队列的下一个PCB。

    等待特定I/O设备的进程列表称为设备列表。每个设备都有自己的设备列表。

    表示进程调度的常用表示方法是队列图。

    当进程分配到CPU并执行时,有几种事件可能发生:

      1 进程可能发出一个I/O请求,并被放到I/O队列中

      2 进程可能创建一个新的子进程,并等待其结束

      3 进程可能会由于中断而被强制移除CPU,并被放回到就绪队列。

  调度程序:

    进程在其生命周期中会在各种调度队列之间迁移。操作系统为了调度的目的,必须按某种方式从这些队列中选择进程。进程选择由相应的调度程序来完成的。

    对于批处理系统,通常会提交很多进程,不能够马上都执行,这些进程被放到大容量存储设备上(通常为磁盘)的缓冲池中,保存在哪里以便后来执行。长期调度程序或作业调度程序从该池中选择进程,并将它们装入内存中以执行。短期调度程序或CPU调度程序从就绪可执行的进程中选择进程,并为其中之一分配CPU

    这两种调度程序的主要差别是它们执行的效率。短期调度程序必须频繁地为CPU选择新进程,必须要快。长期调度程序控制多道程序设计的程度,既内存中的进程数量。可以有更多的时间来选择执行进程。

    绝大多数进程可分为:I/O为主或CPU为主。

      I/O为主的进程在执行I/O方面比执行计算要花费更多时间

      CPU为主的进程更多的时间用在执行计算上。

    长期调度程序应该选择一个合理的I/O为主进程和CPU为主进程的进程组合。

    有的系统可能引入另外的中等程度调度程序。中等调度程序能将进程移出内存(并移出对CPU的激烈竞争),因此降低多道程序设计的难度。之后,进程能被重新调入内存,并从中断处继续执行。这种方案称为交换。

  上下文切换:

    将CPU切换到另一个进程需要保存原来进程的状态并装入新进程的保存状态。这一任务称为上下文切换。进程关联是由进程的PCB来表示的。内核将旧进程的关联状态保存在其PCB中,然后装入经调度要执行的新进程的已保存的关联状态。上下文切换时间是额外开销,速度因机器而不同。典型时间为1微秒到1000微秒。

 

 

 

进程操作:

  系统内的进程能并发执行,它们必须动态地被创建和删除。因此,操作系统必须提供某种机制(或工具)以创建和终止进程。

  进程创建:

    进程在其执行过程中,能通过系统调用创建多个新进程。创建进程称为父进程,而新进程称为子进程。这些新进程可以再创建其他进程,从而形成进程树。

    子进程可以从操作系统哪里直接获得资源,也能只从父进程资源子集那里获得资源。限制子进程只能使用父进程的资源子集能防止通过创建过多的子进程使系统超载。

    在子进程创建时,除了得到各种物理和逻辑资源外,它还能从父进程那里得到所需的初始化数据(或输入)。

    当进程创建新进程时,有两种执行可能:

      1 父进程与子进程并发执行

      2 父进程等待,直到某个或全部子进程执行完毕

    新进程的地址空间也有两种可能:

      1 子进程是父进程的复制品

      2 子进程装入另一个程序进来

  进程终止:

    当进程完成执行最后的语句并使用系统调用exit请求操作系统删除它时,进程终止。这是,进程可以返回数据(输出)到其父进程(通过系统调用wait)。所有进程资源会被操作系统所释放。

    进程通过适当的系统调用能终止另一个进程。通常,只有被终止进程的父进程才能执行这一系统调用。

    父进程终止其子进程的原因有很多,如下面一些原因:

      1 子进程使用了超过它所分配到的一些资源。这要求父进程有一个检查其子进程的状态的机制

      2 分配给子进程的任务已不再需要

      3 父进程退出,如果父进程终止,那么操作系统不允许子进程继续。这种现象,称为级联终止。通常由操作系统进行。

    

 

 

进程协作:

  执行在操作系统内的并发进程可以是独立进程或协作进程。

    1 如果一个进程不能影响或被其他进程所影响,那么该进程是独立地。显然,不与其他任何进程共享数据的进程是独立地。

    2 如果一个进程能影响或被其他进程所影响,那么该进程是协作的。显然,与其他进程共享数据的进程是协作进程。

  人们需要协作进程的理由:

    1 信息共享:由于多个用户可能对同样的信息感兴趣,所以必须提供环境以允许对这些类型资源的并发访问

    2 加快计算:如果希望一个特定任务快速运行,那么必须将它分成多个子任务,并行执行。

    3 模块化:可能需要按模块化方式来构造系统。

    4 方便:单个用户也可能同时执行多个任务。

  协作进程的并发执行要求一定机制,以允许进程间相互通信和同步动作。

  生产者-消费者问题,这是协作进程的通用范例:

    生产者进程产生信息,以供消费者进程消费。

    为了允许能并发执行,必须有一个项目缓冲区来被生产者填充并被消费者所使用。

      1 无限缓冲:对缓冲区大小没有实际限制。消费者可能需要等待新项,但是生产者总是在生产新项。

      2 有限缓冲:假设缓冲区大小固定。如果缓冲区为空,那么消费者必须等待;如果缓冲区为满,那么生产者必须等待。

    缓冲区可以由操作系统通过使用进程间通信功能或由应用程序员通过使用共享内存来显示编码。

 

 

进程间通信:

  进程间通信(IPC)提供一种机制,以允许进程不必通过共同地址空间共享来通信和同步其动作。

  消息传递系统:

    消息系统的功能是允许进程相互通信而不需要利用共享数据。

    两个进程之间通信,必须要有通信线路。

    逻辑实现线路和发送/接收操作的方法:

      1 直接或间接通信

      2 对称或非对称通信

      3 自动或显式缓冲

      4 复制发送或引用发送

      5 固定大小或可变大小消息

  命名:

    需要通信的进程必须有一个方法以互相引用。它们可使用直接或间接通信。  

    1 直接通信:需要通信的进程必须明确地命名通信的接受者或发送者。

      采用这种方法,原语send和receive定义如下:

        1 send(p,message):发送消息到进程P

        2 receive(Q,message):接收来自进程Q的消息。

      这种方案的通信线路具有如下属性:

        1 在需要通信的一对进程之间,自动建立线路。进程只需知道彼此的标识,以便进行通信。

        2 一个线路只与两个进程相关

        3 每对进程之间只有一个线路

      这种方案展示了对称寻址,即发送进程和接收进程必须命名对方,以便通信。

      这种方法的变形采用非对称寻址。只要发送者命名接受者,而接受者不需要命名发送者。原语send和receive定义如下:

        1 send(p,message):发送消息到进程p

        2 receive(id,message):接收来自任何进程的消息,变量id设置成与其通信的进程名称

      对称和非对称寻址方案的共同缺点是限制了结果进程定义的模块化。改变进程的名称必须检查所有其他进程定义。所有旧名称必须被找到,以便修改成新名称。这种情况从独立编译角度来说是不可取的。

    2 间接通信

      消息通过邮箱或端口来发送和接收。邮箱可以被抽象成一个对象,进程可以向其中存放消息也可以删除消息。每个邮箱都有一个唯一的标识符。对于这种方案,一个进程能通过不同的邮箱与其他进程进行通信。如果两个进程共享一个邮箱,那么它们可以进行通信。

      原语send和receive定义如下:

        1 send(A,message):发送一个消息到邮箱A

        2 receive(A,message):接收来自邮箱A的消息

      对于这种方案,通信线路具有如下属性:

        1 只要一对进程中的两个成员共享一个邮箱,那么就建立了它们之间的通信线路

        2 一个线路可以与两个或更多的进程相关联

        3 两个通信进程之间可有多个不同的线路,每个线路对应于一个邮箱。

      如果3个进程共享一个邮箱,一个发送消息,两个接收消息,那么哪个进程能收到消息呢?答案取决于人们所选择的方案:

        1 允许一个线路最多只能与两个进程相关联

        2 允许一次最多一个进程执行receive操作

        3 允许系统随意选择一个进程以接收消息。系统可以告诉发送者谁是接收者

      邮箱可以为进程或操作系统所拥有:

        1 邮箱为进程所有(邮箱是进程地址空间的一部分),那么要区分拥有者(能通过邮箱接收消息)和使用者(只能向邮箱发送消息)

        2 操作系统拥有的邮箱是独立地,并不属于任何特定的进程。因此操作系统必须创建机制,允许进程进行如下操作:

          * 创建一个新邮箱

          * 通过邮箱发送和接收消息

          * 删除一个邮箱

  同步:

    进程间的通信可以通过原语send和receive来进行。这些原语的实现有不同的设计选项。

    消息传递可以是阻塞或非阻塞,也称为同步或异步:

      * 阻塞send:发送进程阻塞,直到消息为接收进程或邮箱所接收

      * 非阻塞send:发送进程发送消息并再继续操作

      * 阻塞receive:接受者阻塞,直到有消息可用

      * 非阻塞receive:接受者收到一个有效消息或无效消息

    send和receive的不同组合都有可能。当send和receive都阻塞时,则在发送者和接受者之间就有一个集合点。

  缓冲:

    不管通信是直接的或是间接的,通信进程所交换的消息都驻留在临时队列中。队列有三种实现方法:

      1 零容量:队列的最大长度为0,因此线路中不能有任何消息处于等待。这种情况,发送者必须阻塞,直到接受者接收到消息。

      2 有限容量:队列的长度为有限的n,最多只能有n个消息驻留其中。如果线路满,发送者必须阻塞直到队列中的空间可用为止。

      3 无限容量:队列长度可以无限,因此,不管多少消息都可在其中等待。发送者从不阻塞。

    零容量情况称为没有缓冲的消息系统,其他情况称为自动缓冲。

 

 

客户机-服务器系统通信:

  套接字:

    套接字可定义为通信的端点。一对通过网络通信的进程需要使用一对套接字,即每个进程各有一个。套接字由IP地址和端口号连接组成。套接字采用客户机-服务器结构。

    使用套接字通信,虽然普遍和高效,但是它属于较为低层形式的分布式进程通信。只允许在通信线程之间交换无结构的字节流。

  远程过程调用:

    一种最为普遍的远程服务形式是RPC方式,用RPC通信而交换的信息有很好的结构,包含要执行函数的名称和传递给该函数的参数。然后该函数根据请求而执行,任何输出结构通过另一个消息送回给请求者。

  远程方法调用:

posted @ 2013-09-16 14:07  褐色键盘  阅读(433)  评论(0)    收藏  举报