您的位置:首页 > 其它

Windows Internals – 1.3 概念与工具之进程、线程、虚拟内存

2017-07-14 17:06 218 查看
转载请注明出处:http://cyc.wiki/index.php/2017/07/14/windows-internals-1-3/

本文表格图片均出自《Windows Internals, Seventh Edition, Part 1》,侵删。

All tables and figures are copyrighted by Windows Internals, Seventh Edition, Part 1. Please contact me to delete if there’s any violation.

Windows进程

一个Windows进程包括以下内容:

- 一个私有的虚拟地址空间,该进程可以使用的一组虚拟内存地址

- 一个可执行程序,该进程最初的代码及数据,它会被映射到虚拟地址空间中

- 一组打开的句柄,对应于各种系统资源,如信号量、同步对象、文件等

- 一个安全上下文,这是一个访问令牌,标识了用户、安全组、权限等信息

- 一个进程ID,这个进程的唯一标识符

- 至少一个执行的线程

在Windows 10中,查看Windows正在运行的进程一般使用任务管理器。

在“进程”一页可以看到正在运行的应用、后台任务、系统服务等所对应的进程,以及其所包含的子进程。

而“详细”一页对应于Windows 7时代的任务管理器,用最原始的方式显示了进程名、进程号、状态等信息。

值得一提的是,Windows进程没有像Linux系统中进程树的组织形式,对于任何的Windows进程,系统只会记住它的父进程ID,其它的关系并不会保留。

例如进程A中创建了进程B,进程B中创建了进程C。如果先kill掉进程B,然后对进程A进行“结束进程树”操作,进程C将不受影响。所以Windows中描述的“进程树”含义并不准确,更准确的描述应该是进程的“父子对”。

线程

一个线程包括以下内容:

- 一组CPU寄存器的内容,表示了当前的处理器状态

- 两个栈,分别用于内核态和用户态

- 一个私有存储空间(thread-local storage,TLS),供子系统、运行时库、动态链接库等使用

- 一个线程ID,线程ID也不会与进程ID冲突

前三项也被称为线程的上下文(Context),对于不同的硬件架构会有不同的实现。

通常来说,线程调度是在内核态完成,频繁切换线程是一个很费资源的操作。为此Windows还提供了两种用户态的线程调度机制:纤程(Fiber)和用户态调度(User-mode scheduling, UMS)线程。这两种技术都不常用,所以就不详细介绍了。

进程与线程的组织结构如下图:



上面的VAD是虚拟地址描述符(virtual address descriptors),是用于记录这个进程用到的虚拟地址段。

中间的Handle Table就是句柄列表,指向了各种内核对象,如信号量、同步对象、文件等。

虚拟内存

Windows基于线性的地址空间实现了虚拟内存机制,使得每个进程仿佛能拥有自己私有的大的地址空间。在运行的时候,内存管理器会将每一页(通常大小为4KB)的虚拟内存空间对应到物理内存或磁盘文件上,并在缺页时把文件中的页调回物理内存中。

对于32位系统,总共的虚拟地址空间理论上是4GB(因为
sizeof(void*) == 4
,2^32 = 4GB),高地址段的2GB会被留给系统本身使用,低地址段的2GB才是留着应用使用。所以在32位系统中,应用进程所能拥有的最大内存空间就是2GB。

对于64位系统,理论的虚拟地址空间达到了16EB(因为
sizeof(void*) == 8
,2^64 = 16EB),在Windows 8.1+系统中,高地址段的128TB会保留给系统使用,低地址段的128TB会给应用使用,中间还有一大段是未映射的地址段。当然,要用上这些地址段至少你得有256TB的内存,所以目前来说就不用考虑了。

这一章剩下的内容比较零散,我自己能写的心得也不多,所以就不往下写了。

下一篇直接进入正题写第二章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  windows