进程

进程有时被称为任务,有时又被称为运行的程序。在这里引用一段windows内核书籍抄过来的文字,这是迄今为止最准确的定义:尽管表面上看起来程序和进程非常类似,但本质上它们却是截然不同的。程序是指一个静态的指令序列,而进程则是一个容器,其中包含了当执行一个程序的特定实例时所用到的各种资源。

进程就是各种资源的合集,通常一个进程包含下面几种资源。

1、私有的线性地址空间:这是进程可以使用的线性地址的总和,其中内核部分可能和其他进程是共享的。

2、可执行的程序:也就是前面说的二进制序列,包含代码和数据。

3、一些已经获得的其他资源,如打开的文件管道等。

4、进程的权限:指进程的运行权限,在linux中有root和非root之分。

5、进程的描述符:有的操作系统又称为进程控制块。包含操作该进程的一些必要信息。如进程ID号 。

进程是内核调度器调度的单元,进程的运行构成了操作系统工作的大部分内容,其机制较为复杂。这里只介绍和虚拟技术关系最为紧密的概念---上下文。

上下文:

标题不是“进程的上下文”,是因为还有一个“中断的上下文”存在。上下文也是一个难以定义的概念,它实际上是从CPU的角度引出的。简单的说,上下文就是程序运行时所需要的寄存器的最小集合。这些寄存器的后面可能代表着程序运行的一类资源,例如CR3寄存器就可以概括进程的私有线性地址空间。(分页机制启动时)

下面来看看x86架构上下文包含哪些寄存器。

1、通用寄存器组:即EAX、EBX、ECX、EDX、ESI、EDI这六个加上ESP(栈指针)、EBP(框架指针)。

2、段相关寄存器组:CS、DS、SS,如果程序是用来ES等额外的段寄存器也要包括进来。

3、标志寄存器:主要是指EFLAGS寄存器。

4、程序指针寄存器:EIP。

5、GDT基地址:用于访问GDT,GDTR中的内容。

6、LDT段选择符:如果程序使用了私有的LDT,LDTR的内容。

7、IDT基地址:用于访问IDT表,IDTR的内容。

8、控制寄存器组:CR系列,表示当前程序运行时的CPU控制状态。

9、浮点相关寄存器组:用于浮点计算的一些寄存器组。

10、一些特殊用途的寄存器:例如x86架构的MSR。

一个程序的上下文可能是上面列出内容的一个子集(例如进程)也可能是全部(例如虚拟机)。从程序员的观点来看,上下文的概念有些微改变,通常对于上下文切换时不需要改变的寄存器,也可以说它不是该程序的上下文。例如进程切换时,GDTR中的内容不需要改变,为了方便,通常在一个讲进程的上下文时不把GDTR算进去。在后面的内容中,包括虚拟机部分,提到上下文都是指在上下文切换时必须更改的寄存器的集合。

上下文切换

上下文切换是指程序从一种状态切换到另一种状态(例如用户态切换到内核态)。或从一个程序切换到另一个程序(例如一个进程切换)时,导致上下文相关寄存器值的变化行为。这种变化是指旧程序(切换前的程序)上下文相关的寄存器的值被保存到内存中,新程序(切换后的程序)上下文相关寄存器的值被加载到寄存器中。在操作系统中,通常只有三种情况会发生上下文切换。

1、用户态到内核态的切换:此时的上下文切换是因为进程的用户态和内核态运行在不同的Ring级别,对资源的访问权限不同,需要切换上下文。例如,从用户态的栈切换到内核态的栈。

2、进程切换:由于一个CPU在同一时刻只能有一个进程运行,所以在新的进程运行前,需要把上下文相关寄存器的值换成新进程的相关值,例如把 CR3换成新进程页目录的地址,EIP指向新进程运行的第一条指令。这通常是上下文的切换。

3、到中断上下文的切换:中断的处理函数运行在特殊的上下文环境,称为中断上下文。CPU处理一个中断时,不管当前CPU运行一个进程,还是本身就在一个中断上下文中,都要切换到新中断的上下文。例如,更改栈指针、EIP变化等。这通常是部分上下文的切换,例如CR3寄存器的值就不需要更改。根据x86架构的特点,无论是linux的硬中断机制还是window、solaris的中断线程化机制,处理中断必然经过一个中断上下文阶段,可能的情况如下:

(1)进程上下文-》中断上下文(处理中断)-》进程上下文(中断返回执行)

(2)进程上下文-》中断上下文-》新进程上下文(处理中断)-》进程上下文(最先被打断进程的上下文)。

(3)中断上下文-》新中断上下文-》.......

x86只有一种机制,即任务门(Task Gate)可以使中断的处理不经过中断上下文而直接进入进程上下文,但几乎没有操作系统使用它,读者可以忽略。

上下文的切换通常有两个步骤。

1、保存旧上下文:将被切换出去的程序(如一个被新进程替代的旧进程)或将被切换出去的状态(如程序的用户态)的上下文相关寄存器的值保存在内存中。

2、加载新上下文:将要运行的程序(如新进程)或新状态(如程序的内核态)运行需要的上下文相关寄存器的值从内存中读入,加载入对应的寄存器中。

需要注意的是,保存旧的上下文动作在x86架构下有时会由CPU自动完成一部分(例如中断发生时、使用TSS),但现代操作系统中,通常由软件完成。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值