![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Windows核心编程
文章平均质量分 70
mxzy55560593
这个作者很懒,什么都没留下…
展开
-
第一章:错误处理
1:DWORD GetLastError();获得一个32位错误码,这个错误码被存储在TLS中,所以错误码是线程相关的2:vc调试器中,可以在Watch窗口中输入$err,hr查看错误码和错误信息3:可以利用FormatMessage函数将错误码转换为错误信息4:可以原创 2011-07-30 09:18:34 · 446 阅读 · 0 评论 -
第三章:内核对象
1:内核对象只是一个内存块,这个内存块是一个数据结构,只能由操作系统访问,程序通过调用API控制他,创建一个内核对象会返回一个Handle,在32位系统下是32位的一个值,在64位系统下是64位的一个值,Handle是进程相关的2:内核对象所有者是操作系统,所以其生命周期可能会比进程长,内核对象数据结构中有个使用计数,创建是被初始化为1,当变成0后,内核对象被操作系统删除3:每个内核对象都原创 2011-07-30 17:46:58 · 745 阅读 · 0 评论 -
第四章:进程
1:一个进程由两部分组成,1是进程内核对象,这也是操作系统保存进程统计信息的地方,2是一个地址空间;线程在进程上下文中运行,每个线程都有自己的一组CUP寄存器和堆栈2:系统会根据连接器开关寻找_tWinMain()或者_tmain(),并调用相应的C/C++运行库启动函数,后者调用_tWinMain()或者_tmain(),如果没有指定连接器开关,则会去搜索_tWinMain()或者_tmai原创 2011-08-01 23:22:03 · 470 阅读 · 0 评论 -
第十章:同步设备IO与异步设备IO
1:概念1.1:设备是能与之通信的任何东西,如文件,套接字等2:CreateFile()HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,原创 2011-08-14 16:33:37 · 1065 阅读 · 0 评论 -
第十八章:堆
1:基础1:堆就是一块预订的地址空间区域,系统会根据请求调拨物理存储器,堆很适合管理小型对象,使用堆不必理会分配粒度和页面大小2:堆是进程相关的,一个进程可以有多个堆,默认堆的大小为1M,默认堆是线程安全的,所以如果一个进程只有一个线程,为了略微提高性能,应该创建自己的堆原创 2011-08-26 22:54:33 · 968 阅读 · 0 评论 -
第十七章:内存映射文件
以后写~~原创 2011-08-26 22:35:07 · 318 阅读 · 0 评论 -
第十六章:线程栈
1:基础1:线程初始化时,线程栈默认1M,所有页面都是PAGE_READWRITE属性,但只为前两个页面调拨了物理存储器,地址低的那个页面叫防护页面,为其指定了PAGE_GUARD属性2:当线程访问到防护页面时,由于指定了PAGE_GUARD属性,系统会得到通知,系统会为原创 2011-08-26 21:43:11 · 722 阅读 · 0 评论 -
第十五章:在应用程序中使用虚拟内存
1:预订LPVOID VirtualAlloc( LPVOID lpAddress, //可为NULL,也可以指定一个地址,系统会自动向下取整到64KB整数倍 SIZE_T dwSize, //系统自动向上取整到页面大小整数倍 DWORD flAlloc原创 2011-08-25 20:31:56 · 554 阅读 · 0 评论 -
第十三章:Windows内存体系结构
1:分区1:0x00000000~0x0000FFFF为空指针赋值分区,占64KB0x00010000~0x7FFEFFFF用户模式分区,DLL和内存映射文件也在这一分区0x7FFF00000~0x7FFFFFFF为64KB禁入分区2:64位Windows用户模式原创 2011-08-24 19:53:20 · 717 阅读 · 0 评论 -
第十四章:探索虚拟内存
1:获得系统信息1:GetSystemInfo()能够获得当前页面大小和分配粒度2:32位程序可通过WOW64(Windows 32-bit On Windows 64-bit模拟层)运行在64位系统下3:检查程序是否运行在WOW64中:BOOL IsWow64P原创 2011-08-24 22:49:44 · 712 阅读 · 0 评论 -
第十一章:线程池
暂缓原创 2011-08-24 19:31:28 · 379 阅读 · 0 评论 -
第十章:IO完成端口
1:创建IO完成端口1:线程数量等于CPU数量时效率最高2:线程的创建是有开销的,所以应该使用线程池3:创建函数:HANDLE CreateIoCompletionPort( HANDLE FileHandle, HANDLE ExistingC原创 2011-08-22 23:01:27 · 898 阅读 · 1 评论 -
第九章:用内核对象进行线程同步
1:同用户模式下的线程同步的区别可以跨进程进行同步,但速度慢,一个空的系统调用大约占200个CPU周期,但用内核对象进行同步比用户模式同步慢几个数量级的根本原因是伴随调度新线程而来的刷新高速缓存和错过高速缓存2:等待函数2.1:WaitForSingleObject(原创 2011-08-12 23:02:11 · 878 阅读 · 0 评论 -
第八章:用户模式下的线程同步
1:Interlocked系列函数1.1:Interlocked系列函数都提供64位版本,以下文字不将64位版本函数,具体请参考书上1.2:Interlocked系列函数在x86平台下工作原理是在总线上维持一个硬件信号,这个信号会阻止其他CPU访问同一个内存地址1.3原创 2011-08-07 23:57:28 · 1573 阅读 · 0 评论 -
第五章:作业
1:作业是指将一组进程看成一个整体来管理,通过作业可以同时关闭一组进程.作业也可以给予进程一些平时不能施加的限制,比如控制作业中进程CPU占用时间,内存占用量等等原创 2011-08-06 02:14:12 · 380 阅读 · 0 评论 -
第七章:线程调度,优先级和关联性
1:基础1.1:每个线程都有个上下文,存储了线程寄存器状态,windows每隔20ms左右查看所有的线程内核对象,找到其中一个可调度线程,将它的上下文载入CPU寄存器,这个过程被称为context switch,Windows会记录每个线程运行的次数Windows是抢占式原创 2011-08-07 18:19:22 · 964 阅读 · 0 评论 -
第六章:线程基础
1:线程基础进程有进程内核对象和地址空间,而线程则是线程内核对象和线程栈之所以线程比进程高效,是因为进程地址空间要占用很多资源用于记录,并且.exe和.dll文件要加载到地址空间,还要用到文件资源原创 2011-08-06 02:30:18 · 608 阅读 · 0 评论 -
第二章:字符处理
/*TCHAR;LPTSTR;LPCTSTR;*/TCHAR szBuf1[100]={0};TCHAR szBuf2[100]={0};//获得字符串长度//SIZE_T nLen=strlen(szBuf1);SIZE_T nLen=_tcslen(szBuf1); //如果在UNICODE下,"中国"此函数返回2,所以如果要得到其字节数,要*sizeof(TCHAR)原创 2011-07-30 09:21:02 · 4472 阅读 · 0 评论