实例分析UNIX操作系统
3.共享正文段
为了管理好进程的共享正文段,UNIX在内存专门 开辟了一个text结构区域,形成正文段表text[ ]。其中 每一个text结构对应一个共享正文段,主要记录关于这 个正文段的有关信息,比如共享正文段在磁盘对换区 的地址(x_daddr),共享正文段在内存的地址 (x_caddr),共享正文段的长度(x_size),共享本 正文段的所有进程数目(x_count)等。
以上就是一个UNIX进程从被创建开始到被撤消为 止的整个生命期内的变化过程。
UNIX的进程调度与换进换出
为了把处理机分配给一个进程使用,UNIX的进程 调度程序总去查看系统proc[ ]表中登记的所有进程。 在处于就绪、且全部在内存的进程中,挑选一个优先 数最小(即优先权最大)的进程作为分配对象。如果 暂时没有这种进程存在,那么进程调度程序就处于 “在内存睡眠”的等待状态。直到发生中断请求,被 唤醒再次去搜索proc[ ]表。UNIX赋予进程调度进程极 高的优先权,以保证系统能以最快的速度找到可运行 的进程,提高CPU的使用效率。
一个进程处于“在内存睡眠”状态时,如果内存 使用紧张,就会被从内存换出到磁盘的对换区。这时, 该进程处于“睡眠并换出”状态。无论是处于“在内 存睡眠”状态还是处于“睡眠并换出”状态,都表明 这个进程在等待某个事件的发生。当处于“在内存睡 眠”状态下等待的事件发生时,进程状态就变为“在 内存就绪”;当处于“睡眠并换出”状态下等待的事 件发生时,进程状态就变为“换出并就绪”。
当父进程执行系统调用fork创建一个子进程时, 被创建进程处于“创建”状态。如果能够为该进程分 配到足够的内存空间,则它变为“在内存就绪” 状态;
如果当前没有足够的内存空间,则它变为“换出并就 绪”状态,被安置在磁盘的对换区。另外,原来已在 内存的就绪进程,也可能因为内存紧张而被换出,同 样成为“换出并就绪”状态。处于这两种状态的进程, 从原则上说都是“就绪”的,都可以参与处理机调度。 只是处于“换出并就绪”状态的进程被调度到时,由 于它的非常驻内存部分并不在内存,因此要先被换进, 才能够真正占用处理机投入运行。
为了改变一个进程的优先数,在UNIX中采取设置 和计算两种方法。
设置方法用于当一个进程变为睡眠状态时,系统 将根据不同的睡眠原因,赋予睡眠进程不同的优先数。 这个优先数将在进程被唤醒后发挥作用。
计算进程优先数的公式为:
p_pri=min{127,(p_cpu/16+PUSER+p_nice)}
此公式是在127和p_cpu/16+PUSER+p_nice两个数 之间取最小值。其中PUSER是一个常数;p_nice是用 户为自己的进程设定的优先权,它可以通过系统调用
和共享正文段是非常驻内存部分,根据需要和可能,
数据段和共享正文段会在内存和磁盘对换区之间换进 和换出。另外,通过user结构中的u_procp,可以得到 该进程的proc结构的位置。
UNIX的进程状态
UNIX进程在其生命期内,可以处于多种不同的状 态,并记录在进程的proc结构中。图6-3给出了进程状 态的变迁图。
UNIX是一个通用、多用户的分时操作系统。本章 主要从实现的角度出发,讲述四个方面的内容:
(1)UNIX的进程以及进程调度;
(2)UNIX采用的存储管理策略;
(3)UNIX目录结构的特点以及对磁盘存储空间 的管理;
(4)UNIX对块设备及字符设备的管理以及缓冲 技术。
UNIX的处理机管理
UNIX的进程 通常,一个进程由三个部分组成:进程控制块 PCB、数据和程序。在UNIX中,一个进程也由三个部 分组成:进程控制块、数据段和共享正文段,并有其 自身的不同含义。 1.进程控制块:proc结构。
一个进程被调度到时,就成为“用户态运行”状
态。进程在“用户态运行”状态下时,若程序中使用 了系统调用或请求输入/输出,就会使进程从“用户态 运行”状态改变为“核心态运行”状态。在“核心态 运行”状态下的进程是不能被剥夺的。当系统调用执 行完毕,就返回到“在内存就绪”状态。如果要等待 输入/输出完成,则变成“在内存睡眠”状态;如果是 调用了exit而进入“核心态运行”状态,则意味着进程 运行结束,于是进入“僵死”状态,所占用的一切资 源被释放。如果在“用户态运行”状态下,由于时间 片到等原因,就会直接变成“在内存就绪”状态。
综上所述,一个进程的基本控制块proc结三 者之间的关系,可以用图6-2勾画出来。
在那里一根虚线把图分成两个部分。标有①的部
分表示proc[ ]表中进程的proc结构以及text[ ]表中的 text结构总是常驻内存。通过proc结构中的p_addr,就 能够得到该进程的数据段;通过p_textp,就能够得到 该进程共享正文段的text结构,再由这个text结构中的 x_caddr或x_daddr就能够得到共享正文段在内存或在 磁盘对换区的位置。标有②的部分表示进程的数据段
实例分析:UNIX操作系统
1969年,美国贝尔实验室的汤普逊(K.Thompson) 和里奇(D.M.Ritchie)免费发行了一个小型的实验性操作系统, 由此宣布了UNIX操作系统的诞生。1978年以后,UNIX真正开 始流行。时至今日,UNIX已经走过了30多个年头。在此期间, 它发生了许多重大的变化,有欣欣向荣之日,也有曲折坎坷之 时。但不管怎样,UNIX以其特有的简洁性和开放性,赢得了越 来越多人的赞赏与青睐,已成为一个应用领域广泛、功能丰富 实用的操作系统。现在已经有各种版本的、可以运行在不同平 台上的UNIX。
2.数据段
进程运行时用到的数据以及工作区,构成了一个
进程的数据段。要注意的是,如果进程执行的程序是 不能被共享的,那么也把它归入到数据段中。这样, UNIX进程的数据段分成三个部分:系统数据区、用户 数据区和用户栈区。如在基本控制块proc结构中所述, 在进程的proc结构中,由p_addr指向该进程数据段的 首地址,由p_size给出数据段的长度。其联系如图6-1 所示。