首页 > 代码库 > 操作系统之进程篇(1)
操作系统之进程篇(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 线程的概念:
在传统的进程中,每个进程中只有一个控制流程和一个程序计数器。在现代操纵系统中,每个进程中可以存在多个控制流,这样的每个控制流叫做一个线程,抑或称为一个"轻量级进程"。
注意进程之间并不共享同一个地址空间,每个进程都是在自己独立的地址空间中作业。所以一个进程如何执行都不会破坏另一个进程的内存空间; 而同一个进程中的
线程则要共享这个进程的内存空间。 当一个进程中有很多线程并行时,需要为这些线程建立一个线程表,一个表项包含程序计数器,寄存器和状态。可见,线程的确
就是轻量化的线程!
在有些操作系统中,操作系统是感受不到线程的存在的,也就是说对线程的管理基本上是在用户空间中进行的。(这是一种值得推荐的方式)
而在另外一些操作系统中,操作系统管理每个进程中的每个线程,像进程一样,系统要维持一张线程表。