第八章 异常控制流 第二节 进程

1、基本概念

进程的经典定义就是一个执行中程序的实例。系统中的每个程序都运行在某个进程的上下文(context)中。上下文是由程序正确运行所需的状态组成的。这个状态包括存放在内存中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。

进程提供给应用程序的两个关键抽象

  • 一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器。
  • 一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用内存系统。

2、 逻辑控制流

如果想用调试器单步执行程序,我们会看到一系列的程序计数器(PC)的值,这些值唯一地对应于包含在程序的可执行目标文件中的指令,或是包含在运行时动态链接到程序的共享对象中的指令。这个PC值的序列叫做逻辑控制流,或者简称逻辑流。
在这里插入图片描述
进程是轮流使用处理器的。每个进程执行它的流的一部分, 然后被抢占(preempted) (暂时挂起), 然后轮到其他进程。

3、并发流

1.定义

一个逻辑流的执行在时间上与另一个流重叠, 称为并发流(concurrent flow) , 这两个流被称为并发地运行。
例如, 图8-12 中, 进程A 和B并发地运行,A和C也一样。另一方面,B和C没有并发地运行, 因为B的最后一条指令
在C的第一条指令之前执行。

多个流并发地执行的一般现象被称为并发(concurrency) 。一个进程和其他进程轮流运行的概念称为多任务(multitasking) 。一个进程执行它的控制流的一部分的每一时间段叫做时间片(time slice)。因此, 多任务也叫做时间分片(time slicing)

2. 并发流与并行流

  • 并发流的思想与流运行的处理器核数或者计算机数无关。如果两个流在时间上重叠, 那么它们就是并发的, 即使它们是运行在同一个处理器上。
  • 并行流是并发流的一个真子集。如果两个流并发地运行在不同的处理器核或者计算机上, 那么我们称它们为并行流(parallel flow) , 它们并行地运行(running in parallel) , 且并行地执行(parallel execution) 。

4、私有地址空间

1.何为私有

进程为每个程序提供它自己的私有地址空间。一般而言, 和这个空间中某个地址相关联的那个内存字节是不能被其他进程读或者写的,从这个意义上说,这个地址空间是私有的。

2.进程地址空间结构

在这里插入图片描述
地址空间底部是保留给用户程序的,包括通常的代码、数据、堆和栈段。代码段总是从地址0x400000开始。地址空间顶部保留给内核(操作系统常驻内存的部分)。地址空间的这个部分包含内核在代表进程执行指令时(比如当应用程序执行系统调用时)使用的代码、数据和栈。

5、异常控制流应用之用户模式和内核模式

处理器通常是用某个控制寄存器中的一个模式位(mode bit)来提供这种功能的,该寄存器描述了进程当前享有的特权。当设置了模式位时,进程就运行在内核模式中(有时叫做超级用户模式)。没有设置模式位时,进程就运行在用户模式中。
用户程序必须通过系统调用接口间接地访问内核代码和数据。运行应用程序代码的进程初始时是在用户模式中的。进程从用户模式变为内核模式的唯一方法是通过诸如中断、故障或者陷入系统调用这样的异常。当异常发生时,控制传递到异常处理程序,处理器将模式从用户模式变为内核模式。处理程序运行在内核模式中,当它返回到应用程序代码时,处理器就把模式从内核摸式改回到用户模式。

6、异常控制流应用之多任务实现

操作系统内核使用一种称为上下文切换(context switch)的较高层形式的异常控制流来实现多任务。

1.什么是上下文

内核为每个进程维持一个上下文(context)。上下文就是内核重新启动一个被抢占的进
程所需的状态。它由一些对象的值组成,这些对象包括通用目的寄存器、浮点寄存器、程
序计数器、用户栈、状态寄存器、内核栈和各种内核数据结构,比如描述地址空间的页
表、包含有关当前进程信息的进程表,以及包含进程已打开文件的信息的文件表。

Linux提供了一种聪明的机制,叫做/proc文件系统,它允许用户模式进程访问内核数
据结构的内容。/proc文件系统将许多内核数据结构的内容输出为一个用户程序可以读的文
本文件的层次结构。比如,你可以使用/proc文件系统找出一般的系统属性,比如CPU类型
(/proc/ cpuinfo),或者某个特殊的进程使用的内存段(/proc/<process-id> /maps)。2.6
版本的Linux内核引入/ sys文件系统,它输出关千系统总线和设备的额外的低层信息。

2. 调度

在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占了的进程。这种决策就叫做调度(scheduling),是由内核中称为调度器(scheduler)的代码处理的。在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程

3.上下文切换

  1. 保存当前进程的上下文
  2. 恢复某个先前被抢占的进程被保存的上下文
  3. 将控制传递给这个新恢复的进程。

下图是一对进程A和B之间上下文切换的示例。在这个例子中,进程A初始运行在用户模式中,直到它通过执行系统调用read陷入到内核。
内核中的陷阱处理程序请求来自磁盘控制器的DMA传输,并且安排在磁盘控制器完成从磁盘到内存的数据传输后,磁盘中断处理器。
在这里插入图片描述
磁盘取数据要用一段相对较长的时间(数量级为几十毫秒), 所以内核执行从进程A到进程B的上下文切换, 而不是在这个间歇时间内等待, 什么都不做。注意在切换之前,内核正代表进程A在用户模式下执行指令(即没有单独的内核进程)。在切换的第一部分中,内核代表进程A在内核模式下执行指令。然后在某一时刻, 它开始代表进程B(仍然是内核模式下)执行指令。在切换之后, 内核代表进程B在用户模式下执行指令。随后, 进程B在用户模式下运行一会儿, 直到磁盘发出一个中断信号, 表示数据从磁盘传送到了内存。内核判定进程B已经运行了足够长的时间, 就执行一个从进程B到进程A的上下文切换, 将控制返回给进程A中紧随在系统调用read之后的那条指令。进程A继续运行, 直到下一次异常发生, 依此类推。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值