【操作系统学习笔记】进程篇

一、进程的描述
  1. 程序的一个执行实例;
  2. 正在执行的程序;
  3. 能分配处理器并由处理器执行的实体。
    Liunx下保存PCB的数据结构是通过C结构task_struct结构体来表示的,可以在include/Linux/sched.h里找到它,所有运行在系统里的进程都以task_struct双向链表的形式存在内核里。

二、进程的状态
  • 进程的三个典型状态:执行、阻塞、就绪
    注意点:从执行态到就绪态的这种变化,一般是由于要执行的进程执行时间太长,为了公平,操作系统将其挂起,让其他进程运转。
  •  从理论上说,阻塞到执行态的转化是可以的,只不过这种状态转换没有任何实际价值而被操作系统禁止。
  •  这里阐述的进程.三状态并不是唯一的分类方式。事实上。许多商业操作系统的进程状态不止三个,例如,Windows的进程有7个Solaris甩面的进程则有6个。但不管3个、6个、7个还是几个,其目的都是便于操作系统对进程的管理。只要细分对管理有我们就细分。否则就维持三状态。
三、进程的创立
  • 进程创立步骤:
    1. 分配进程控制块。
    2. 初始化机器寄存器。
    3. 初始化页表。
    4. 将程序代码从磁盘读入内存。
    5. 将处理器状态设置为“用户态”。
    6. 跳转到程序起始地址(设置程序计数器)。
     注意点:操作系统创建一个进程的内核数据结构时,是输入内核态的,所以退出时要更改CPU中的状态字。
  • 进程创立在不同的操作系统所需的方法也不相同
    • Unix进程创立步骤:
      1. 使用fork,创建一个与自己完全一样的新进程;
      2. 使用exec,将新的进程的地址空间用另一个程序的内容覆盖,然后跳转到新程序的起始地址,从而完成新程序的启动。
    • Windows进程创立步骤:
      • 使用一个系统调用——CreateProcess,调用该函数时把欲执行的程序名作为参数传过来,创建新的页表不需要复制别的进程
          Unix这种创建过程更为灵活,即可自我复制也可启动新的程序,便于共享数据。Windows上共享数据只能通过参数传递实现。
  • 进程是由进程控制块、程序段、数据段组成的。
四、进程的终止
  • 当进程完成执行最后的语句并使用系统调用exit()请求操作系统删除自身时,进程终止。这时,进程可以返回状态值(通常为整数)到父进程(通过系统调用wait()),所有进程资源会被操作系统释放。
  • 这里面存在两个概念:
    1. 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
    2. 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
  • 僵尸进程与孤儿进程的问题与危害:
    1. unix提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。 但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放。 但这样就导致了问题,如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。
    2. 孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。
    3. 任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。 如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
  • 有些系统包括VMS,不允许,子进程在父进程已终止的情况下存在。对于这类系统,如果一个进程终止(正常或者不正常),那么它的所有子进程也将终止。这种现象,称为级联终止,通常由操作系统进行。
          
五、进程与地址空间
  • 进程空间也称为地址空间,地址空间就是进程要用的所有资源,其特点是"被动",自己不能做什么只可提供支持。
  • 进程与地址空间研究的主要内容是如何让多个进程空间共享一个物理内存。
六、进程管理
  • 进程管理所需要的手段(维护关于进程的一些信息)
    • 进程比普通程序多出的东西:PCB、以及运行过程中所需要的数据结构,软件和硬件资源等。
    • 维护方式:进程表、进程控制块(PCB,Process  Control Block)
    • 维护的信息应包括:用户信息、寄存器、上下文数据、程序计数器、状态字、栈指针、优先级、进程ID、信号、创立时间、当前持有的各种句柄(记账信息)等。
    • 一般采纳的数据结构:线性表、链表、树等。
    • 进程表保持在操作系统所在的内核空间里。
七、进程的缺陷
  • 只能在一个时间干一件事情。
  • 进程在执行过程中如果阻塞,例如等待输入 ,整个进程就将挂起(暂停),而无法继续执行。这样,即使进程里面有部分工作不依赖于输入数据,也无法推进。
     为了解决上述两个问题,人们发明了线程

你可能感兴趣的:(操作系统)