操作系统之进程篇(1)

1.进程介绍:

  1.1 进程模型:

       进程是一个程序的实际执行,包含了程序计数器的状态,寄存器和变量等等! 程序可以看成是一个状态的序列,程序在不同时刻呈现出不同的状态,而这种状态的前后交替过程可以看成是程序的执行过程。概念上来说,每个程序有自己的虚拟CPU,但在现实中CPU在不同的进程间来回切换,又称这种切换为伪并行!

       进程和程序差别看似微小,实际上却是十分精妙; 可以将计算机执行程序的过程看成一次有趣的烹饪过程。食谱就是程序,厨师就是CPU,而食材是输入,得到的输出是鲜美可口的美食。

当厨师在做菜的过程中,他的儿子突然跑进来说:"Daddy! Please help me! I was stung by a bee! wu wu...". 那么这个厨师当然要放下手头的工作,记录下当前工作的进度,然后迅速去找来医疗箱位儿子展开救治。当儿子的伤好了之后,厨师又回到厨房继续其烹饪。哈哈!多么形象的多进程执行比喻!

   进程和程序的本质区别在于进程是个动态的过程,它包含程序,输入,输出和一组状态。多个进程可以共享单个处理器,使用某种进程调度算法来停止一个程序的执行,开始另外一个进程的执行。

   1.2 进程层次:

   进程可以创建一系列其他进程,每个进程最多只有一个父进程,却可以有0个,1个或多个子进程。

   所以一类相关进程可以形成一颗进程树:

 

   1.3 进程状态:

   常见的进程的三种状态: 

   1) running (actually using the cpu at that instant);

   2) ready (runnable, temporarily stopped to let another process run)

   3) Blocked(waiting) (unable to run until some external event happen)

上图显示了不同进程状态进程之间的转换规则:

running ----I/O or event wait----> waiting:  进程由于等待I/O和信号而不能再进行下去,在一些系统中,进程需要调用BLOCK系统调用以进入waiting状态。

ready 和 running 状态之间的转化是由进程调度器造成的:

    a) 当进程调度器认为一个进程的运行时间已经足够长的时候,该是让其他进程运行的时候了,那么调度器就会让当前执行的进程转为ready状态。

    b) 当ready进程ready时间足够长了之后,可被宠重新调度运行。进程调度算法要综合考虑系统的效率和兼顾每个进程的公平考量。

waiting ----I/O or event completion ---> ready: 当进程等待的某个事件得到满足的时候,那么这个进程由waiting状态转换到ready状态,等待进程调度器的调度执行。

 

   1.4 进程的实现:

   为了实现进程模型,操作系统维持一张进程表(process table): 每个表项表示一个进程。每个表项包括的信息是:

   进程状态(state),程序计数器(program counter),栈指针(stack pointer),内存分配,打开文件的状态,记录和调度信息。保存所有这一切信息的目的就是为了当恢复一个waiting进程的执行时让其感觉其为被susbended一样。在实际的系统中,进程表可以被划分成不同的区域,每个区域作为一个特定的模块来实现不同的功能。一个常见的划分是将划分成"进程管理","内存管理","文件管理三个模块"。

   当一个中断发生时操作系统底层执行的动作:

   a) 硬件在栈中保存程序计数器;

   b) 硬件从中断向量表中加载中断程序的程序计数器;

   c) 汇编语言程序保存当前寄存器的状态;

   d) 汇编语言程序创建新才中断程序的栈;

   e) C中断程序开始运行(一般是读取和buffer输入)

   f) 中段程序执行完成之后,调度器将当前进程从wait状态转换成ready状态;

   g) 调度器决定下一个要执行的进程;

 

 

   1.5 线程的概念:

    在传统的进程中,每个进程中只有一个控制流程和一个程序计数器。在现代操纵系统中,每个进程中可以存在多个控制流,这样的每个控制流叫做一个线程,抑或称为一个"轻量级进程"。 

注意进程之间并不共享同一个地址空间,每个进程都是在自己独立的地址空间中作业。所以一个进程如何执行都不会破坏另一个进程的内存空间; 而同一个进程中的

线程则要共享这个进程的内存空间。 当一个进程中有很多线程并行时,需要为这些线程建立一个线程表,一个表项包含程序计数器,寄存器和状态。可见,线程的确

就是轻量化的线程!

在有些操作系统中,操作系统是感受不到线程的存在的,也就是说对线程的管理基本上是在用户空间中进行的。(这是一种值得推荐的方式)

而在另外一些操作系统中,操作系统管理每个进程中的每个线程,像进程一样,系统要维持一张线程表。 

 

 

 

 

 

 

 

 

 

 

 

posted on 2014-05-29 10:15  Dream Catcher(DC)  阅读(384)  评论(0编辑  收藏  举报

导航