进程

Windows作为多任务操作系统,允许多个程序同时在系统中运行。这些程序被称为进程,进程运行在一片独立的空间中,受到操作系统保护,操作系统的很多资源都是围绕着进程来进行分配,可以理解为操作系统维度下资源分配的最小粒度.

一个进程由两部分构成

  1. 一个内核对象

    内核对象保存进程的各种统计信息,操作系统依靠这些统计信息对进程进行管理
  2. 一个空间地址

    包含了exe,dll的代码和数据,以及线程栈与堆。

在Windows操作系统中,进程拥有如下资源(节选):

  1. 一片虚拟地址,也就是进程空间
  2. PID

    即ProcessId
  3. Image

    即将程序加载到内存并使其能够运行所需的所有信息,也就死exe在内存中的表示
  4. 线程

    1-N个线程数量
  5. EPROCESS(Executive Process Block)

    位于内核态,记录着内核态的关键信息
  6. 句柄表

    位于内核态,记录进程所创建/打开的内核对象。
  7. DirBase

    进程的起始基地址
  8. PEB(Process Environment Block)

    位于用户态,记录着用户态的关键信息
  9. Access token

    表示进程的用户,安全组以及优先级

眼见为实

  1. SessionId

    指进程所在的windows会话Id,当多个用户登录时,有不同的会话Id
  2. Cid/ParentCid

    即PID,以及创建该进程的那个进程Id

眼见为实:句柄表

即ObjectTable

眼见为实:Token

EPROCESS,内核态数据结构

每一个进程都会持有一个EPROCESS的结构,如果一个档案一样记录着进程的所有信息。上面所展示的信息,本质上就是对EPROCESS信息的提取

眼见为实

PEB,用户态数据结构

包含了进程的用户态信息,与EPROCESS位于内核态不同,PEB是先在内核态中创建,再映射到用户态之中

眼见为实

进程空间

操作系统为了保护进程的安全,为不同的进程分配了独立的进程空间虚拟地址。目的旨在一个进程的代码与数据不会受到其它进程的修改,它们之间互相隔离。

32位系统进程空间

64位系统进程空间

内核态与用户态

Windows定义了两种访问模式,用户模式(user mode)与内核模式(kernel mode).

应用程序运行在user mode下,操作系统运行的kernel model下,他们之间互相隔离,无法直接访问,即便应用程序知道了在内核态中的某个数据的正确指针,也会被终止访问。

虽然不可以直接访问,但Windows提供了一道桥梁,用于程序可以通过调用Win32 API来间接的访问内核态。

眼见为实

线程

如果把操作系统比作一个国家,那么进程就是这个国家的家庭,而线程则是家庭的成员。

懒惰的进程

进程是非常懒惰的,从不执行任何东西,它只是线程与统计信息的一个容器,具体的工作需要由线程来执行。

从上面的比喻也可以看出,家庭是一个抽象的概念,家庭的成员才是物理意义上的执行单位。

臃肿的进程

从上面的介绍可以看出,进程使用的资源会更多,其原因在于地址空间。

为一个进程创建一个虚拟地址空间需要大量资源。

  1. 大量的日志记录

    这需要用到大量内存
  2. 加载文件

    加载exe,dll到内存中,也是消耗大户

相比之下,线程所使用的资源就要少得多了。一个线程实际上只有一个内核对象和一个栈。也不涉及日志记录。

与进程类似,线程也由两个部分组成

  1. 线程的内核对象

    内核对象保存线程的各种统计信息,操作系统依靠这些统计信息对线程进行管理
  2. 一个线程栈

    用于维护线程执行时所需要的函数参数与局部变量

ETHREAD,内核态数据结构

与EPROCESS结构来描述进程内核态的信息一样,线程也有一个类似的结构。名字叫做ETHREAD

ETHREAD的结构也很庞大,包含着线程各种属性。其中第一行的TCB(Thread Control Block)信息尤为重要,里面的字段主要是供内核调度线程时使用。

ETHREAD 结构字段太多了,一般使用!thread来简化输出。

PEB,用户态数据结构

与描述进程用户态信息的PEB一样,NT内核定义了线程环境块(Thread Environment Block)来描述线程的用户态信息。

主要有用户态的栈空间,异常信息,线程本地存储等

创建进程的流程

  1. 打开执行文件,确定其名称,类型等前置资料,类似于C#中的EEClass
  2. 为新进程创建EPROCESS,进程空间,PEB
  3. 创建初始线程,状态为susepend

    这被称为主线程,然后这个线程会去创建更多的线程
  4. 通知CSRSS,类似新生儿上户口
  5. 初始线程开始执行
  6. 线程执行初始化动作,主要是加载依赖的dll

Windows核心编程 进程与线程的更多相关文章

  1. 【windows核心编程】远程线程DLL注入

    15.1 DLL注入 目前公开的DLL注入技巧共有以下几种: 1.注入表注入 2.ComRes注入 3.APC注入 4.消息钩子注入 5.远线程注入 6.依赖可信进程注入 7.劫持进程创建注入 8.输 ...

  2. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

  3. Windows核心编程 第九章 线程与内核对象的同步(上)

    第9章 线程与内核对象的同步 上一章介绍了如何使用允许线程保留在用户方式中的机制来实现线程同步的方法.用户方式同步的优点是它的同步速度非常快.如果强调线程的运行速度,那么首先应该确定用户方式的线程同步 ...

  4. Windows核心编程&进程

    1. 进程的定义 说白了进程就是一个正在运行的执行程序,包含内核对象和独立的地址空间,内核对象负责统计和管理进程信息,地址空间包括所有可执行文件或DLL 模块的代码和数据.动态内存分配(线程堆和栈的分 ...

  5. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  6. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  7. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  8. Windows核心编程:第4章 进程

    Github https://github.com/gongluck/Windows-Core-Program.git //第4章 进程.cpp: 定义应用程序的入口点. // #include &q ...

  9. 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。

    windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...

  10. 用户模式下的线程同步的分析(Windows核心编程)

    线程同步 同一进程或者同一线程可以生成许多不同的子线程来完成规定的任务,但是多个线程同时运行的情况下可能需要对某个资源进行读写访问,比如以下这个情况:创建两个线程对同一资源进行访问,最后打印出这个资源 ...

随机推荐

  1. 将maven项目打包上传到私服

    1. 配置私服账户密码 在maven 的setting.xml 中配置用户名和密码: <servers> <server> <username>deployment ...

  2. Intellij IDEA开发环境中Springboot项目无Run ****main()的菜单

    问题描述: Intellij  IDEA开发环境中Springboot项目无Run ****main()的菜单. 解决办法有以下几种: 方法1:Idea无右键run选项, 无法通过main方法启动sp ...

  3. WorldWind源码剖析系列:漫游时四叉树瓦片类QuadTile的运行思路

    用户在窗口漫游时,需要加载精细的高程和纹理数据时的处理思路:当用户漫游时直到窗口相机的视场角的1/2小于(瓦片大小*瓦片绘制距离的乘积)时,才初始化四叉树瓦片类QuadTile,或者加载本地缓存中的数 ...

  4. 开源即时通讯IM框架MobileIMSDK的Uniapp端开发快速入门

    ► 相关链接: ①MobileIMSDK-Uniapp端的详细介绍 ② MobileIMSDK-Uniapp端的开发手册new(* 精编PDF版) 一.理论知识准备 您需要对Uniapp和Vue开发有 ...

  5. 如何快速在本地运行你vue打包的的dist文件

    要在本机启动运行前端提供的dist包,需要先安装一个HTTP服务器,例如Apache,Nginx,phpstudy.这里以使用Node.js的http-server为例进行说明 首先,确保已经安装了N ...

  6. 一款简单易用的印章设计工具 --(可转为ofd文件)

    本人开发了一款印章设计软件:不但可以将印章保存为图片,而且可以保存为ofd格式文件. 将印章保存为ofd格式,有很多优势:占用资源少.缩放不失真.可添加元数据. 矢量化图形格式一般为svg.pdf.很 ...

  7. x86平台SIMD编程入门(3):浮点指令

    1.算术指令 算术类型 函数示例 备注 加 _mm_add_sd._mm256_add_ps 减 _mm_sub_sd._mm256_sub_ps 乘 _mm_mul_sd._mm256_mul_ps ...

  8. w3cschool-OpenResty 最佳实践

    https://www.w3cschool.cn/openresty1/ OpenResty 简介 OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器.它打包了 ...

  9. Permutation Swaps

    Permutation Swaps 传送门 题目理解 第一个操作:把第i个数移到位置p[i](1<=i<=n) ​发现:这个操作其实就是循环移位,有Teleporter的经验在前,此操作可 ...

  10. TCP/IP协议栈封装解封装过程

    发送方将用户数据提交给应用程序把数据送达目的地,整个数据封装流程如下: 用户数据首先传送至应用层,添加应用层信息: 完成应用层处理后,数据将往下层传输层继续传送,添加传输层信息(如TCP或UDP,应用 ...