1、进程上下文

进程上下文实际上是进程执行活动全过程的静态描述。我们把已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为上文,把正在执行的指令和数据在寄存器和堆栈中的内容称为正文,把待执行的指令和数据在寄存器与堆栈中的内容称为下文。包括每个进程执行过的、执行时的以及待执行的指令和数据;在指令寄存器、堆栈、状态字寄存器等中的内容。此外, 还包括进程打开的文件描述符等。

上下文简单说来就是一个环境。用户空间的应用程序,通过系统调用(系统调用是操作系统提供给用户空间的接口函数),进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

(1)用户级上下文:正文、数据、用户堆栈以及共享存储区;

(2)寄存器上下文:通用寄存器、程序寄存器(IP)、处理器状态寄存器(EFLAGS)、栈指针(ESP);

(3)系统级上下文:进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。

进程上下文一般在进程切换中提到,当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。当一个进程运行时,产生了一个中断,CPU转而执行中断处理程序 ,虽然CPU当时保存了被中断进程的上下文,但这和中断处理丝毫没有关系 , 也就是说,中断处理程序没有进程上下文,但是你却可以得到current的值!

2、进程上下文和中断上下文的区别

(1)概述

进程上下文就是表示进程信息的一系列东西,包括各种变量、寄存器以及进程的运行的环境。这样,当进程被切换后,下次再切换回来继续执行,能够知道原来的状态;中断上下文就是中断发生时,原来的进程执行被打断,那么就要把原来的那些变量保存下来,以便中断完成后再恢复。

(2)处理器总处于以下状态中的一种

a、内核态,运行于进程上下文,内核代表进程运行于内核空间;
b、内核态,运行于中断上下文,内核代表硬件运行于内核空间;
c、用户态,运行于用户空间。

(3)进程上下文

在Linux中,用户程序装入系统形成一个进程的实质是系统为用户程序提供一个完整的运行环境。进程的运行环境是由它的程序代码和程序运行所需要的数据结构以及硬件环境组成的。进程的运行环境主要包括:
a、进程空间中的代码和数据、各种数据结构、进程堆栈和共享内存区等;
b、环境变量:提供进程运行所需的环境信息;
c、系统数据:进程空间中的对进程进行管理和控制所需的信息,包括进程任务结构体以及内核堆栈等;
d、进程访问设备或者文件时的权限;
e、各种硬件寄存器;
f、地址转换信息。

从以上组成情况可以看到,进程的运行环境是动态变化的,尤其是硬件寄存器的值以及进程控制信息是随着进程的运行而不断变化的。在Linux中把系统提供给进程的的处于动态变化的运行环境总和称为进程上下文。

系统中的每一个进程都有自己的上下文。一个正在使用处理器运行的进程称为当前进程(current)。当前进程因时间片用完或者因等待某个事件而阻塞时,进程调度需要把处理器的使用权从当前进程交给另一个进程,这个过程叫做进程切换。此时,被调用进程成为当前进程。在进程切换时系统要把当前进程的上下文保存在指定的内存区域(该进程的任务状态段TSS中),然后把下一个使用处理器运行的进程的上下文设置成当前进程的上下文。当一个进程经过调度再次使用CPU运行时,系统要恢复该进程保存的上下文。所以,进程的切换也就是上下文切换。

在系统内核为用户进程服务时,通常是进程通过系统调用执行内核代码,这时进程的执行状态由用户态转换为内核态。但是,此时内核的运行是为用户进程服务,也可以说内核在代替当前进程执行某种服务功能。在这种情况下,内核的运行仍是进程运行的一部分,所以说这时内核是运行在进程上下文中。内核运行在进程上下文中时可以访问和修改进程的系统数据。此外,若内核运行在进程上下文中需要等待资源和设备时,系统可以阻塞当前进程。

(4)中断上下文

硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。中断时,内核不代表任何进程运行,它一般只访问系统空间,而不会访问进程空间,内核在中断上下文中执行时一般不会阻塞。

运行在进程上下文的内核代码是可以被抢占的(Linux2.6支持抢占)。但是一个中断上下文,通常都会始终占有CPU(当然中断可以嵌套,但我们一般不这样做),不可以被打断。正因为如此,运行在中断上下文的代码就要受一些限制,不能做下面的事情:

a、睡眠或者放弃CPU:由于中断上下文不属于任何进程,它与current没有任何关系(尽管此时current指向被中断的进程),所以中断上下文一旦睡眠或者放弃CPU,将无法被唤醒。所以也叫原子上下文(atomic context);

b、尝试获得信号量:为了保护中断句柄临界区资源,不能使用mutexes。如果获得不到信号量,代码就会睡眠,会产生和上面相同的情况,如果必须使用锁,则使用spinlock;

c、执行耗时的任务:中断处理应该尽可能快,因为内核要响应大量服务和请求,中断上下文占用CPU时间太长会严重影响系统功能。在中断处理例程中执行耗时任务时,应该交由中断处理例程底半部来处理;

d、访问用户空间的虚拟地址:因为中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在终端上下文无法访问用户空间的虚拟地址;

e、中断处理例程不应该设置成reentrant(可被并行或递归调用的例程)。因为中断发生时,preempt和irq都被disable,直到中断返回。所以中断上下文和进程上下文不一样,中断处理例程的不同实例,是不允许在SMP上并发运行的;

f、中断处理例程可以被更高级别的IRQ中断。如果想禁止这种中断,可以将中断处理例程定义成快速处理例程,相当于告诉CPU,该例程运行时,禁止本地CPU上所有中断请求。这直接导致的结果是,由于其他中断被延迟响应,系统性能下降。

备注:
点击下面链接,进入奥比中光开发者社区,了解更多3D视觉技术信息:
https://developer.orbbec.com.cn/

或扫描下方二维码,进入奥比中光开发者社区:

进程上下文和中断上下文相关推荐

  1. linux 中断和进程 传递,Linux内核之进程上下文和中断上下文的区别

    进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触.看上去很懂但又说不清楚到底怎么回事.造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停 ...

  2. Linux:上下文,进程上下文和中断上下文概念,上下文切换

    Linux:上下文,进程上下文和中断上下文概念,上下文切换 1. 上下文 context:(就是一个环境) 2. 进程上下文 2.1 进程上下文的三个部分:用户级上下文.寄存器上下文以及系统级上下文 ...

  3. 对Linux内核中进程上下文和中断上下文的理解

    内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间.现代的CPU都具有不同的操作模式,代表不同的 级别,不同的级别具有不同的功能,在较低的级别中将禁止某 ...

  4. linux中断--进程上下文和中断上下文

    一.前言 中断发生以后,CPU跳到内核设置好的中断处理代码中去,由这部分内核代码来处理中断.这个处理过程中的上下文就是中断上下文. 为什么可能导致睡眠的函数都不能在中断上下文中使用呢? 首先睡眠的含义 ...

  5. 进程上下文与中断上下文

    最近学习驱动程序中总是发现在某些资料或书籍中提到进程上下文和中断上下文,但是又都没有讲解什么是上下文:因此笔者查阅资料补充了一下所谓的Linux上下文知识.(注:以下知识度娘而来) 上下文(conte ...

  6. 进程上下文与中断上下文的理解

    一.什么是内核态和用户态 内核态:在内核空间执行,通常是驱动程序,中断相关程序,内核调度程序,内存管理及其操作程序. 用户态:用户程序运行空间. 二.什么是进程上下文与中断上下文 1.进程上下文: ( ...

  7. 进程上下文、中断上下文及原子上下文

    谈论进程上下文 .中断上下文 . 原子上下文之前,有必要讨论下两个概念: a -- 上下文 上下文是从英文context翻译过来,指的是一种环境.相对于进程而言,就是进程执行时的环境: 具体来说就是各 ...

  8. 嵌入式之linux用户空间与内核空间,进程上下文与中断上下文

    文章目录 前言 用户空间与内核空间 内核态与用户态 进程上下文和中断上下文 上下文 原子 进程上下文 中断上下文 进程上下文VS中断上下文 原子上下文 前言 之前在学习嵌入式linux系统的时候,一直 ...

  9. 【中断】中断上下文、进程上下文

    Linux中断知识汇总: [深入理解Linux内核][中断]内容汇总帖 目录 中断上下文和进程上下文 什么是中断上下文? 什么是进程上下文? 为什么要进行不同之间状态的切换? 什么情况下进行用户态到内 ...

最新文章

  1. 12.HTML编辑器(CKEditor、CKFinder集成)
  2. 基于 Spring Boot 的车牌识别系统(附项目地址)
  3. [Oracle]理解undo表空间
  4. Bootloader的基本概念
  5. 六十三、SpringBoot中的日志框架SLF4j的使用
  6. oracle dw报告,讲解Oracle数据库的全文索引设置步骤
  7. Linux的开源免费办公软件,开源免费Office办公套件(LibreOffice)
  8. python扫描端口脚本_python扫描端口脚本
  9. 花花的礼物 (huahua)
  10. 垃圾回收算法_划重点 JVM G1 垃圾回收算法
  11. OpenJ_POJ C16B Robot Game 打表找规律
  12. ETH-trunk(链路聚合协议)lacp
  13. 四方位陈述RV系列蜗轮蜗杆减速机产品
  14. GPS测量误差来源分析
  15. 苹果11触屏不灵敏_苹果iPhone11Pro屏幕失灵怎么办
  16. directx安装后找不到_如何下载,安装,更新到最新的DirectX
  17. 学生信息管理系统-数据结构课程设计
  18. java outer的使用
  19. Cultrue ‘zh-hans’ is a neutral cultrue报错解决办法
  20. 一篇文章看懂三种存储方式DAS、NAS、SAN

热门文章

  1. 阿里Java岗P5-P7成长笔记【3283页PDF文档】
  2. 面试官:谈谈分布式锁的实现
  3. 人才迁徙潮,2019年互联网各梯队排名重组,最适合程序员去的互联网公司有哪些?...
  4. 听说又被 JVM 内存区域方面的面试题给虐了?看看这篇文章吧!
  5. 创业公司崛起靠加班?别闹了,早死才靠加班
  6. 这7款实用windows软件,太让人惊喜了!
  7. 如何面对自己不喜欢的工作?
  8. 企业如何告别这 5 类不靠谱的员工?
  9. 领域驱动设计门槛很高,没有深厚的面向对象编码能力很难实践成功
  10. 常用的数据结构-数组