
Windows核心编程
程序猿快跑
这个作者很懒,什么都没留下…
展开
-
Windows核心编程 - 用内核对象进行线程同步
在上一篇文章Windows核心编程-用户模式下的线程同步中已总结了用户模式下的几种同步机制,它们的特点就是速度快,但也有些局限性。那么与用户模式的同步机制相对的,可以使用内核对象进行同步,既然是内核对象,那么就涉及到用户模式与内核模式切换,所以内核对象同步机制的缺点是会有性能问题,但它们的用途会更广一些,例如可以实现进程间的同步。 同步,其实是一方A需要感知另一方...原创 2019-04-20 23:11:57 · 229 阅读 · 0 评论 -
Windows核心编程 - 在应用程序中使用虚拟内存(1)
Windows提供了以下三种机制来对内存进行操控:1)虚拟内存:最适合用来管理大型对象数组或大型数据结构数组;2)内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据;3)堆:最适合用来管理大量的小型对象。 Windows提供了一些用来操控虚拟内存的函数,通过这些函数可以直接预订地址空间区域、给区域调拔(来自页交换文件的)物理存储...原创 2019-05-07 08:15:53 · 364 阅读 · 0 评论 -
Windows核心编程 - 进程
1. 进程,一般定义为是一个可执行程序的运行实例,它由以下两部分组成:1)一个内核对象,操作系统利用它来管理进程;2)一个地址空间,其中包含所有可执行文件或DLL模块的代码和数据,此外,还包括了动态分配的内存,比如线程堆栈和堆。 一个进程可以有多个线程,所有的线程都在进程的地址空间中执行代码。因此,每个线程都有它自己的一组CPU寄存器和堆栈。每个进程至少要有一个线程来...原创 2019-05-19 23:01:55 · 377 阅读 · 0 评论 -
Windows核心编程 - 内存映射文件(2)
2. 映射到内存的数据文件 这种方法最大的优点是让系统为我们处理所有与文件缓存有关的操作,我们不必关心分配内存、 把文件中的数据载入内存,把数据 写回文件、以及释放内存等操作,不过如果 操作过程被打断,比如断电,数据可能被破坏。 要使用内存映射文件,需执行以下步骤: 1) 创建或打开一个文件内核对象, CreateFile() 2) 创建一个文件映射内核对象...原创 2019-05-14 23:47:17 · 157 阅读 · 0 评论 -
Windows核心编程 - 在应用程序中使用虚拟内存(2)
接着上一篇Windows核心编程 - 在应用程序中使用虚拟内存(1)4. 何时调拔物理存储器 假设正在实现一个电子表格的应用程序,需要一个CELLDATA结构来描述单元格的内容。一种最简单的方式使用二维数组这种数据结构来实现,数组的优点是访问速度快,但缺点是意味着程序一开始运行就需要从页交换文件中分配大量的物理存储器,但实际上用户通常只会使用少数的单元格,造成内存的浪费。 ...原创 2019-05-07 23:31:44 · 171 阅读 · 0 评论 -
Windows核心编程 - 内存映射文件(3)
1. 用内存映射文件来处理大文件 方法就是只映射文件的一个视图,这个视图只包含文件的一小部分数据。比如一开始时,把文件开关的部分映射到视图中,完成对视图的访问后,撤销这一部分的映射,再把文件的另一部分映射到视图,重复此过程,直至完成对整个文件的访问。2.内存映射文件和一致性 系统允许把同一个文件中的数据映射到多个视图中。例如把一个文件的前10KB映射到一个视图A,把同一...原创 2019-05-15 23:51:04 · 260 阅读 · 1 评论 -
Windows核心编程 - 作业
有时候我们需要将一组进程当作一个单体来处理,另外,也可能需要限制某个进程所能访问的资源。Windows提供了一个称为作业 (job)的内核对象,它允许我们将进程组在一起并创建一个“沙箱”来限制进行能够做些什么。 那么我们可以将作业理解成一个进程的容器。如果一个进程已经与一个作业关联,则该进程及它的所有子进程都无法从作业中去除掉,这个安全特性可以保证进程无法摆脱对它施加的限制。 ...原创 2019-05-22 00:33:18 · 257 阅读 · 0 评论 -
Windows核心编程 - 线程栈
当系统创建线程时,会为线程栈预订一块地址空间(每个线程都有自己的栈), 并给区域调拔一些物理存储器。 默认会预订1MB的地址空间并给区域项部(即地址最高)的两个页面调拔存储器。在让线程开始执行之前,系统会把线程栈的指针指向区域顶部的那个页面的末尾(该地址非常接近0x08100000)。这个页面就是线程开始使用栈的地方。区域顶部往下的第二个页面被称这防护页面,随着线程调用越来越多的函数,调用...原创 2019-05-12 23:38:50 · 192 阅读 · 0 评论 -
Windows核心编程 - 堆
堆是什么? 堆,也是一种操控内存的方法,它非常适合分配大量的小型数据,与虚拟内存、内存映射文件相比,是用来管理链表和树的最佳方式。但,堆的缺点是分配和释放内存块比其它方式要慢。在系统内部,堆是一块预订的地址空间区域,堆管理器所调拔的物理存储器是从页交换文件中分配的。释放堆中的内存块时,堆管理器会撤销已调拔的物理存储器。1.进程的默认堆 所谓默认堆是指进程初始化时,...原创 2019-05-17 08:44:27 · 314 阅读 · 1 评论 -
Windwos核心编程 - 线程调度、优先级和关联性(1)
1. 上下文 每个线程都有一个上下文(Context),上下文保存在线程的内核对象中,这个上下文反映了线程上一次执行时的CPU寄存器状态。Window大约每隔20ns会扫描所有的线程的内核对象,然后在可调度的线程中挑一个,并将该线程上次保存在线程上下文的值转入CPU寄存器,这一过程称为上下文切换。2.线程的挂起和恢复 在线程内核对象中有一个值表示线程的挂起计数,当线程...原创 2019-05-26 23:52:25 · 156 阅读 · 0 评论 -
Windows核心编程 - 线程基础
1. 线程介绍 每个进程至少有一个线程,线程有两个组成部分:1)线程内核对象, 操作系统用它来管理线程,同时用来存放线程统计信息。2)线程栈,用于维护线程执行时所需的所有函数参数和局部变量。 假设进程有多个线程,那么这些线程共享该进程的地址空间。进程比线程使用更多的系统资源,例如创建一个虚拟的地址空间需要大量系统资源,加载.exe和.dll到地址空间,需要占用系统 的文件...原创 2019-05-23 00:35:28 · 139 阅读 · 0 评论 -
Windows核心编程 - 线程调度、优先级和关联性(2)
1. 线程的执行时间 一个能够返回线程已获得CPU时间量的函数 :GetThreadTimes(), 要获取高精度的性能函数:QueryPerformanceFrequency()、QueryPerformanceCounter()2.在实际上下文中谈CONTEXT结构 系统使用CONTEXT结构记住线程的状态,这样线程在下一次获取CPU运行时间时,就可从上一次...原创 2019-05-27 23:33:25 · 202 阅读 · 0 评论 -
Windows核心编程 - 结构化异常处理
使用 结构化异常处理(SEH)可以增加程序的健壮性,因为这个机制可以保证我们的程序在运行的过程中,如果出现了问题,系统会捕获这个问题异常,并通知到程序,程序就可作相应的处理。SEH包含两方面的功能:终止处理和异常处理。 终止处理程序的语法如下:__try{ //Guarded body ......}__finally{ //Terminatio...原创 2019-05-19 00:29:18 · 260 阅读 · 0 评论 -
Windows核心编程 - 内存映射文件(1)
内存映射文件主要用于以下三种情况:1)系统使用内存映射文件来载入并运行.exe和动态链接库DLL文件。这大量节省了页交换文件的空间以及应用程序 启动的时间。 2)开发人员可以用内存映射文件来访问磁盘上的数据文件,这可以避免直接对文件进行I/O操作和对文件内容进行缓存。 3)可以在同一台机器上的不同进程之间共享数据。是最高效的方法。1. 映射到内存的可执行文件和DLL...原创 2019-05-13 23:35:25 · 326 阅读 · 1 评论 -
Windows核心编程 - 在应用程序中使用虚拟内存(3)
6.改变保护属性 如果想要在应用程序中定位一个比较难发现的缺陷,可利用改变已调拔的物理存储页面的保护属性的方式。例如有一段管理链表的代码,并且链表中的节点数据是保存在一个已预订的区域中。可以这样来设计链表相关的处理函数:在处理函数的开关将物理存储页的保护属性置为PAGE_READWRITE, 在处理函数结束前将保护属性置为PAGE_NOACCESS。这样可避免链表的数据受到程序中...原创 2019-05-08 23:41:41 · 175 阅读 · 0 评论 -
Windows核心编程 - 线程池
Windows提供了一个线程池机制来简化线程的创建、销毁及管理工作。有以下情形可使用线程池:1. 以异步的方式来调用一个函数; 1)首先定义一个回调函数,函数原型: void NTAPI SimpleCallback( PTP_CALLBACK_INSTANCE pInstance, PV...原创 2019-04-25 23:32:55 · 219 阅读 · 0 评论 -
Windowns核心编程 - 纤程
纤程的出现是为了将UNIX应用程序移植到Windows,纤程是在用户模式下实现的,所以内核无法对纤程进行调度,只能根据定义的算法对纤程进行调度。一个线程可以包含一个或多个纤程,内核会对线程进行调度,但线程一次只能执行一个纤程的代码。下面是一些纤程的相关函数及用法。1)使用纤程的第一个步骤是将一个已有的线程转换为一个纤程,使用函数 :PVOID ConvertThreadToFibe...原创 2019-04-26 23:45:21 · 158 阅读 · 0 评论 -
Windows核心编程 - 同步设备I/O 与异步设备I/0
1. I/O设备 Windows支持的常见I/O设备包括有文件、目录、逻辑磁盘驱动器、物理磁盘驱动器、串口、并口、邮槽、管道、套接字、控制台。但对Windows系统层面来说,不太关心具体设备是为哪一种,将设备都抽象成是“文件”,对设备的操作即是对文件进行操作。常用的打开设备的API函数有:CreateFile()、CreateNamedPipe()(命令管道)、CreatePipe()(...原创 2019-04-23 00:01:19 · 299 阅读 · 0 评论 -
Windows核心编程 - Windows内存体系结构(4)
1. 写时复制 PAGE_WRITECOPY和PAGE_EXECUTE_WRITECOPY这两个保护属性存在的目的是为了节省内存和使用页交换文件。Windows支持一种机制,允许两个或两个以上的进程共享同一块存储器。让应用程序实例共享相同的存储页极大地提升了系统的性能,但另一方面,也要求所有的应用程序实例只能读取其中的数据 或是执行其中的代码。如果某个应用程序实例修改并写入一个存储页...原创 2019-05-01 23:18:25 · 748 阅读 · 0 评论 -
Windows核心编程 - Windows内存体系结构(1)
1. 进程的虚拟地址空间 每个进程都会有自己的虚拟地址空间,对于一个32位的进程来说,它拥有4GB(2的32次方, 字节)大小的地址空间。对于一个64位的进程来说,它拥有16EB大小的地址空间。每个进程的地址空间是相互隔离的,当进程内的各个线程在执行时,只能访问自己进程内的内存,无法访问其它进程的内存。即进程A的线程无法访问进程B的地址空间的数据结构,反之亦然。 但实际上,进程并...原创 2019-04-27 23:47:10 · 281 阅读 · 0 评论 -
Windows核心编程 - 异步I/O之接收I/O请求完成通知
在上一篇文章Windows核心编程 - 同步设备I/O 与异步设备I/0 中提到了接收I/O请求通知的以下几种方法:1)触发设备内核对象:允许一个线程发出I.O请求,另一个线程对结果进行处理;2)触发事件内核对象: 允许向一个设备同时发出多个I/O请求, 允许 一个线程发出I/O请求,另一个线程对结果进行处理;3)使用可提醒I/O:允许向一个设备同时发出多个I/O请求, ...原创 2019-04-23 23:57:18 · 254 阅读 · 0 评论 -
Windows核心编程 - Windows内存体系结构(2)
1. 地址空间中的区域 当系统创建一个进程时,该进程的地址空间大部分是闲置的或是尚未分配的。如果想使用这部分地址空间,必须调用VirtualAlloc来分配其中的区域(region),分配区域的操作称为预订(reserving)。 当应用程序预订地址空间区域时,系统会确认区域的起始地址正好是分配粒度的整数倍,分配粒度因不现的CPU平台而不同,目前所有CPU平台...原创 2019-04-28 23:57:13 · 131 阅读 · 0 评论 -
Windows核心编程-用户模式下的线程同步
1.原子访问 原子访问指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。相关的Interlocker函数有如下:1)InterlockedExchangeAdd2)InterlockedExchangeAdd643)InterlockedIncrement4)InterlockedExchange5)InterlockedExch...原创 2019-04-19 23:47:26 · 158 阅读 · 0 评论 -
Windows核心编程 - 探索虚拟内存
1. 系统信息 操作系统中有很多参数是由系统所运行的主机所决定的,如页面大小和分配粒度等,可使用GetSystemInfo函数来获取与主机相关的参数。为了让32位应用程序能够在64位版本Windows上运行,Microsoft提供了一个称为Windows 32-bit On Windows 64-bit的模拟层,称为WOW64。当32位应用程序在WOW64上运行时,调用GetSystem...原创 2019-05-04 23:44:17 · 218 阅读 · 0 评论 -
Windows核心编程 - 异步I/O之完成端口
1. 背景 构建一个服务应用程序,常用的主要有两种模型: 串行模型和并行模型。 1)串行模型: 一个线程等待一个请求,当请求到达时,线程被唤醒对请求进行处理;处理完后再接着等待下一个请求。 缺点:不能同时处理多个请求。 2)并行模型:一个线程等待一个请求,当请求到达时,线程会创建一个新的线程来处理请求。然后线程进入下一次循环等待下一个请求。新...原创 2019-04-24 23:26:10 · 224 阅读 · 0 评论 -
Windows核心编程 - Windows内存体系结构(3)
1. 物理存储器和页交换文件 如今的操作系统能让磁盘空间看起来像内存一样,磁盘上的文件一般被称为页交换文件,其中包含虚拟内存,可供任何进程使用。页交换文件以一种透明的方式增大了应用程序可用内存的总量。 当一个线程试图访问所属进程的地址空间中的一块数据时,有可能会出现两种情况: 1)线程要访问的数据就在内存中,这种情况下,CPU会先把数据的虚拟地址映射到物理地址,接...原创 2019-04-29 23:37:57 · 455 阅读 · 0 评论 -
Windows核心编程 - 总结
原创 2019-05-28 23:54:16 · 369 阅读 · 0 评论