首页 > 技术文章 > 操作系统 - 进程

mr-zys 2014-10-05 22:00 原文

九月份参加的一场面试被问道了进程和线程的相关问题,这篇博文主要整理一下自己的思路。


 

进程控制表(PCB)

Tanenbaum的大作《现代操作系统》中,列出了PCB包含的一些实体。PCB主要包括三个部分:进程管理、内存管理和文件管理。下面来仔细说说我所了解的各个部分的实体。


 

进程管理

说道进程管理,首先应该想到的就是PID,进程状态等相关内容。这里按照书上列举的顺序依次来说明。

Register、PC和PSW

Register、PC和PSW严格意义上都是寄存器。说道寄存器,首先想到的就是PC(程序计数器),在《现代操作系统中》看来是将PC和其它寄存器分开了看待。但是我翻了一下自己学习的计算机组成原理的书后,对于寄存器有了一点浅显的认识。CPU主要有下面几类寄存器。

  1. IR(指令寄存器)保存CPU当前正在执行的指令。我想是从PC中取指令。
  2. PC(程序计数器)保存下一次需要执行的指令。
  3. AR(数据地址寄存器)保存当前CPU所访问的数据在cache中的地址。
  4. 通用寄存器 保存ALU操作数。当然通用寄存器还有其它功能:地址指示器、变址寄存器、堆栈指示器等。
  5. PSW(状态字寄存器)保存算术和逻辑运算的各种条件代码,保存中断和系统工作状态等信息。

所以当进程切换的时候,以上的信息必须要保存。

Stack Pointer(栈指针)

这个我不是很清楚,说一说自己的理解吧。在内存管理中,系统会为一个进程分配一个地址空间,这样不同的进程就不会相互影响。我们写代码的时候(c代码),代码中有常量、变量、各种控制语句,或许你还会写一个递归函数。这样当系统为进程分配内存的时候,将进程分配的内存也对应的分为三个部分(我自己的理解):代码区、堆和栈。栈保存一些变量和常量,如果有递归,还要保存每次返回的地址(这里就明白了为什么会栈溢出了吧。。。)。堆保存那些动态变化的数据。比如,调用了malloc函数,申请一块内存就是从堆里面分配内存。不知道这里的栈指针是不是指这个栈。

Process State

这个只要学习过操作系统的都知道

Priority

这个也是,当调度算法使用的话

Scheduling parameters

这个也是和调度相关的

Proces ID

这个的作用很明显

Patent process

同上

Signals

这个不清楚

Time when process started、CPU time used和Children‘s CPU time

这个都是和调度相关

Time of next alarm

这个知道,囧!

以上就是进程管理所保存的信息。下面介绍内存管理。


 

内存管理

Pointer to next text segment info

Pointer to next  data segment info

Pointer to next stack segment info

看了这些,就知道在上面所说的栈指针指的不是内存管理中系统为进程分配的内存中栈的指针了,Pinter to next statck segement info 才是。那么进程管理中的栈指针是指什么呢?求大神告知。在网上搜了一下,一般进程有两个栈:系统栈和用户栈。前面所说的应该就是系统栈了,这里所说的应该就是用户栈。系统栈主要用在中断发生时使用,保存中断现场。在《现代操作系统》中,当系统处理中断时,第一个要做的就是 Hardware statcks program counter,etc. 这句话翻译过来就是硬件将PC等数据存在栈中。如果是这样,我的理解就是系统栈将进程管理中所说的那些实体全部存在系统栈中?看来还是没有搞透这个问题。是否这个问题考虑到这里就够了?我主要也不是搞操作系统的,也不是搞硬件的。求大神解答啊!!!


 

文件管理

Root directory

根目录

Working directory

工作目录,所以配置JDK有点麻烦,就是要配置这两个东西。知道JDK和JRE绝对目录和源文件的工作目录

User ID

Group ID

这两个,一般多用户的时候使用的多。


看玩了PCB的内容,我想对于进程的概念应该有一个直观的理解了。

首先,进程是一个具有特定功能的程序关于某个数据集合的一次运行活动,它是一个动态的概念。

其次。进程是一个实体集合,它所包含的某些实体是不断变化的,这些实体确保了程序的正确执行。

 

推荐阅读