Windows内核--任务、进程和线程(2.4)

news/2024/7/24 9:40:06 标签: windows, windows kernel, kernel

                                                图片来自: Windows内核原理与实现

Windows内核有"任务"概念吗?

        从技术术语来说,Windows内核并没有"任务"。"任务"一般被认为是抽象的需要执行的事情。在不同操作系统上,"任务"所代表的官方名称有所差异。

        Linux "struct task" 符合"任务"的中文描述

        Windows Process/Thread表述"任务"的容器和实体

                        Process的集合称为Job

                        Process是静态资源, 可执行的"任务"被称为Thread.

        macOS有任务术语, 代表一个线程组集合,Mach将任务中的每个线程一一映射到BSD层的进程。

除了线程,还有什么方式可以让内核做事情?

        一般来说,操作系统以线程为调度单位。Linux的"task"很像线程, 以task为调度单位和线程类似。

        在Windows上,有如下几种方式:

  • (最基本的方式)应用程序创建自己的线程
  • 驱动程序和执行体给调用者进程创建线程
  • System进程创建系统线程。
  • Work Item机制
    • 因线程切换本身占用资源,内核提供Work Item机制将事情交给系统辅助线程帮忙。函数ExQueueWorkItem和IoQueueWorkItem就为了完成Work Item而产生。

进程和线程的关系

        Windows内核对于进程和线程的区分是很明显的,不像Linux, 进程可能和线程很像兄弟。

        进程是静态资源集合

                进程包含了私有地址空间、句柄表和线程等讯息,它相当于一个容量,把程序执行该要的资源都放在里面。但它,没能力执行,因为内核不会调度进程运行(参见本页最上图片)。

        线程是真正调度单位

                在某些书籍上,线程被称为"控制流"。按照传统代码执行的3要素,数据/代码和堆栈。数据和代码都在线程所属进程资源包含,线程不用特别关心。堆栈是和线程控制流息息相关,具体分来有用户栈和内核栈两种。

                用户态堆栈容易理解,用户应用程序创建后必然有堆栈保存当前状态,内核栈用于线程切入到内核态后需要暂存的讯息,也是必须的。

进程和线程创建和消亡

        创建进程默认创建一个线程(主线程)

                CreateProcess源代码

                        

                        参见: Windows内核--CreateProcess到内核NtCreateProcess(2.3) 

        线程退出是通过APC实现

                

                

        进程的最后一个线程结束进程才结束吗?

                不是,如果主线程提前结束了,整个进程就结束了。如此设计避免仅留的子线程无处安放。可参考main函数反汇编,编译器会在函数最后插入exit等函数终结进程。

父进程和子进程

        Windows父进程和子进程不像类Unix内核那样,如此正式隆重。Windows平台,父进程创建子进程之后,其实父进程就可以该干嘛去干嘛了。子进程结束与否和它没什么必然关系了。

        父进程存在的意义?

                类似面向对象继承,子进程继承父进程属性,可减少额外的复制动作。比如CreateProcess函数参数bInheritHandles可继承句柄信息.

        桌面双击一个应用程序A

                父进程是explorer.exe, 此进程A和explorer进程有什么关系呢? 从界面上看,没任何关系。

                explorer进程终止后,A还能继续运行吗? A和explorer进程似乎完全没关联。

        子进程终结,父进程还会收到通知吗?

                如上示例, A终结后,explorer会收到通知吗?Windows内核把进程当作同步对象,同步对象终结会发出信号,只会通知等待此对象的内核对象。一般来说,explorer创建进程A之后,不会等待A结束的信号,父进程不会收到通知。

Job(作业)

        如上所说,一批进程当成整体处理,可以加入到Job。Job和进程或线程一样也是内核对象,可以管理:

  • 进程的处理器亲和性
  • 工作集最大和最小值
  • ......

        Job在Windows的应用

                哪些情况下通过作业来处理?有什么优势?Job可以有效管理一系列进程,控制在指定的范围内。对于需要有效准确管控系统程序运行有很大作用。比如,避免某个进程占用太多CPU导致关键进程失败。

纤程Fiber

        Windows还提供一种特殊的"线程", 被称作纤程,是用户模式线程。

        它在Kernel32.dll中实现,Fiber不是内核对象,调度需要用户调用。正因为如此,它被称为轻量级线程,它没有线程切换带来的开销,当然有用户层切换带来的微小开销。


http://www.niftyadmin.cn/n/31444.html

相关文章

Win10下使用WSL2

打包 wsl --export Ubuntu-20.04 E:\Ubuntu\ubuntu.tar.gz 注销之前 wsl --unregister Ubuntu-20.04 导入 wsl --import Ubuntu-20.04 E:\Ubuntu\ E:\Ubuntu\ubuntu.tar.gz --version 2 设置默认登陆用户为安装时用户名 ubuntu2004.exe config --default-user dwb 更新清…

【Linux】编辑器——vim的使用

环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹vim的基本概念vim是什么?vim是一款多模式的编辑器,是vi的升级版本,在兼容vi指令的同时,还带有一些新的特…

洛谷入门篇的相关题解

CF616A Comparing Two Long Integers 思路: 因为数字可能含有前导零,所以先对两个数字进行去除前导零的操作,操作后的两个数字如果位数相同,再逐位比较,否则,位数多的那个数字大于位数少的那个数字. 参考代…

API自动化测试【postman生成报告】

PostMan生成测试报告有两种: 1、控制台的模式 2、HTML的测试报告 使用到一个工具newman Node.js是前端的一个组件,主要可以使用它来开发异步的程序。 一、控制台的模式 1、安装node.js 双击node.js进行安装,安装成功后在控制台输入node…

白银k线图基础知识梳理:包覆形态

伦敦银价格走势是国际市场上所有参与者多方合力的结果,这些参与者包括银行、白银商、期货交易商、对冲基金等金融机构、各种法人机构以及个人投资者。一根简单的K线,能够把所有市场参与者博弈的结果展示出来,并且反映出银价运行和变化的各个细…

高级Spring之jdk 和 cglib 在 Spring 中的统一

Spring 中对切点、通知、切面的抽象如下 切点:接口 Pointcut,典型实现 AspectJExpressionPointcut 通知:典型接口为 MethodInterceptor 代表环绕通知 切面:Advisor,包含一个 Advice 通知,PointcutAdvisor…

华为机试题:HJ35 蛇形矩阵(python)

文章目录知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input()与list(input())的区别、及其相互转换方法2、print() :打印输出。3、算术运算符4、整型int() :将字符串或数字转换为整型…

Privacy Policy

1.Introduction 1.1.This Privacy Policy (“Policy”) explains the ways game Co. Ltd (referred to as “SuperAntApp”, “we”, “us”, or “our” in this Policy) collects, stores, uses, or otherwise processes personal data of end users of our Services as def…