操作系统复习笔记——第三章 进程

   进程可看做是正在执行的程序。进程需要一定的资源(如CPU时间、内存、文件和I/O设备)来完成其任务。这些资源在创建进程或执行进程时被分配。

      进程是大多数系统中的工作单元。这样的系统由一组进程组成:操作系统进程执行系统代码,用户进程执行用户代码。所有这些进程可以并发执行。

       虽然从传统意义上讲,进程运行时只包含一个控制线程,但目前大多数现代操作系统支持多线程进程。

       操作系统负责进程和线程管理,包括用户进程与系统进程的创建与删除,进程调度,提供进程同步机制、进程通信机制与进程死锁处理机制。

 

  • 3.1进程概念
    • 程序的执行过程
    • 3.1.1 进程
      • 进程不只是程序代码,程序代码有时称为文本段(代码段)。进程还包括当前活动,通过程序计数器的值和处理器寄存器的内容来表示。另外,进程通常还包括堆栈段(包括临时数据,如函数参数、返回地址和局部变量)和数据段(包括全局变量)。进程还可能包括堆(heap),是在进程运行期间动态分配的内存。
      • 这里强调:程序本身不是进程;程序只是被动实体,如存储在磁盘上包含一系列指令的文件内容(常被称为可执行文件),而进程是活动实体,它有一个程序计数器用来表示下一个要执行的命令和相关资源集合。当一个可执行文件被装入内存时,一个程序才能成为进程。
    • 3.1.2 进程状态
      • 新的(new)进程正在创建
      • 运行(running)指令正在被执行
      • 等待(waiting)进程等待某个事件的发生(如I/O完成或收到信号)
      • 就绪(ready)进程等待分配处理器
      • 终止(terminated)进程完成执行。
    • 3.1.3 进程控制块
      • 每个进程在操作系统中用进程控制块PCB process control block 也称为任务控制块。
    • ·进程状态:状态可包括新的、就绪、运行、等待、停止等。

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

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

      ·CPU调度信息:这类信息包括进程优先级、调度队刻的指针和其他调度参数

    • ·内存管理信息:根据操作系统所使用的内存系统,这类信息包括基址和界限寄存器的值、页表或段表(见第8章)。

      ·记账信息:这类信息包括CPU时间、实际使用时间、时间界限、记账数据、作业或进程数量等。

      ·I/O状态信息:这类信息包括分配给进程的I/O设备列表、打开的文件列表等。简而言之,PCB简单地作为这些信息的仓库,这些信息在进程与进程之间是不同的。

    • 线程:   一个进程中至少包含一个线程,同时,多个线程共享该进程的所有资源。进程,完成对资源分配。
  • 3.2 进程调度
    • 多道程序设计的目的是无论何时都有进程在运行,从而使CPU利用率达到最大化。分时系统的目的是在进程之间快速切换CPU以便用户在程序运行时能与其进行交互。
    • 为了达到此目的,进程调度选择一个可用的进程(可能从多个可用进程集合中选择)到CPU上执行。单处理器系统从不会有超过一个进程在运行。如果有多个进程,那么余下的则需要等待CPU空闲并重新调度。
    • 3.2.1 调度队列
      • 进程进入系统时,会被加到作业队列中,该队列包括系统中的所有进程。驻留在内存中就绪的、等待运行的进程保存在就绪队列中。该队列通常用链表来实现,其头节点指向链表的第一个和最后一个PCB块的指针。每个PCB包括一个指向就绪队列的下一个PCB的指针域。
      • 等待特定I/O设备的进程列表称为设备队列,每个设备都有自己的设备队列。
      • 讨论进程调度的常用方法是队列图
      • 新进程开始处于就绪队列。它在就绪队列中等待直到被选中执行或被派遣。当进程分配到CPU并执行时,可能发生下面几种事件中的一种:
        • 进程可能发出一个IVO请求,并被放到I/O队列中。

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

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

  • 作业:用户提交给操作系统做的    长期调度
  • 内存调度:中期调度    短期调度=CPU调度=进程调度(ms级)系统调度
  • 3.2.2 调度程序
    • 进程会在各种调度队列之间迁移,为了调度,操作系统必须按某种方式从这些队列中选择进程。进程的选择是由相应的调度程序(scheduler)来执行的。
    • 通常批处理系统中,进程更多的是被提交,而不是马上执行。这些进程通常放到磁盘的缓冲池里,以便以后执行。长期调度程序作业调度程序从该池中选择进程,并装入内存以准备执行。短期调度程序cpu调度程序从准备执行的进程中选择进程,并为之分配cpu。
    • 这两个调度程序的主要差别是调度的频率。
    • 短期调度程序通常100ms至少执行一次,由于每次执行之间的时间较短,短期调度程序必须要快。
    • 长期调度程序执行的并不频繁,所以长期调度程序能使用更多的时间来选择执行进程。长期调度程序控制多道程序设计的程度(内存中进程的数量)。长期调度程序必须仔细选择执行进程。
    • 通常,绝大多数进程可分为:I/O为主或CPU为主。       I/O为主的进程通常执行I/O方面比执行计算花费更多时间,另一方面,CPU为主的进程很少产生I/O请求。为使系统达到平衡和更好的性能,长期调度程序应当选择一个合理的包含IO为主的和cpu为主的组合进程,以充分使用设备和短期调度程序。
    • 有的操作系统如分时系统,可能引入另外的中期调度程序。核心思想:将进程从内存(或从CPU竞争)中移出,从而降低躲到程序设计的程度,之后,进程能被重新调入内存,并从中断处继续执行,这种方案称为交换。
  • 3.2.3 上下文交换
    • 通过执行一个状态保存来保存CPU当前状态(不管他是内核模式还是用户模式),之后执行一个状态恢复重新开始运行。
    • 将CPU切换到另一进程需要保存当前状态并恢复另一进程状态,这一任务叫做上下文切换(context switch)。当发生上下文切换时,内核会将旧进程的状态保存在PCB中,然后装入经调度要执行的并已保存的新进程的上下文。
    • 将CPU切换到另一进程需要保存当前状态并恢复另一进程状态,这叫做上下文切换(context switch)。当发生上下文切换时,内核会将旧进程的状态保存在PCB中,然后装入经调度要执行的并已保存的新进程的上下文。
    • 上下文切换时间是额外开销,因为切换时系统并不能做什么有用的工作。其切换时间与硬件支持密切相关。
  • 3.3 进程操作
    • 3.3.1 进程创建
      • 进程在执行时,能通过创建进程系统调用创建多个新进程。创建进程为父进程,而新进程叫做子进程。新进程都可再创建其他进程,从而形成了进程树。
      • 大多数操作系统根据一个唯一的进程标识符(process indentifier, pid) 来识别进程,pid通常是一个整数值。
      • 通常,进程需要一定的资源(如CPU时间、内存、文件、I/O设备)来完成其任务。在一个进程创建子进程时,子进程可能从操作系统那里直接获得资源,也可能只从其父进程那里获得资源。父进程可能必须在其子进程之间分配资源或共享资源(如内存或文件)。

限制子进程只能使用父进程的资源能防止创建过多的进程带来的系统超载。

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

①父进程与子进程并发执行。

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

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

①子进程是父进程的复制品(具有与父进程相同的程序和数据)。

②子进程装入另一个新程序。

UNIX操作系统中,每个进程用唯一整数标识符来标识,通过fork()系统调用,可创建新进程,新进程通过复制原来进程的地址空间而成。这种机制允许父子进程之间方便的通信。

 

两个进程都继续执行位于系统调用fork()之后的指令,但是对于子进程,系统调用fork的返回值为0:而对于父进程,返回值为子进程的进程标识符(非零)

 

通常系统调用fork后,一个进程会使用系统调用exec(),以用新程序来取代进程的内存空间。系统调用exec()将二进制文件装入内存(消除了原来包含系统调用exec()的程序内存映射),并开始执行。采用这种方式,两个进程都能相互通信,并按各自的方式执行。

 

父进程能创建更多的子进程,或者如果在子进程运行时没有什么可做,那么它采用系统调用wait()把自己移出就绪队列来等待子进程的终止。

  • 3.3.2 进程终止
    • 进程执行完最后的语句并使用系统调用exit()请求系统删除自身时,进程终止。此时,进程可以返回状态值(通常为整数)到父进程(通过系统调用wait())。所有进程资源(物理和虚拟内存、打开文件和I/O缓冲)会被操作系统释放。
    • 在其他情况下也会出现终止。
    • 进程通过适当的系统调用能终止另外一个进程。通常,只有被终止进程的父进程才能执行这一系统调用。否则,用户可以任意的终止彼此的作业。

 

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

 

子进程使用了超过它所分配的一些资源。(为判定是否发生这种情况,要求父进程有一个检查其子进程状态的机制)

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

父进程退出,如果父进程终止,那么操作系统不允许子进程继续(有些操作系统,对于这类操作系统这种现象称为级联终止)。

 

UNIX:可以通过系统调用exit()来终止进程,父进程可以通过系统调用wait()以等待子进程的终止。系统调用wait()返回了中止子进程的进程标识符,以使父进程能够知道哪个子进程终止了。如果父进程终止,那么其所有子进程会以init进程作为父进程,因此,子进程仍然有一个父进程来收集状态和执行统计。

  • 3.4 进程间通信(C)
    • 操作系统内并发执行的进程可以是独立进程或协作进程。如果一个进程不能影响其他进程或被其他进程所影响,那么该进程是独立的。显然,不与任何其他进程共享数据的进程是独立的。另一方面,如果系统中一个进程能影响其他进程或被其他进程所影响,那么该进程是协作的。显然,与其他进程共享数据的进程为协作进程。
    • 协作进程需要一种进程间通信机制(interprocess communication,,IPC)来允许进程相互交换数据与信息。进程间通信有两种基本模式:(1)共享内存,(2)消息传递。在共享内存模式中,建立起一块供协作进程共享的内存区域,进程通过向此共享区域读或写入数据来交换信息。在消息传递模式中,通过在协作进程间交换消息来实现通信。
    • 消息传递对于交换较少数量的数据很有用,因为不需要避免冲突。
    • 对于计算机间的通信,消息传递也比共享内存更易于实现。共享内存允许以最快的速度进行方便的通信,在计算机中它可以达到内存的速度。
    • 共享内存比消息传递快,消息传递系统通常用系统调用来实现,因此需要更多的内核介入的时间消耗。与此相反,在共享内存系统中,仅在建立共享内存区域时需要系统调用,一旦建立了共享内存,所有的访问都被处理为常规的内存访问,不需要来自内核的帮助。
    • 3.4.1 共享内存系统
      • 无限缓冲和有限缓冲。
    • 3.4.2 消息传递系统
      • 进程间的通信可以通过调用原语send0和receive)来进行。这些原语的实现有不同的设计选项。消息传递可以是阻塞或非阻塞——也称为同步或异步。

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

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

阻塞 receive:接收者阻塞,直到有消息可用。

非阻塞 receive:接收者收到一个有效消息或空消息。

  • 阻塞:  有条件等待    两个过程,快的等待慢的,(因为在计算机中不能变快,只能变慢)

 

发布了213 篇原创文章 · 获赞 71 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/IT_flying625/article/details/104999108
今日推荐