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.
- 一个私有的虚拟地址空间,该进程可以使用的一组虚拟内存地址
- 一个可执行程序,该进程最初的代码及数据,它会被映射到虚拟地址空间中
- 一组打开的句柄,对应于各种系统资源,如信号量、同步对象、文件等
- 一个安全上下文,这是一个访问令牌,标识了用户、安全组、权限等信息
- 一个进程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就是句柄列表,指向了各种内核对象,如信号量、同步对象、文件等。
对于32位系统,总共的虚拟地址空间理论上是4GB(因为
对于64位系统,理论的虚拟地址空间达到了16EB(因为
这一章剩下的内容比较零散,我自己能写的心得也不多,所以就不往下写了。
下一篇直接进入正题写第二章。
本文表格图片均出自《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系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式
- Windows系统的四个重要概念——进程、线程、虚拟内存、内核模式和用户模式
- java 孙鑫 第五课 Java 的多线程,程序、进程和线程的概念
- linux网络编程(一)——程序、进程和线程的概念
- GCD(一) ---- 进程、线程、队列、同步、异步 概念区分与使用
- 线程的概念、线程与进程比较
- 内核线程、轻量级进程、用户线程三种线程概念解惑(线程≠轻量级进程)
- 线程的概念?使用线程的好处?及线程与进程的区别?
- Android基本概念: 应用, 任务, 进程, 和线程
- 进程,线程,AppDomain的概念及关系
- [linux]进程(八)---线程概念
- 进程、线程与多线程概念详解
- 进程与线程的基本概念
- 进程和线程的概念及区别
- iOS-进程与线程概念以及iOS的三种多线程技术
- C#中多线程自我折腾之一-进程,线程的基本概念
- 线程与进程的概念、使用
- JAVA学习笔记49——线程概念+进程、线程区别+创建进程三种方法
- 多线程(1)------- 程序、进程、线程的概念
- 深入浅出进程与线程的基本概念