上下文之->解密篇

简介: 上下文之->解密篇

今天偶然跟朋友聊天的时候.谈起了线程跟队列.忽然间聊起了上下文这个概念.


Context 上下文,这个概念,通常在绘图的时候,跟XMPP上下文,跟离屏渲染,这个地方都有涉及到上下文,可是我不禁的在想,上下文,究竟是个什么样的东西呢?于是乎,回来查看百度,谷歌,CSDN各种博文.下面就来看下我搜集到的上下文的综合 有些是摘抄自墙外博客

          上下文context: 上下文简单说来就是一个环境,相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。

一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。

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

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

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

当发生进程调度时,进行进程切换就是上下文切换(context switch).操作系统必须对上面提到的全部信息进行切换,新调度的进程才能运行

        处理器总处于以下状态中的一种:

1、内核态,运行于进程上下文,内核代表进程运行于内核空间;

2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;

3、用户态,运行于用户空间。

用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。

硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。

LINUX完全注释中的一段话:

当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。在LINUX中,当前进程上下文均保存在进程的任务数据结构中。在发生中断时,内核就在被中断进程的上下文中,在内核态下执行中断服务例程。但同时会保留所有需要用到的资源,以便中继服务结束时能恢复被中断进程的执行。


相关文章
|
7天前
|
自然语言处理 知识图谱
|
11天前
|
机器学习/深度学习 自然语言处理
上下文无关与上下文相关
上下文无关与上下文相关
|
11天前
|
JavaScript
使用局部上下文创建控制器对象
使用局部上下文创建控制器对象
|
5天前
|
C语言 Windows
上下文跳转之ucontext
上下文跳转之ucontext
|
3月前
|
中间件
Koa2 中的上下文(context)是什么?如何使用上下文对象?
Koa2 中的上下文(context)是什么?如何使用上下文对象?
36 0
|
10月前
|
C#
C# 当前上下文中不存在InitializeComponent()
C#——当前上下文中不存在InitializeComponent()可能原因是:项目文件直接由外部加载进来时可能出现错误。可以先检查xaml文件的开头x:Class=“day27test02.MainWindow”是否是正确的类名。如果不是,改成对应的项目的类即可。这是本人碰到的这种情况通过这种方式得到解决的,仅供参考。
541 1
C# 当前上下文中不存在InitializeComponent()
|
10月前
|
监控 Python
Python函数-上下文管理器
Python函数-上下文管理器
48 0
|
关系型数据库 MySQL 数据库连接
完全理解关键字"with"与上下文管理器
完全理解关键字"with"与上下文管理器
62 0
|
消息中间件 设计模式 测试技术
阐释限界上下文
阐释限界上下文
阐释限界上下文
|
安全
识别限界上下文
识别限界上下文
识别限界上下文