操作系统导论——(二)抽象:进程

        进程的非正式定义很简单:运行着的程序。进程是由多道程序的并发执行而引出的,他和程序是两个不同的概念。人们常常希望同时运行多个程序,比如在使用计算机时,我们会同时运行浏览器、音乐播放器、游戏等等,也就是说进程具有并发性。

        实际上一个正常的系统可能会同时运行上百个进程。操作系统通过让一个进程只运行一个时间片,然后切换到其他进程,从而提供存在多个虚拟CPU的假象。这便是时分共享CPU系统,所有现代操作系统都采用这种分时机制。

        机制(mechanism)是一些低级方法或协议,例如上下文切换机制。在这些机制之上,操作系统中有一些所谓的策略(policy),策略是在操作系统内做出某种决定时所用的算法,比如进程调度算法(比如利用进程调度算法,从就绪队列中选择一个进程,通过上下文切换机制,使得该进程上处理机运行)

抽象:进程概念

        操作系统正在运行的程序提供的抽象,就是所谓的进程(process)。为了能够理解构成进程的是什么,我们必须理解它的机器状态——即程序正在运行时可以读取或更新的内容。进程的机器状态有一个明显的组成部分——内存,正在运行的程序的指令和数据都存放于内存中,因此进程可以访问的内存(称为地址空间)是该进程的一部分。

        寄存器也是进程的机器状态的一部分。许多指令都会明确的读取或更新寄存器。请注意,有一些非常特殊的寄存器也构成机器状态的一部分。例如,程序计数器(Program Counter,即PC寄存器,有时也叫指令指针,Instruction Pointer,IP寄存器)指明当前进程即将执行的下一条指令的内存地址;类似的,栈指针和相关的帧指针用于管理函数参数栈、局部变量、返回地址等等。

        最后,程序也经常访问持久存储设备,此类IO信息可能包含当前打开文件表(进程需要打开一个文件,会通过文件系统根据文件的绝对路径,经过一系列操作在磁盘中找到存放该文件的各种信息的数据结构,然后将该数据结构读入内存,并给进程返回一个文件描述符,进程会将该文件描述符存放到进程打开文件表中。进程通过该打开文件表、根据表中的文件描述符并可以访问对应的文件)

进程API简介

  • 创建:用于创建新的进程。在shell中输入入命令或双击应用程序图标时,会调用操作系统例程来创建新进程,运行指定的程序。
  • 销毁:用于强制销毁进程。大多数程序在运行完成后会自动退出,但如果它们不退出而用户希望终止它们,则可以使用该接口。
  • 等待:有时等待进程停止运行是有用的,因此提供等待接口。
  • 状态:通常有一些接口可以获得有关进程的状态信息,例如运行了多长时间、处于何种状态。
  • 其他:比如,大多数操作系统提供某种方法来暂停进程,然后恢复(继续运行)。

进程创建的细节

        操作系统运行一个程序必须做的第一件事是将代码和所有静态数据(例如初始化某个变量的初始值)加载到内存中(加载到进程的地址空间中)。程序最初以某种可执行格式驻留在磁盘上(例如windows的exe可执行文件,如记事本程序),因此执行前需要操作系统从磁盘中读取程序和其静态数据,将它们放入内存的某处)。

        将代码和静态数据加载到内存后, 操作系统在运行此进程之前还需要执行其他操作。必须为程序的运行时栈分配一些内存。我们知道诸如C和Java程序使用栈存放局部变量、函数参数、返回地址。操作系统也可能会用参数初始化栈——将参数填入main()函数。

        操作系统也可能为程序的堆分配一些内存。在C程序中,对,用于显式请求的动态分配数据(如malloc )。

        操作系统还将执行一些其他初始化任务,特别是与IO相关的任务。例如,在UNIX系统中,默认情况下,每个进程都有三个打开文件描述符,用于标准输入、输出和错误。这些描述符让程序轻松读取来自终端的输入以及打印输出到屏幕。

        完成上述工作后,操作系统便会启动程序,将CPU指令执行流跳转到程序的main()方法,从而将CPU的控制权转移到新创建的进程。

进程状态

  • 运行态:进程正在处理机上运行,即CPU正在运行该进程的指令,一个CPU核心只运行一个进程的指令。
  • 就绪态:进程获得除处理机时间片以外的所有资源,已经做好运行的准备,一旦得到处理机便可开始运行。系统中处于就绪状态的进程可能有多个,操作系统会将它们排成一个队列,称为就绪队列
  • 阻塞态:进程为了等待某一事件完成而暂停运行(由此可见阻塞之前一定是运行态),如等待某资源可用或等待IO事件完成。例如,当进程像磁盘发起IO请求时,进程会主动阻塞,将CPU让给其他进程,即进程阻塞会引起CPU调度。直到IO操作完成时设备发出中断,陷入内核,阻塞的进程才会操作系统唤醒,并插入就绪队列。系统通常将处于阻塞态的进程也排成队列。

数据结构

        操作系统有一些关键的数据结构,用于跟踪各种相关的信息。为了跟踪每个进程的状态,操作系统可能会为所有就绪进程保留某种进程列表(例如上文所说的各种队列),操作系统还必须以某种方式跟踪被阻塞的进程,当I/O事件完成时操作系统应确保唤醒正确的进程,让它准备好再次运行。

        进程创建时,操作系统为他新建一个PCB,该结构会常住进程地址空间的内核区,是进程的唯一标志。进程执行时,操作系统通过其PCB了解进程的机器状态;在调度某进程后,会根据其PCB中保存的机器状态信息,恢复上一次运行结束时的机器状态。当进程由于某种原因暂停运行时,又需要将其断点的机器状态保存到PCB中。可见在晋城的整个生命周期中,操作系统都是通过PCB来感知进程的存在并控制进程。

        PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息。如下所示为xv6内核(这是一个简化版的Unix操作系统内核)的proc结构体,用于跟踪和管理系统中的每个进程。 

struct context {    //    上下文信息,各种寄存器的值
    int eip;
    int esp;
    int ebx;
    int ecx;
    ......
}

//进程状态枚举
enum proc_state = {UNUSED, EMBRYO, SLEEPING, RUNNABLE, RUNNING, ZOMBIE}

struct proc {
    char *mem;    //进程内存起始地址
    uint sz;    //进程内存空间大小
    char *kstack;    //进程内核栈栈底地址
    pde_t *pgdir;    //进程的页表

    enum proc_state state;    //进程状态
    int pid;    //进程Id
    struct proc *parent;    //父进程指针
    struct context context;    //上下文指针
    struct file *ofile[NOFILE];    //进程打开文件表指针
    struct inode *cwd;    //进程当前目录
    ......
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值