一. 进程和线程
进程是一个程序的实例,是静态的;进程不会运行,是线程的容器。
组成部分:
一个核心态的对象,操作系统用来保存进程的信息;
地址空间:包含可执行文件和所有动态链接库的代码和数据,以及动态分配的内存。
进程的终止:
终止之后windows会释放进程所使用的内存、句柄等所有资源。
进程终止方式:
主线程入口函数返回;
进程主动退出,一个线程调用ExitProcess这个API;
进程被动终止,另一个进程抵用了TerminateProcess;
进程中的所有线程都终止;
任务管理器中的结束任务和结束进程;
线程:
创建一个进程的上下文中,在进程的地中空间中运行;
线程是动态的,一个进程至少有一个线程;
进程中的所有线程共享进程的地址空间;
组成部分:
一个核心态的对象,操作系统用来保存线程的信息;
线程堆栈:用于存放线程运行时的函数参数和局部变量等;
线程的运行:
当一个进程初始化时,系统会创建这个进程的主线程;
这个线程最初执行C/C++运行时间库的启动代码,这些启动代码会调用程序的入口函数;
GUI进程有一个主UI线程,处理纤细循环和用户交互,如果这个线程被挂起或忙于处理任务,应用程序会失去响应;
工作线程没有界面,在后台工作,例如分析数据、数据库操作;
线程的终止:
线程函数返回;线程调用ExitThread;其他线程调用TerminateThread;该线程所在进程终止。
线程调度:Context Switch
下面的事件会出发操作系统的线程调度
一个线程进入ready状态;一个线程离开运行状态;一个线程的优先级改变;一个线程的processor affinity(指定处理器)改变。
线程优先级:windows使用32个优先级级别,线程优先级有进程优先级和线程优先级共同决定。
线程同步
二. 内存管理
进程的虚拟地址空间:32位地址上,进程的虚拟地址空间是4G;缺省情况下,用户态和核心态虚拟地址空间各占2GB,个进程的用户地址空间相互独立。
调节用户态空间大小,应用程序的二进制文件的文件头上要有LARGERADDRESSWARE标志次啊能访问高于2GB的用户态地址空间。
用户态虚拟地址空间的状态:free,reserving,committed。
进程使用的内存:
priviate bytes:进程的虚拟地址空间中已分配的内存,不包括和其他进程共享的内存;
virtual bytes:()
working set:进程所使用的物理内存的大小(很多代码是放在pagefiles中的)
内存映射文件:
操作系统使用内存映射文件来装载.exe和.dll文件;操作保留一段虚拟地址空间,把一个文件中的一部分映射到这段地址空间;这样内存映射文件可以处理大文件,每次只把一部分文件内容衣舍到进程的地址空间;
物理内存和paging file:
paging file用来保存进程正在使用的修改过的内存,这部分内容在很长一段时间内不会被cpu使用,相当于内存扩展。
缺页处理:将访问的内容从扩展的虚拟内存中督导物理内存中。这个过程对应用程序是透明的。
线程堆栈:reserve 1MB,commit 2 page
堆:分配小块的内存heapcreate
集成使用内存的类型总结:
虚拟内存;内存映射文件;堆;堆栈;
三. 动态链接库
DLL中的内容:函数、数据结构、资源等;
DLL不能直接运行,必须被装载到一个进程中;
DLL被映射到
DLL的入口函数:下面的事件发生时会调用DLL的入口函数
进程装载;进程卸载;进程创建新线程;线程终止;
DLL装载的两种类型:
load-time dynamic linking:编译器将可执行文件所需的dll的名字放在可执行文件头的import中。
run-time dynamic linking:应用程序运行之后调用LoadLibrary这个API装载DLL,操作系统定位并装载DLL。用GetProcAddress获得DLL的输出函数地址,并使用这些函数。
DLL的搜索顺序:
注册表键值safedllsearchmode决定
knownDLL
DLL Hook:
应用程序注册hook可简史一些特定的事件。Hook DLL被装载到其他进程里,一旦遇到上述事件,HookDLL会执行相应的hook过程。一些恶意软件会用这种方法窃取用户输入的用户名和密码。
四. 异常处理
应用程序可能遇到异常,若应用程序没有处理这些异常,应用程序会崩溃;
异常处理过程:
先查找有没有debug工具;然后查找有没有处理异常的函数;操作系统调用一个API记录;
windows error reporting;
小结:(一个UI程序运行实例)
运行一个UI应用程序app.exe;
进程的创建和地址空间的创建;
装载所需的DLL;
主线程启动消息循环;
点击open file按钮,win32api调用,call stack,I/O;
打开文件,内存分配,句柄;
关闭文件,异常,非法操作;