在学习Erlang程序过程中,总觉得对于进程还是没有很好的把握。所以自己对于进程的再次提及让我不得不重温操作系统这门看似抽象的课程了。但是总觉得如果单一讲解进程或许略显抽象不够理解,自己就想把某些经验和知识片段有个很好的系统联系起来,我想这样可以让自己更好加强记忆理解。长话短说,我们进入主题,既然在Erlang的学习中始终围绕着进程一词来深入研究,我们就从进程这个话题谈起。
进程概念
1. 进程是运行中的程序。这里我们就可以稍微延伸下以便帮助我们记忆理解了:
在这里我们只要抓住“运动”词汇,就不然发现进程是个动态的实体,与之对应的是我们常说的程序,程序而是一个静态实体了。(bw:这里突然想到以前对于认识EJB2中也有一个对应的概念就是EntityBean与SessionBean,它们与之对应的就是一个典型的名词和动词概念了,哈哈啰嗦了,转回正题)。那我们会想是什么来体现我们说的进程为一个动态实体呢?立刻会联系产生接下来的一个特点了。
2. 进程不仅仅是程序代码,它包含了当前状态。而这种状态由两个方面来表示:
u 程序计数器(program counter)
u cpu中的寄存器(registers)
就是由于进程中有程序计数器—指明下一条要执行的指令而且拥有一组相关的资源。这里又要继续反问:到底是一个什么资源呢?那就要看下面会讲到的PCB的概念了。
3. 进程还包含进程栈(process stack)。
例如:方法参数(method parameters);返回地址与本地变量等
4. 两个进程可能会关联到同样的程序,刚才我们说到了所谓程序是一个静态实体。顾名思义就是两个进程允许使用同样的代码段,只是在参数不同而已。但是仍然认为这两个进程是独立执行的序列。例如:几个用户可能会同事运行主程序的不同拷贝一样。
进程状态
注:上面就是一个完整的进程状态图了。这里没有必要多说什么了,图表给了我们一个轮廓。
进程控制块(PCB)
这里就是我们要讲到的进程控制块了,对于操作系统都是需要通过PCB来表示进程的。有些资料上也称作为:任务控制块。对于PCB的整体描述我们还是以图表的方式来说明(这也是本人最喜欢也觉得最直观的一种理解方式了):
Pointer(指针)
|
Process state(进程状态)
|
Process number(进程序列号)
|
Program counter(程序计数器)
|
Register(寄存器)
|
Memory limits(主存中受限说明)
|
List of open files
|
。。。(这里其实还有很多,就不再一一列举了)
|
PCB描述图
既然是操作系统都需要通过进程控制块来调用进程过程,那我们在这里举例说明下如果有两个进程结合PCB是如何在CPU之中切换使用进程的。为了更加清晰了解它们的过程,还是老规矩使用一个图表来展示两个进程分别为P1,P2怎么运行的。
(这个图在自己的笔记本上已经用笔画出来了,可就是找不到一个好的工具,暂时放置在这,待续画图了)
进程调度
由于我们目前接触的其实多半都是以分时系统为主的,其目标也是为了在进程之间频繁转换cpu以便由于用户与运行的程序来交互。
1. 进程进入系统后,都被放在队列中了,我们称这个队列为:作业队列(也有些书上不是这么称呼的),所有的进程都在这个其中。
2. 处于就绪进程都被保留在一个列表中——就绪列表
3. 一旦进程获得了CPU并且执行,就可能发生一下某个事件存在:
u 进程可能发出一个I/O请求,然后被放置在I/O队列中;
u 进程也可能创建一个新的子进程并且等待它终止;
u 有时候发生一个中断,导致进程强行从CPU里移除并返回就绪队列;
调度程序
这里需要了解两个主要的概念:
1. 长程调度(操作系统调度程序):从一个池中选择进程并其载入内存中。
注:咋看不是很了解,可能这里需要了解虚拟存储过程对于这个概念就比较好理解。这里大致说明下。由于过去我们所使用的内存(主存储器)空间非常有限,在抢占的进程志愿中如果都想放入内存中显然是不够科学,而对于我们的后备动力辅助存储器——磁盘(这里我们说是硬盘,当然也有3.5英寸的小磁盘了,呵呵)来说,就可以充分考虑到使用它来做个过度动态的存储器。所以这样一来我们就不需要把一个进程中所有的信息都装载到内存中,而是在需要是再来考虑换入;而与之相反的就是不需要时就换出了(bw:这里的换入/换出如果比较频繁也就证明我们的内耗比较严重,一般称作这个叫:抖动现象。大家有时候感兴趣的可以观察我们主机的硬盘灯如果在频繁的闪动就表示资源在不断换入换出了,呵呵)。而这也就是虚拟存储的一个本质过程,当然中间需要通过逻辑转换表来过度,在这里我们就不再具体复述了。有兴趣的可以去看看相关OS方面的书籍。
2. 近程调度(CPU调度程序):从这些进程中选择就绪进程并为其某个分配CPU
注:说白了这里就是我们的cpu直接通过缓冲通道来调用就绪的程序进入运行。
上下文转换
前面我们也谈到了进程是在CPU中来回切换运行的,既然是一种来回切换运行那势必需要让CPU知道我们切换到下一个状态执行的地址或者说切入点在哪了。这个就是为什么需要一个程序计数器的功效了。那我们把这种来回切换状态,同时需要保存当前运行进程状态信息给记录下来以便下一次能够定位到的方式称作是——上下文转换。
就上面的这样一次转换表述在一定程度上需要耗的硬件资源非常大(这里又要我强调下,更多的信息需要你还了解一些计算机组成体系结构了。希望有时间自己也总结一篇关于一个简单程序在体系中运行过程)。因此上下文转换在很大程度上就取决于硬件的支持了。
接下来要讲到的应该是最核心的也是对以后我们无论是写程序好还是学习一门新语言好,都需要很好理解的部分了。在这里也尽可能表述清楚。
(待续......)
posted on 2008-12-14 00:25
叶澍成 阅读(1409)
评论(0) 编辑 收藏 所属分类:
计算机系统