浅墨浓香

想要天亮进城,就得天黑赶路。

导航

2016年2月1日

摘要: 21.1 动态TLS 21.1.1 为什么要使用线程局部存储 编写多线程程序的时候都希望存储一些线程私有的数据,我们知道,属于每个线程私有的数据包括线程的栈和当前的寄存器,但是这两种存储都是非常不可靠的,栈会在每个函数退出和进入的时候被改变,而寄存器更是少得可怜。假设我们要在线程中使用一个全局变量, 阅读全文

posted @ 2016-02-01 10:57 浅墨浓香 阅读(610) 评论(0) 推荐(0) 编辑

2015年12月21日

摘要: 20.4 函数转发器(1)函数转发器原理(下图是利用Dependency Walker打开Kernel32.dll得到) ①图中CloseThreadpool*等4个函数转发到NTDLL中相应的函数中去了,但我们调用CloseThreadpool*等函数时,exe会被动态地链接到Kernel32.... 阅读全文

posted @ 2015-12-21 22:55 浅墨浓香 阅读(781) 评论(0) 推荐(0) 编辑

2015年12月2日

摘要: 20.3 延迟载入DLL20.3.1延迟载入的目的(1)如果应用程序使用了多个DLL,那么它的初始化可能比慢,因为加载程序要将所有必需的DLL映射到进程的地址空间。→利用延迟加载可将载入过程延伸到执行过程时(2)如果我们的代码调用的操作系统的一个新函数,但程序又试图在老版本的操作系统运行。这时程序会... 阅读全文

posted @ 2015-12-02 23:44 浅墨浓香 阅读(1830) 评论(0) 推荐(1) 编辑

2015年11月27日

摘要: 20.1 DLL模块的显式载入和符号链接20.1.1 显式载入DLL模块(1)构建DLL时,如果至少导出一个函数/变量,那么链接器会同时生成一个.lib文件,但这个文件只是在隐式链接DLL时使用(显示链接时并没有用到这文件)(2)显式载入DLL的函数:LoadLibrary(Ex) 参数含义pCTS... 阅读全文

posted @ 2015-11-27 22:26 浅墨浓香 阅读(1779) 评论(0) 推荐(0) 编辑

2015年11月21日

摘要: 19.1 DLL和进程的地址空间(1)DLL的优缺点 ①有利于节省内存,多个进程能同时使用一个DLL,即在内存中共享DLL的单个拷贝,这节省了内存并减少了文件交换 ②促进了资源的共享,DLL里能够包含诸如对话框模版、字符串、图标以及位图之烊的资源。多个应用程序可以使用DLL来共享这些资源。 ③... 阅读全文

posted @ 2015-11-21 18:53 浅墨浓香 阅读(662) 评论(0) 推荐(0) 编辑

2015年11月8日

摘要: 18.1 进程的默认堆(1)堆的特点 ①不必考虑分配粒度和页面边界问题,但分配和释放内存的速度比其他方式慢 ②堆是系统从页交换文件中预订的一块地址空间,系统会负责调拨和撤销调拨物理存储器。(2)进程默认堆 ①进程初始化时,系统会在进程地址空间中一个特殊的区域,这个区域为进程的默认堆(默认为1M... 阅读全文

posted @ 2015-11-08 11:45 浅墨浓香 阅读(588) 评论(0) 推荐(0) 编辑

2015年11月7日

摘要: 17.8 稀疏调拨的内存映射文件17.8.1 稀疏文件简介(1)稀疏文件(Sparse File):指的是文件中出现大量的0数据,这些数据对我们用处不大,但是却一样的占用空间。NTFS文件系统对此进行了优化,那些无用的0字节被用一定的算法压缩起来。例如声明一个很大的稀疏文件(如100GB),这个文件... 阅读全文

posted @ 2015-11-07 17:25 浅墨浓香 阅读(2181) 评论(0) 推荐(0) 编辑

2015年10月31日

摘要: 17.4映射到内存的可执行文件和DLL(1)EXE文件格式节名作用.text.exe和.dll文件的代码.data己经初始化的数据.bss未初始化的数据.reloc重定位表(装载进程的进程地址空间).rdata运行期只读数据.CRTC运行期只读数据.debug调用试信.xdata异常处理表.tls线... 阅读全文

posted @ 2015-10-31 21:45 浅墨浓香 阅读(1675) 评论(0) 推荐(0) 编辑

2015年10月22日

摘要: 17.1 操作系统的内存管理(1)内存管理基础 ①虚拟内存函数:主要用于预留/提交/释放虚拟内存,在虚拟内存页上改变保护方式、锁定虚拟内存页,以及查询一个进程的虚拟内存等操作,是一组位于底层的函数。 ②堆管理函数:相对比较高级一点。Win32中的堆分为两种,一种是进程的“默认堆”,默认堆只有一个... 阅读全文

posted @ 2015-10-22 08:53 浅墨浓香 阅读(5322) 评论(0) 推荐(1) 编辑

2015年10月17日

摘要: 16.1 线程栈及工作原理(1)线程栈简介 ①系统在创建线程时,会为线程预订一块地址空间(即每个线程私有的栈空间),并调拨一些物理存储器。默认情况下,预订1MB的地址空间并调拨两个页面的存储器。 ②调整线程栈的默认大小可以使用编译选项或#pragma指令,具体用法视编译器不同,VC下可以使用 /... 阅读全文

posted @ 2015-10-17 20:07 浅墨浓香 阅读(922) 评论(0) 推荐(0) 编辑

2015年10月7日

摘要: 15.6 改变保护属性(1)VritualProtect函数参数描述PVOID pvAddress指向要修改属性的内存基地址SIZE_T dwSize区域的大小,以字节为单位DWORD flNewProtectPAGE_*(除PAGE_WRITECOPY、PAGE_EXCUTE_WRITECOPY外... 阅读全文

posted @ 2015-10-07 22:06 浅墨浓香 阅读(612) 评论(0) 推荐(1) 编辑

2015年10月6日

摘要: 15.1 预订(Reserve)地址空区域 (1)VirutalAlloc(pvAddress,dwSize,fdwAllocationType,fdwProtect) ①PVOID pvAddress参数:内存地址,要预订的地址空间中的哪一块。 A.这个参数也说明也该函数是较底层函数的原因,因为可 阅读全文

posted @ 2015-10-06 17:47 浅墨浓香 阅读(785) 评论(0) 推荐(0) 编辑

2015年10月3日

摘要: 14.4 确定地址空间的状态14.4.1 查询内存状态API (1)VirtualQuery(Ex)函数参数描述HANDLE hProcess要查询的另一个进程的句柄。(注意,这个参数只有VirtualQueryEx才有,VirtualQuery只能查本进程的信息)LPCVOID pvAddress... 阅读全文

posted @ 2015-10-03 16:47 浅墨浓香 阅读(972) 评论(0) 推荐(0) 编辑

2015年10月2日

摘要: 14.1 系统信息(1)获取系统信息GetSystemInfo函数中的SYSTEM_INFO参数字段描述WORD wProcessorArchitecture或wReserved联合体。为今后扩展而保留,请勿使用DWORD dwPageSize表示CPU页面的大小。在x86和x64机器中,该值为4K... 阅读全文

posted @ 2015-10-02 21:00 浅墨浓香 阅读(828) 评论(0) 推荐(0) 编辑

2015年9月29日

摘要: 13.1 Windows的虚拟地址空间安排13.1.1虚拟地址空间的分区(即虚拟地址空间布局)进程的地址空间划分分区x86 32位Windows3GB用户模式下的x8632位WindowsX64 64位WindowsIA-64 64位Windows空指针赋值区0x0000 00000x0000 FF... 阅读全文

posted @ 2015-09-29 14:14 浅墨浓香 阅读(2884) 评论(0) 推荐(1) 编辑

2015年9月23日

摘要: 12.1 纤程对象的介绍(1)纤程与线程的比较比较线程(Thread)纤程(Fiber)实现方式是个内核对象在用户模式中实现的一种轻量级的线程,是比线程更小的调度单位。调度方式由Microsoft定义的算法来调度,操作系统对线程了如指掌。内核对线程的调度是抢占式的。由我们自己调用SwitchToFi... 阅读全文

posted @ 2015-09-23 00:09 浅墨浓香 阅读(2618) 评论(0) 推荐(1) 编辑

2015年9月20日

摘要: 11.3 私有的线程池11.3.1 创建和销毁私有的线程池(1)进程默认线程池 当调用CreateThreadpoolwork、CreateThreadpoolTimer、CreateThreadpoolWait或CreateThreadpoolIo,并使传入参数PTP_CALLBACK_ENVIR... 阅读全文

posted @ 2015-09-20 14:09 浅墨浓香 阅读(1093) 评论(0) 推荐(0) 编辑

2015年9月16日

摘要: 11.2 Win2008以上的新线程池(1)传统线程池的优缺点: ①传统Windows线程池调用简单,使用方便(有时只需调用一个API即可) ②这种简单也带来负面问题,如接口过于简单,无法更多去控制线程池的行为。(2)Windows2008新线程池及API线程池对象传统APIWin2008及以上... 阅读全文

posted @ 2015-09-16 09:40 浅墨浓香 阅读(3319) 评论(0) 推荐(3) 编辑

2015年9月13日

摘要: 第11章 Windows线程池11.1 传统的Windows线程池及API(1)线程池中的几种底层线程 ①可变数量的长任务线程:WT_EXECUTELONGFUNCTION ②Timer线程:调用CreateTimerQueueTimer时,将在Timer线程上创建以APC方式通知的可等待计时器... 阅读全文

posted @ 2015-09-13 17:01 浅墨浓香 阅读(2248) 评论(1) 推荐(0) 编辑

2015年9月11日

摘要: I/O完成端口原理见上一篇(可点击这里)10.5.4.4 利用I/O完成端口实现Socket通信(1)Accept和AcceptEx流程的比较 ①采用accept方式的流程示意图如下(普通的阻塞函数) ②采用AcceptEx方式的流程示意图如下(可工作在阻塞或非阻塞方式)、【注意】:Accept... 阅读全文

posted @ 2015-09-11 22:38 浅墨浓香 阅读(1127) 评论(0) 推荐(0) 编辑