进程

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. 9.4classtest rewrite(仓库管理系统)

    第一部分,设计界面以及类的定义. import java.util.Scanner; public class viovo { static int number = 5;//五个商品信息 stati ...

  2. docker网络配置:bridge模式、host模式、container模式、none模式

    在docker平台里有四种网络模式,今天继续分享一下它们的常用知识,进一步加深对docker技术的理解. 1.docker网络模式分类 docker run创建Docker容器时,可以用--net选项 ...

  3. 使用 pdf.js 通过文件流方式加载pdf文件

    关于Pdf.js的基础知识,请参考我的博客  使用 pdf.js 在网页中加载 pdf 文件 使用 pdf.js 跨域问题的处理方法 上面两篇博客中介绍的内容都是基于直接加载远程服务器中静态PDF文件 ...

  4. Secure Face Matching Using Fully Homomorphic Encryption-2018:学习

    本文学习论文"Secure Face Matching Using Fully Homomorphic Encryption-2018"和"基于全同态加密的人脸特征密文认 ...

  5. Linux:GPU

    什么是GPU? CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景.CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处 ...

  6. Ubuntu20.04配置CuckooSandbox环境

    Ubuntu20.04配置CuckooSandbox环境 因为最近要做恶意软件分析,阅读论文发现动态分析的效果普遍比静态分析的效果要好一些,所以需要搭建一个动态分析的环境,查阅资料发现Cuckoo S ...

  7. datagrip中调用oracle存储过程

    declare mess varchar2(300); begin P_DETAIL_PROC(参数1,...,mess); DBMS_OUTPUT.PUT_LINE(mess); end; P_DE ...

  8. [译] WinForms:分析一下(我用 Visual Basic 写的)

    原文 | Klaus Loeffelmann 翻译 | 郑子铭 如果您从未看过电影<分析这一点>,下面是简短的介绍:假设一个纽约家族的成员有可疑的习惯,他决定认真考虑接受治疗以改善他的精神 ...

  9. 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

    九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...

  10. Redis如何查看服务状态、关闭和启动

    一.查看Redis服务状态 Linux命令: 查看redis服务进程,是否已经启动 1.ps -ef | grep redis 2.ps -aux | grep redis 3.netstat -tu ...