KiActivateWaiterQueue函数和Queue->Header.WaitListHead队列等待列表的关系
第一部分:
if (Thread->ApcState.KernelApcPending &&
(Thread->SpecialApcDisable == 0) &&
(Thread->WaitIrql < APC_LEVEL)) {
} else {
//
// Insert wait block in object wait list.
//
InsertTailList(&Queue->Header.WaitListHead, &WaitBlock->WaitListEntry);
VOID
FORCEINLINE
InsertTailList(
IN PLIST_ENTRY ListHead,
IN PLIST_ENTRY Entry
)
{
PLIST_ENTRY Blink;
Blink = ListHead->Blink;
Entry->Flink = ListHead;
Entry->Blink = Blink;
Blink->Flink = Entry;
ListHead->Blink = Entry;
}
//LIFO队列
第二部分:
NTSTATUS
KeDelayExecutionThread (
IN KPROCESSOR_MODE WaitMode,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Interval
)
{
//
// If the current thread is processing a queue entry, then attempt
// to activate another thread that is blocked on the queue object.
//
Queue = Thread->Queue;
if (Queue != NULL) {
KiActivateWaiterQueue(Queue);
}
NTSTATUS
KeWaitForMultipleObjects (
IN ULONG Count,
IN PVOID Object[],
IN WAIT_TYPE WaitType,
IN KWAIT_REASON WaitReason,
IN KPROCESSOR_MODE WaitMode,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout OPTIONAL,
IN PKWAIT_BLOCK WaitBlockArray OPTIONAL
)
{
//
// If the current thread is processing a queue entry, then attempt
// to activate another thread that is blocked on the queue object.
//
Queue = Thread->Queue;
if (Queue != NULL) {
KiActivateWaiterQueue(Queue);
}
NTSTATUS
KeWaitForSingleObject (
IN PVOID Object,
IN KWAIT_REASON WaitReason,
IN KPROCESSOR_MODE WaitMode,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout OPTIONAL
)
{
//
// If the current thread is processing a queue entry, then attempt
// to activate another thread that is blocked on the queue object.
//
Queue = Thread->Queue;
if (Queue != NULL) {
KiActivateWaiterQueue(Queue);
}
第三部分:
FORCEINLINE
VOID
KiActivateWaiterQueue (
IN PRKQUEUE Queue
)
/*++
Routine Description:
This function is called when the current thread is about to enter a
wait state and is currently processing a queue entry. The current
number of threads processign entries for the queue is decrement and
an attempt is made to activate another thread if the current count
is less than the maximum count, there is a waiting thread, and the
queue is not empty.
N.B. It is possible that this function is called on one processor
holding the dispatcher database lock while the state of the
specified queue object is being modified on another processor
while holding only the queue object lock. This does not cause
a problem since holding the queue object lock ensures that
there are no waiting threads.
Arguments:
Queue - Supplies a pointer to a dispatcher object of type event.
Return Value:
None.
--*/
{
PRLIST_ENTRY Entry;
PRKTHREAD Thread;
PRKWAIT_BLOCK WaitBlock;
PRLIST_ENTRY WaitEntry;
//
// Decrement the current count of active threads and check if another
// thread can be activated. If the current number of active threads is
// less than the target maximum number of threads, there is a entry in
// in the queue, and a thread is waiting, then remove the entry from the
// queue, decrement the number of entries in the queue, and unwait the
// respectiive thread.
//
Queue->CurrentCount -= 1;
if (Queue->CurrentCount < Queue->MaximumCount) {
Entry = Queue->EntryListHead.Flink;
WaitEntry = Queue->Header.WaitListHead.Blink;//LIFO队列
if ((Entry != &Queue->EntryListHead) &&
(WaitEntry != &Queue->Header.WaitListHead)) {
RemoveEntryList(Entry);
Entry->Flink = NULL;
Queue->Header.SignalState -= 1;
WaitBlock = CONTAINING_RECORD(WaitEntry, KWAIT_BLOCK, WaitListEntry);
Thread = WaitBlock->Thread;
KiUnwaitThread(Thread, (LONG_PTR)Entry, 0);
}
}
return;
}
相关文章:
KiActivateWaiterQueue函数和Queue->Header.WaitListHead队列等待列表的关系
第一部分: if (Thread->ApcState.KernelApcPending && (Thread->SpecialApcDisable 0) && (Thread->WaitIrql < APC_LEVEL)) { } else { // // Insert wait block in ob…...
代码学习总结(一)
代码学习总结(一) 这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C 语言,包括题目内容,代码实现,思路,并会注明题目难度&…...
设计模式 --- 策略模式
策略模式(Strategy Pattern)是一种 行为型设计模式,用于动态切换算法或策略,使得算法可以独立于客户端变化。它通过封装算法策略并使其可互换,提升了系统的灵活性和扩展性,尤其适用于需要多种…...
c++进阶之----智能指针
1.概念 在 C 中,智能指针是一种特殊的指针类型,它封装了裸指针(raw pointer)的行为,并通过 RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制自动管理动态分配的…...
08-JVM 面试题-mk
1.JVM 的各部分组成 知道JVM 的好处:知道java 运行机制,排查问题的能力增加,比如内存泄漏、CPU飙高 JVM 是什么:Java Virtual Machine缩写,Java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行自动内存管理,垃圾回收机制从图中可以看出 JVM …...
MTK7628基于原厂的mtk-openwrt-sdk-20160324-8f8e4f1e.tar.bz2 源代码包,配置成单网口模式的方法
一、配置. 在SDK工程下,运行make kernel_menuconfig,如下图所示: Ralink Module --->选上“One Port Only”,如下图所示: 如果P0网口实现WAN口,就配置成W/LLLL,否则就配置成LLLL/W. 二、修改网口的原代…...
青少年编程与数学 02-016 Python数据结构与算法 15课题、字符串匹配
青少年编程与数学 02-016 Python数据结构与算法 15课题、字符串匹配 一、字符串匹配问题的基本概念(一)定义(二)术语 二、暴力匹配算法(Naive String Matching)(一)算法逻辑…...
基础层数据从kafka读取写入hbase的优化方案
背景: 上游kafka的topic只有一个分区,所以spark在消费的时候,无论设置的executor数有多少,最终只有一个executor在执行,如果不指定executor num的话,默认是开启两个executor,有一个executor的资源是浪费的,例如下面显示的情况,其实只有一个executor是active的状态. 在消费的时…...
thingsboard3.9.1编译问题处理
问题1: [ERROR] Failed to execute goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke (default) on project http: Execution default of goal org.thingsboard:gradle-maven-plugin:1.0.12:invoke failed: Plugin org.thingsboard:gradle-maven-plugin:1.…...
Adobe Photoshop 2025 Mac中文 Ps图像编辑
Adobe Photoshop 2025 Mac中文 Ps图像编辑 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用,通过智能抠图、自动修复、图像生成等功能,用户能够快速而精确地编辑图像。②3D编辑和动画功…...
什么是VLA
视觉-语言-动作(VLA)技术综述:迈向具身智能的未来 1. 引言 随着人工智能从单一模态感知迈向多模态交互,视觉-语言-动作(Vision-Language-Action, VLA) 技术逐渐成为连接感知、推理与物理行动的核心桥梁。V…...
数据结构:C语言版严蔚敏和解析介绍,附pdf
《数据结构:C语言版(第2版)》严蔚敏李冬梅吴伟民.pdf 《数据结构:C语言版》严蔚敏,李冬梅.pdf 《数据结构C语言第2版习题解析与实验指导》李冬梅.pdf 「《数据结构:C语言版(第2版 )》…...
C++线段树详解与实现技巧
📚 C++线段树详解与实现技巧 线段树(Segment Tree)是一种高效处理 区间查询 和 区间更新 的数据结构,时间复杂度为 O(log n)。本文结合代码实例,详解其核心原理与实现细节。 🌳 线段树结构特点 完全二叉树:使用数组存储,父子节点关系通过下标计算。区间划分:每个节…...
202527 | RabbitMQ-基础 | 队列 | Direct + Fanout + Topic 交换机 | 消息转换器
RabbitMQ RabbitMQ 架构与核心概念详解 一、整体架构图 #mermaid-svg-UTlKmvHL7RNWK6vu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-UTlKmvHL7RNWK6vu .error-icon{fill:#552222;}#mermaid-svg-UTlKmvHL7RNWK6v…...
【学习笔记】服务器上使用 nbconvert 将 Jupyter Notebook 转换为 PDF
1. 环境准备:安装必要工具 在服务器终端运行以下命令,确保依赖已安装: (1) 安装 nbconvert 和 pandoc pip install nbconvert pandoc (2) 安装 LaTeX(推荐 TeX Live) # Ubuntu/Debian sudo apt-get update sudo a…...
List、Set集合通过Stream流求和
目录 一、泛型为Integer、Long、Double、BigDecimal求和 二、泛型为实体类 对单个属性求和 对多个属性分别分组求和 并返回聚合后的对象 多字段乘积求和(基本数据类型) 多字段乘积求和(BigDecimal) 对对象中的多个字段求和…...
微软VSCode 能否击败 Cursor 和 Windsurf?
微软是否能利用平台优势和许可限制来阻止竞争对手? AI 代码编辑器之战加剧 蓬勃发展的 AI 代码编辑领域竞争日益激烈,这个最具变革性和盈利性的新技术领域正在适应相互间的竞争。Visual Studio Code 目前是最主导的代码编辑器。 “根据 Stack Overflow 调查,Visual Studi…...
VSCode会击败Cursor和Windsurf吗?
VSCode 会击败 Cursor 和 Windsurf 吗?微软能不能靠自己的地盘优势和规则限制打压对手?答案是"能",但他们真的会这么干吗? Cursor & Windsurf vs VSCode Copilot 大PKAI编程工具大战越来越激烈现在最火最赚钱的AI…...
机器学习(4)—— K近邻算法
文章目录 1. K近邻算法(K-Nearest Neighbors, KNN)原理1.1. K近邻算法是什么算法?1.2. 核心思想 2. K近邻算法的步骤2.1. 选择K值2.2. 计算距离2.3. 选择最近邻:2.4. 做出预测: 3. K值的选择4. 数据标准化5. 优缺点6. …...
深入解读 React 纯组件(PureComponent)
什么是纯组件? React 的纯组件(PureComponent)是 React.Component 的一个变体,它通过浅比较(shallow comparison)props 和 state 来自动实现 shouldComponentUpdate() 方法,从而优化性能。 核心特点 1. 自动浅比较: PureCompon…...
常见MQ及类MQ对比:Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ
常见MQ及类MQ对比 基于Grok调研 Redis Stream、Redis Pub/Sub、RocketMQ、Kafka 和 RabbitMQ 关键点: Redis Pub/Sub 适合简单实时消息,但不持久化,消息可能丢失。Redis Stream 提供持久化,适合需要消息历史的场景,但…...
202528 | RabbitMQ-高级 | 消息可靠性 | 业务幂等性 | 延迟消息
消息可靠性 RabbitMQ发送者可靠性 一、发送者重连机制 #mermaid-svg-gqr6Yr5UNZX87ZDU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gqr6Yr5UNZX87ZDU .error-icon{fill:#552222;}#mermaid-svg-gqr6Yr5UNZX87ZD…...
Java EE期末总结(第六章)
一、IoC 1、Bean装配流程 IOC装配流程在代码中的对应就体现在Service这个注解 依赖注入在代码中体现在 ,比如 Resource UserService userService 二、AOP 简化流程,为程序员简便操作 tmd编不下去了我自己看视频都没理解md不弄了; 给两个…...
ASP.NET Core 性能优化:内存缓存
文章目录 前言一、什么是缓存二、内存缓存三、使用内存缓存1)注册内存缓存服务2)注入与基本使用3)高级用法GetOrCreate(避免缓存穿透)异步方法:GetOrCreateAsync(避免缓存穿透)两种过…...
Go小技巧易错点100例(二十六)
本期分享: 1. string转[]byte是否会发生内存拷贝 2. Go程序获取文件的哈希值 正文: string转[]byte是否会发生内存拷贝 在Go语言中,字符串转换为字节数组([]byte)确实会发生内存拷贝。这是因为在Go中,字…...
《算法笔记》3.5小节——入门模拟->进制转换
1022 D进制的AB #include <iostream> using namespace std; int maxn32;int main() {int z[maxn],num0,a,b,d;cin>>a>>b>>d;int resab;do{z[num]res%d;resres/d;}while(res);for (int i num-1; i >0 ; i--) {cout<<z[i];}return 0; }问题 A:…...
【MQTT-协议原理】
MQTT-协议原理 ■ MQTT-协议原理■ MQTT-服务器 称为"消息代理"(Broker)■ MQTT协议中的订阅、主题、会话■ 一、订阅(Subscription)■ 二、会话(Session)■ 三、主题名(Topic Name&a…...
JWT认证服务与授权 .netCore
1.实现流程图 2.认证信息概述 Header:System.IdentityModel.Tokens.Jwt.JwtHeader Payload: System.IdentityModel.Tokens.Jwt.JwtPayload Issuer: http://localhost:7200 Audience: http://localhost:7200 Expiration: 2025/4/11 15:06:14 Claim - Type: http://schemas…...
编译原理 实验二 词法分析程序自动生成工具实验
文章目录 实验环境的准备实验实验预备知识分析案例所要做的任务实战 实验环境的准备 安装flex 安装MinGW MinGW Installation Manager页面 apply changes 下载比较耗时 只看到了一个文件,复制过去 配置环境变量 使用gcc -v检验是否安装完成 实验 实验预备知识…...
【C++初学】课后作业汇总复习(一)概述、输入输出、类的入门——理解封装
一、概述、输入输出、类的入门——理解封装 - 1. ab input two number output sum of a and b; #include <iostream>using namespace std;int main() {int a 0;int b 0;cin >> a >> b;cout << ab <<endl;return 0; }2.输入1~7任意一个整数&…...
数学建模:针对汽车行驶工况构建思路的延伸应用
前言: 汽车行驶工况构建的思简单理解为将采集的大量数据进行“去除干扰、数据处理,缩减至1800S的数据”,并可达到等效替换的目的,可以使在试验室快速复现;相应的解决思路、办法可应用在 “通过能量流采集设备大量采集…...
Qt 之opengl shader language
着色器示例代码 实际运行效果...
dolphinscheduler创建文件夹显示存储未启用的问题--已解决
只要修改api-server/comf/common.properties和standalone-server/conf/common.properties里面的内容就可以了,应为你要靠standalone-server这个服务启动dolphinscheduler-web,其他就算怎么改你重启dolphinscheduler的时候系统也不会识别新的common.prope…...
解密 Linux 线程:多线程编程与资源管理
个人主页:chian-ocean 文章专栏-Linux 前言: 在Linux中,线程 是一种轻量级的执行单元,它是进程的一部分。多个线程可以在同一个进程内并行执行任务,通常它们共享该进程的资源,如内存空间、文件描述符等。…...
Node.js net模块详解
Node.js 的 net 模块提供了基于 TCP 或 IPC 的网络通信能力,用于创建服务器和客户端。以下是 net 模块的核心 API 详解,包含类、方法、事件及示例。 1. 模块引入 const net require(net);2. 核心类与方法 2.1 net.Server 类 用于创建 TCP 或 IPC 服务…...
Node.js中fs模块详解
Node.js 中 fs 模块(非 Promise)API 详解 Node.js 的 fs 模块提供了同步和异步的文件系统操作。以下是非 Promise 版本的 API 详解: 1. 文件读取操作 const fs require(fs);// 异步读取文件 fs.readFile(file.txt, utf8, (err, data) >…...
Mouse without Borders – 用一套鼠标 / 键盘控制四台电脑
同时操控 2 台电脑,只需一个鼠标和键盘!完全免费,由微软官方提供 | 零度解说_哔哩哔哩_bilibili Mouse Without Borders 简介 Mouse Without Borders(无界鼠标)是由微软开发的免费键鼠共享工具,支持在局…...
《车辆人机工程-汽车驾驶操纵实验》
汽车操纵装置有哪几种,各有什么特点 汽车操纵装置是驾驶员直接控制车辆行驶状态的关键部件,主要包括以下几种,其特点如下: 一、方向盘(转向操纵装置) 作用:控制车辆行驶方向,通过转…...
使用DaemonSet部署集群守护进程集
使用DaemonSet部署集群守护进程集 文章目录 使用DaemonSet部署集群守护进程集[toc]一、使用DaemonSet部署日志收集守护进程集二、管理DaemonSet部署的集群守护进程集1.对DaemonSet执行滚动更新操作2.对DaemonSet执行回滚操作3.删除DaemonSet 一、使用DaemonSet部署日志收集守护…...
破解升腾c10,改造成下载机(第二篇:获取xterm终端)
当c10刷好华为ct3100系统后,就开始获取xterm终端,然后再安装entware. 第一步:获取xterm终端。 点击桌面左下角的工具图标 再点browser 输入百度网址,访问! 然后再将网页另存为~~~…...
浏览器多开
使用浏览器的用户功能,创建多个用户即可完成浏览器多开的需求,插件等相对独立 需要命名 然后就可以通过多个用户切换来实现多开了,不同任务选择不同用户...
使用Python实现的音符生成和节拍器程序
推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 **摘要****先决条件****设置**生成音符频率播放音符节拍器合并结论摘要 节拍器和随机音符生成器各有用途,但单独使用时功能有限。本…...
【生活相关-日语-日本-东京-留学生-搬家后或新入驻-水道局申请饮用水(1)-办理手续】
【生活相关-日语-日本-东京-搬家后-水道局申请饮用水-办理手续】 1、前言2、情况说明(1)他人代办(2)打电话(3)网络申请(4)你将会面临什么,主要步骤(5…...
PyTorch模型构造实战:从基础到复杂组合
本文通过多个示例演示如何使用PyTorch构建不同类型的神经网络模型,涵盖基础多层感知机、自定义块、顺序块以及复杂组合模型。所有代码均附带输出结果,帮助读者直观理解模型结构。 1. 多层感知机(MLP) 使用nn.Sequential快速构建一…...
【高性能缓存Redis_中间件】一、快速上手redis缓存中间件
一、铺垫 在当今的软件开发领域,消息队列扮演着至关重要的角色。它能够帮助我们实现系统的异步处理、流量削峰以及系统解耦等功能,从而提升系统的性能和可维护性。Redis 作为一款高性能的键值对数据库,不仅提供了丰富的数据结构,…...
并发编程--互斥锁与读写锁
并发编程–互斥锁与读写锁 文章目录 并发编程--互斥锁与读写锁1. 基本概念2. 互斥锁2.1 基本逻辑2.2 函数接口2.3示例代码12.4示例代码2 3. 读写锁3.1 基本逻辑3.2示例代码 1. 基本概念 互斥与同步是最基本的逻辑概念: 互斥指的是控制两个进度使之互相排斥&#x…...
Linux下Docker安装超详细教程(以CentOS为例)
前言 Docker 已成为现代应用开发和部署的标配工具。本教程将手把手教你 在 CentOS 系统上安装 Docker,涵盖从环境准备到验证安装的全流程,并解决常见问题。无论你是运维工程师还是开发者,均可快速上手。 一、环境要求 操作系统 CentOS 7 或更…...
Ubuntu 服务器版本 设置socket服务(Python)
1. 确定 Socket 类型 Socket 服务可以是: 网络 Socket:基于 TCP/UDP 协议(如 Web 服务器、API 服务)。 Unix Domain Socket:本地进程间通信(如 Docker、MySQL 默认使用)。 2. 编写一个简单的 Socket 服务示例(Python) 以 Python 为例,创建一个 TCP Socket 服务:…...
对于GAI虚假信息对舆论观察分析
摘要 生成式人工智能(Generative Artificial Intelligence, GAI)的技术革新重构了信息生产机制,但也加剧了虚假信息对舆论生态的异化风险。 关键词:生成式人工智能、虚假信息、舆论异化、智能治理 一、生成式人工智能虚假信息下…...
HTTP:三.HTTP连接
HTTP(Hypertext Transfer Protocol)是一种用于传输超文本数据的应用层协议。它是互联网上最常用的协议,用于在客户端和服务器之间传输数据。HTTP协议通常用于从Web服务器传输网页和文件到客户端浏览器,并支持其他用途,如传输API数据和传输文件。 HTTP连接是指客户端向服务…...