`
buliedian
  • 浏览: 1248923 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论
阅读更多

什么叫程序运行?

什么是线程状态?

  • 当提及一个例程的上下文时,我们是指它的线程和进程的执行环境。在NT中,这个环境由当前的线程环境块(TEB)和进程环境块(PEB)建立。上下文因此包括虚拟内存的设置(告诉我们那个物理内存页面对应那个虚拟内存地址),句柄转换(因为句柄是基于进程的),分派器信息,堆栈,以及通用和浮点寄存器的设置。
  • Each thread maintains an independent program counter and hardware context that includes a private set of CPU registers.

线程上下文(Thread Context)

(摘自:http://www.win32asm.com.cn/view.asp?file=320

在大多数情况下,我们的系统中只安装了一个CPU,所以,对于所有这些运行中的程序来说,操作系统对每个进程中的线程所使用的CPU时间进行调度,循环为每个线程分配时间片,这就造成了多个程序同时执行的假象。如果Windows检测到一个新线程要开始运行了,它将进行一次上下文切换(context switch)(注:”上下文“ 实际上就是线程运行的环境,也就是运行时各寄存器和其他东东的状态,更自然的理解就是"线程状态")。所谓上下文切换就是保存线程运行时的机器状态,然后将另一个线程的状态恢复并重新开始执行。如果重新开始执行的线程属于另一个进程,那么该进程的地址空间也将被同时切换过来(通过在CR3寄存器中装入页表)。

AMD and Intel x86 CPU Architecture - System Registers

每个用户进程都有私有的地址空间,所以他们的页表都是不同的,CPU通过切换页表来将虚拟地址映射到物理地址,设备驱动程序并不需要直接做这些工作。上下文切换比较耗CPU时间,所以驱动程序一般不创建它们自己的线程,它们一般在下列环境中的一个中运行:

  • 1. 在发起I/O请求的用户线程中运行
  • 2. 在内核模式下的系统线程中运行
  • 3. 作为中断运行(并不处于哪个特定的进程或线程中,因为它们都被暂时挂起了)

在处理I/O请求包(IRPs)时,我们总是运行在和用户模式的调用者相同的进程上下文中运行,这样我们就能对用户程序的地址空间进行寻址。但是当驱动程序被加载或者卸载的时候,我们将在系统进程中运行,这时存取的只能是系统的地址空间。

内核代码是怎么被执行的?

(翻译自《Windows 2000 Device Driver Book a Guide for Programmers》BY Art Baker / Jerry Lozano

The kernel-mode parts of Windows 2000 (including a device driver) consist of massive(厚重的, 大块的) amounts of code. But just what causes this code to execute? All code executes within a hardware and software context. A context, as used here, describes the state of the system while a CPU instruction executes. It includes the state of all CPU registers (including the stack), the processor mode (user or kernel), and significantly, the state of the hardware page tables. This last item describes what memory can be seen by executing code, and where within the address space that memory is located.

Windows 2000的内核(在CPU核态运行的、包括驱动程序代码)由成千上万行代码组成,有没有想过到底是由谁来主导这些代码运行的呢?代码都是在一定的软件和硬件的上下文中执行的。这里的上下文指的是当CPU执行一条指时系统的状态,包括所有CPU寄存的状态(包当前的堆栈)、CPU的操作模式(用户或核心的)和硬件页表(hardware page tables?)的状态。硬件页表包含两项内容,一个是指出被执行代码可见的内存范围,一个是这些内存所在的地址空间。

Clearly, code must make assumptions about the context in which it executes. Windows 2000 defines three execution contexts for kernel-mode execution. In other words, kernel-mode driver code executes in one of three contexts.

一般的用户进程不会有很明显的对上下文的意识,因为用户进程运行的角色单一,只有一个默认的上下文。而操作系统则不同,它有三种角色,为用户进程服务,为硬件请求服务,为自己服务。所以,操作系统的内核代码运行在三种上下文之间。

Trap or Exception Context

Chapter 1 described how user-mode code can request an OS service by trapping into kernel mode. When a kernel-mode routine executes, it may be because a user-mode application or service caused a hardware or software exception, or trap, to occur. In this case, the context of the kernel-mode code is largely that of the user code that caused the exception. The memory seen by kernel-mode code includes the same view as seen by the requesting user-mode thread.

第一章讲了用户模式代码是如何通过陷入内核模式来使用系统服务的。当用户模式代码引发一个软件中断或其它方式调用系统服务时,内核代码被执行。这时,内核代码的上下文是用户模式代码的上下文。例如,当用户线程向I/O管理器请求服务时,I/O管理器就是运行在用户线程的上下文。而I/O管理器一般这把这个请求转交给设备驱动,所以设备驱动程序运行在用户线程的上下文。

When a user-mode thread makes a direct request of the I/O Manager, the I/O Manager executes within the context of the requester. In turn, the I/O Manager may call a dispatch routine within a device driver. Dispatch routines of a driver therefore execute within this exception context.

Interrupt Context

When the hardware (or software) generates an acknowledged(承认; 告知收到; 对...打招呼; 答谢 ) interrupt, whatever code is executing within the system is stopped dead in its tracks. The executing context is saved and control is promptly(敏捷地; 迅速地 ) handed over to a service routine appropriate for the kind of interrupt that occurred.

当硬件(或软件)产生的中断请求得到响应时,CPU进入中断处理的上下文。中断处理的上下文与被打断的代码上下文一般是不相干的。中断请求的服务代码不对页表作任何假设(KEMIN:因为不会用到?)。用户模式的缓冲存储器(buffers)在中断处理的上下文必须是不可用的。运行在中断处理的上下文的代码(包括硬件驱动代码)也不对当前进程作任何假设。

Clearly, the context of the executing code at the time of the interrupt is irrelevant and arbitrary. Kernel-mode code servicing the interrupt cannot make any assumptions about the state of the page tables. User-mode buffers must be considered unavailable in this context. Code running in interrupt context (which includes the bulk of driver routines) can make no assumptions about the current process or thread.

Kernel-Mode Thread Context

The final possibility is that a piece of code runs in the context of a separate kernel thread. Some drivers spawn separate threads to deal with devices that require polling or to deal with specialized timeout conditions. These kernel-mode threads are not significantly different from user-mode threads described in Win32 programming books. They execute when scheduled by the kernel's scheduler, in accordance with the assigned thread priority.

最后一种是内核线程独立拥有的上下文。有一些驱动程序需要一些独立的辅助线程来处理那些需要轮询访问或处理超时的设备。作为一种线程,内核线程其实与用户线程区别并不大,它们也像用户线程一样被内核调度器进行调度运行。

Like the interrupt context, kernel-mode thread context can make no assumption about the current process or thread. The state of the page tables is largely arbitrary as seen by the thread. Chapter 14 discusses the use of kernel-mode threads.

不过内核线程执行的上下文与中断处理的上下文类似,不对当前进程作任何假设。(KEMIN:总的来说,内核线程是有点怪,这样理解吧,如果用户线程和中断服务分别完成不同性质的任务的话,内核线程介它们之间完成另一任务,嗯,任务任务,很好!)

参考

分享到:
评论

相关推荐

    有了程序,如何跑程序?

    ### 如何运行程序:从Java程序的编译与执行说起 对于初学者而言,了解如何在计算机上运行程序是一项基本且重要的技能。特别是在面对诸如Java这样的编程语言时,掌握其编译与执行流程尤为重要。本篇文章将从一个简单...

    什么叫C语言指针?C语言的特征是什么?附带详细解析.docx

    1. 访问动态内存:在程序运行时,我们可能需要分配或释放内存。指针允许我们保存内存块的地址,从而能够自由地操作这块内存。 2. 传递参数:在函数调用中,使用指针作为参数可以避免复制大型数据结构,提高程序效率...

    如何提高ABAP程序运行效率.pdf

    "如何提高ABAP程序运行效率.pdf" 在SAP系统中,ABAP程序的运行效率对系统的整体性能有着至关重要的影响。因此,了解如何提高ABAP程序的运行效率是非常必要的。本文将从ABAP程序的编写技巧、I/O操作、内存占用、CPU...

    嵌入式应用程序开发中的脱机运行问题

    ### 嵌入式应用程序开发中的脱机运行问题详解 #### 一、引言 随着技术的发展,嵌入式系统的应用场景越来越广泛,从简单的微控制器到复杂的嵌入式操作系统都有其身影。对于嵌入式应用程序而言,能否在目标硬件上...

    论程序设计方法(牛人写的)

    如何能节省一个字节,如何能提高程序运行的效率,这些都是要严肃考虑的问题。而所谓的程序的易读性,程序的可维护性根本不在考虑范围之内。 二、结构化程序设计 随着计算机的价格不断下降,硬件环境不断改善,运行...

    禁止该程序和与之相关联的程序运行

    动态HOOK则是在程序运行时插入代码,更常见的是使用API Hook,如SetWindowsHookEx函数。API Hook可以捕获和修改系统API的调用。这种方法灵活性强,可以应用于未有源码或者不熟悉的库。具体步骤包括:创建一个替代...

    C++程序设计实践教程-马光志-习题答案

    - **加载时间**:静态连接在程序启动前完成,而动态连接在程序运行时完成。 - **内存占用**:静态连接可能导致多个程序共享相同的代码段在内存中多次加载,而动态连接可以实现代码的共享。 - **执行速度**:静态...

    windows在内存启动exe程序

    PE加载器负责解析.exe文件的结构,加载必要的资源,设置执行上下文,并将控制权交给程序的入口点。然而,有一种更底层的技术,允许我们在不依赖PE加载器的情况下,直接在内存中启动.exe程序。这种技术通常用于系统...

    叫爹的恶搞程序~

    "叫爹"可能是程序在运行时会触发的一种特定反应,比如播放特定声音或显示特定消息,以此来达到整人的效果。 【描述】:“这个是个恶搞程序,整人是不错的~!代码也很简单,可以来学习一下” 描述中提到,这个恶搞...

    微信小程序滴滴拼车小程序小程序源码(源码+源码导入视频教程+源码导入文档教程)小程序精选源码亲测可用

    教程会详细指导如何设置项目、配置文件、解决依赖问题以及运行和测试小程序。 "详细图文文档教程.doc" 可能包含了更详尽的开发步骤、注意事项、技术细节,以及可能遇到的问题解决方案。这种文档对于初学者来说特别...

    “叫爸爸”可直接运行的文件.vbs

    “叫爸爸”可直接运行的文件

    华中科技大学计算机学院C++课后习题答案

    动态绑定是程序运行之中完成的,应用程序在执行过程中激活由编译程序生成的通过静态或动态方式连接的一段代码,计算函数的入口地址并填写到相应的函数调用处。 1.4 什么叫封装?提供封装机制有什么好处?答:封装是...

    应用程序守护程序

    【应用程序守护程序】是一种软件设计模式,用于确保关键应用程序始终处于运行状态,即使在异常情况下如程序崩溃或意外退出,也能自动恢复其运行。这种技术常用于系统服务、后台进程或者对稳定性要求极高的应用中。在...

    单片机烧写是什么?什么叫单片机烧写?

    在单片机启动时,引导程序会先运行,检查特定条件,如果满足烧写新程序的条件,就从外部接口接收数据并写入ROM;如果不满足,就跳转到用户程序开始正常执行。例如,AVR单片机的Bootloader功能和STC单片机的串口下载...

    超仿抖音小视频的微信小程序.zip

    8. **性能优化**:学习如何优化小程序的加载速度和运行效率,如合理使用懒加载、减少网络请求、缓存策略等。 通过这个开源项目,开发者不仅可以学习到微信小程序的开发技能,还能了解到短视频平台的架构设计和用户...

    Java并发编程面试题

    * 什么叫线程安全? * servlet是线程安全吗? * 在Java程序中怎么保证多线程的运行安全? 并发理论 * Java内存模型 * Java中垃圾回收有什么目的? * finalize()方法什么时候被调用? 重排序与数据依赖性 * 为...

    用C#写的蜘蛛程序也叫小偷程序

    蜘蛛程序之所以是半自动的,是因为它总是需要一个初始链接(出发点),但此后的运行情况就要由它自己决定了,蜘蛛程序会扫描起始页面包含的链接,然后访问这些链接指向的页面,再分析和追踪那些页面包含的链接。...

    什么是网络爬虫?有什么用?怎么爬?终于有人讲明白了.pdf

    搜索引擎离不开爬虫,比如百度搜索引擎的爬虫叫作百度蜘蛛(Baiduspider)。百度蜘蛛每天会在海量的互联网信息中进行爬取,爬取优质信息并收录,当用户在百度搜索引擎上检索对应关键词时,百度将对关键词进行分析...

    排队叫号机程序

    - 通过循环计数器和定时器控制各个操作的时间间隔,保证程序运行的稳定性。 ### 5. 应用场景与扩展性 此类排队叫号机通常应用于银行、医院等需要有序管理排队流程的场所,可以有效提高服务效率,减少客户等待时间...

    第3章--运算符和表达式练习题答案-华中社《C语言程序设计上机指导与练习》.doc

    2. 什么叫常量?什么是变量? 答:常量就是在程序的运行过程中该量是不可修改的量,变量在程序的运行过程中允许对该变量的值进行修改。 二、填空题 1. 整型变量占用多少字节? 答:4字节 2. 203的二进制表示是...

Global site tag (gtag.js) - Google Analytics