网站建设用几级域名合适/蚂蚁链接bt链接

网站建设用几级域名合适,蚂蚁链接bt链接,我的网站怎么做,青岛网页设计哪个公司好目录 一、线程 1.1 线程的基本概念 1.2 何时创建线程 二、线程控制 三、遍历线程 四、线程内核对象 4.1 线程上下文 4.2 暂停次数 4.3 信号 五、线程调度 5.1 什么是线程优先级 5.2 进程优先级与相对线程优先级 5.3 编程改变优先级 5.4 动态优先级的概念 一、线程…

目录

一、线程

1.1 线程的基本概念

1.2 何时创建线程

二、线程控制

三、遍历线程

四、线程内核对象

4.1 线程上下文

4.2 暂停次数

4.3 信号

五、线程调度

5.1 什么是线程优先级

5.2 进程优先级与相对线程优先级

5.3 编程改变优先级

5.4 动态优先级的概念


一、线程

1.1 线程的基本概念

        线程是进程中的一个独立控制流,它是程序运行时的调度单位,也是执行代码的基本单元。从 CPU 的角度来看,所有线程都是平等的,不会因为属于某个进程而受到特殊对待。CPU 根据线程的优先级来决定执行哪个线程,并分配相应的时间片。当一个线程的时间片用完时,CPU 会切换到下一个线程继续执行。 

        通常情况下,线程执行的代码属于某个进程,同一个进程中的所有线程共享进程的资源,包括虚拟内存空间、内核对象句柄表等。

        此外,还有一种内核线程,它的代码完全在内核空间中运行,不在我们当前的讨论范围内。每个线程都是一个独立的执行单元。

1.2 何时创建线程

通常在以下情况下需要创建线程:
- 在输入的同时需要输出(例如在显示界面的同时处理数据);
- 逻辑A的执行依赖于逻辑B的实时反馈(比如进度条的更新);
- 利用计算机的空闲时间处理一些繁重但不紧急的任务;
- 涉及大量磁盘操作的程序;
- 与网络操作相关的程序;
- 需要处理多个长时间等待的业务逻辑;
- 需要进行密集计算,并充分利用多核CPU性能的程序;
- 需要让其他进程执行自己的代码时(例如远程注入代码);

        简单来说,当某些操作可能会阻塞当前线程,而当前线程又非常重要不能被阻塞时,就需要创建新的线程。

二、线程控制

相关的线程控制函数如下:
- `CreateProcess`:创建进程。
- `OpenProcess`:打开进程。
- `ExitProcess`:退出本进程。
- `TerminateProcess`:结束其他进程。
- `SuspendThread`:暂停线程(挂起)。
- `ResumeThread`:恢复线程。

创建线程示例代码:

#include "stdafx.h"
#include <windows.h>
int g_nNum = 0;DWORD WINAPI ThreadProc(LPVOID lParam) {printf("我是线程!\n");for (int i=0;i<1000;i++){g_nNum++;}printf("%d\n", g_nNum);return 0;
}int main()
{CreateThread(NULL, NULL, ThreadProc, NULL, 0, NULL);CreateThread(NULL, NULL, ThreadProc, NULL, 0, NULL);system("pause");printf("%d\n", g_nNum);return 0;
}

三、遍历线程

        线程的遍历同样可以使用创建快照的方式,以下是遍历某一个进程线程的示例代码:

VOID ListProcessThreads(DWORD dwPID) {HANDLE hThreadSnap = INVALID_HANDLE_VALUE;THREADENTRY32 te32;//创建快照,当前操作系统的线程快照hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);if (hThreadSnap == INVALID_HANDLE_VALUE)return;//设置输入参数,结构的大小te32.dwSize = sizeof(THREADENTRY32);//开始获取信息if (!Thread32First(hThreadSnap, &te32)) {CloseHandle(hThreadSnap);   //关闭句柄return;}do {if (te32.th32OwnerProcessID == dwPID) {//显示相关信息printf("\n THREAD ID=0x%08X", te32.th32ThreadID);printf("\t base priority =%d", te32.tpBasePri);printf("\t delta priority =%d", te32.tpDeltaPri);}} while (Thread32Next(hThreadSnap, &te32));CloseHandle(hThreadSnap);
}

        这段代码的功能是列出指定进程id(通过 dwPID 参数标识)的所有线程信息。它使用了 Windows API 中的 Toolhelp32 系列函数来遍历系统中的线程,并输出每个线程的 ID 和优先级信息。 

四、线程内核对象

        线程的创建伴随着在内核中创建一个线程内核对象的过程,在线程内核对象的数据结构中包含了一些重要信息。

4.1 线程上下文

        对于CPU来说,系统里有大量线程等着被执行。CPU会依据线程的优先级,来决定先执行哪个线程,并且在执行前给它分配一定的时间片。当正在执行的线程把时间片用完了,CPU就会切换去执行其他线程,就这样循环往复,让操作系统里的线程都有机会依次执行。而在这个切换线程的过程中,就会涉及到线程环境的保存和加载操作。 

        具体来讲,当一个线程暂时不使用CPU了,它得把自己当前的执行环境保存起来,这样下次再轮到它执行的时候,就能接着之前的状态继续。相反,当一个线程即将要被CPU执行时,得先把它对应的执行环境加载到CPU里。 

        在线程的内核对象中,存在一个结构体专门用来存储当前线程的执行环境。在用户层面,我们可以借助特定的API来获取和设置线程环境 。 

 

获取线程环境的函数:

BOOL WINAPI GetThreadContext(_In_ HANDLE hThread,_Inout_ LPCONTEXT lpContext
);

 

设置线程环境的函数:

BOOL WINAPI SetThreadContext(_In_ HANDLE hThread,_In_ CONST CONTEXT* lpContext
);

`CONTEXT`结构体定义如下:

typedef struct _CONTEXT {DWORD ContextFlags;DWORD   Dr0;DWORD   Drl;DWORD    Dr2;DWORD   Dr3;DWORD   Dr6;DWORD   Dr7;FLOATING_SAVE_AREA FloatSave;DWORD   SegGs;DWORD  SegFs;DWORD  SegEs;DWORD  SegDs;DWORD  Edi;DWORD  Esi;DWORD  Ebx;DWORD  Edx;DWORDDWORDDWORDDWORDDWORDDWORDDWORDDWORDBYTE }CONTEXT;Ecx;Eax;Ebp;Eip;SegCs;  EFlags;Esp;SegSs;ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];

        可以看出,线程环境基本就是CPU在执行此线程时的寄存器信息。

4.2 暂停次数

        一个线程能够被暂停,且能被暂停多次。一个线程被暂停的次数在线程的内核对象中有记录,每暂停一次线程,暂停次数自增,每恢复一次线程,暂停次数自减,只有暂停次数为0的时候,线程才会运行起来。

4.3 信号

在创建和等待线程时会涉及信号的概念。例如:

//创建一个线程
HANDLE hThread = INVALID_HANDLE_VALUE;
CreateThread(NULL, NULL, Proc, NULL, NULL, NULL);//等待线程结束
WaitForSingleObject(hThread, -1);
//关闭句柄
CloseHandle(hThread);

        信号其实就是线程自身的一种状态。有个`WaitForSingleObject`函数,它专门用来检查这个信号状态。要是信号状态是`FALSE` ,也就是没有信号,处于非激发态,那`WaitForSingleObject`函数就会一直等着。而一旦信号状态变成`TRUE`,也就是有信号,处于激发态了,这个函数就会马上返回。就拿线程来说,当线程运行结束的时候,它的信号状态就会从没有信号的状态转变成有信号的状态。这时候,`WaitForSingleObject`函数就能等到线程结束,然后返回,程序也就可以接着去执行后续的代码了。 

        不光线程是可等待的,还有很多内核对象也是可以等待的,如下表:

五、线程调度

5.1 什么是线程优先级

(1)每个线程都有一个优先级数值,范围从0(最低)到31(最高)。

(2)当一个线程把分配给它的时间片用完了,系统就得决定接下来给哪个线程分配时间片。这时,系统会从优先级最高的线程开始,依次往低优先级查看,优先让高优先级的线程得到执行机会。 

(3)要是有个低优先级的线程正在运行,可恰好有高优先级的线程已经准备好要执行了,那系统就会马上中断低优先级线程,转而给高优先级线程分配时间片,让高优先级线程运行起来。比如说,只要系统里存在优先级为31的线程,那系统就不会去执行那些优先级在0到30之间的线程。

(4)系统刚启动的时候,会有一个特殊的线程,它的优先级是0 ,这个线程专门负责把系统内存里所有闲置的页面都清零,而且整个系统里只有这一个优先级为0的线程 。

5.2 进程优先级与相对线程优先级

        在Windows系统里,我们没办法直接去调整线程的优先级。Windows采用了一种间接的办法,它依据进程优先级以及相对线程优先级,让操作系统自己来算出线程优先级具体是多少。

        进程优先级有这么几种类型,分别是`real-time`(实时)、`high`(高)、`above normal`(高于标准)、`normal`(标准)、`below normal`(低于标准)、`idle`(最低) 。

        进程优先级就像是给这个进程里所有线程的优先级定了个大方向。之后,再结合相对线程优先级,就能确定线程真正的优先级数值。

        这里要特别注意,线程优先级是相对进程优先级而言的。要是你更改了进程优先级,虽然线程的相对优先级不会变,但是它实际的优先级数值却是会跟着改变的 。

5.3 编程改变优先级

1. 当我们使用`CreateProcess`函数创建进程时,能在它的`fdwCreate`参数里设置优先级。
2. 要是想改变进程的优先级,还可以用`SetPriorityClass`这个函数来实现。
3. 要是想知道某个进程的优先级是多少,就得调用`GetPriorityClass`函数。
4. 注意,`CreateThread`函数没有设置线程相对优先级的参数,不能通过它来设置线程相对优先级。
5. 要设置线程的优先级,得使用`SetThreadPriority`函数。
6. 要是想获取线程的相对优先级,就得调用`GetThreadPriority`函数。

5.4 动态优先级的概念

1. 由进程优先级和线程优先级算出来的优先级,我们叫它基本优先级。有时候,系统会自动提高某个线程的优先级,这么做主要有两个原因:
        (1)为了能快点响应一些紧急操作。
        (2)给那些一直没机会执行、处于“饥饿”状态的线程分配时间片。
2. 这里有几点要注意:
        (1)优先级被提高的线程,在得到时间片去执行后,它的优先级数值会自动减小,一直减到基本优先级就不再减了。
        (2)如果一个“饥饿”线程有2到3秒都没执行,它的优先级会临时变为15,等它执行完两个时间片后,优先级又会变回原来的数值。
        (3)系统自动提升优先级的范围是1到15,优先级在16到31之间的线程,系统不会去提升它们的优先级。
        (4)我们能阻止系统提升优先级:
        - 使用`SetProcessPriorityBoost()`函数,能禁止提升当前进程里线程的优先级。
        - 使用`SetThreadPriorityBoost()`函数,能禁止提升某个线程的优先级。
        - 要是想知道进程或线程有没有使用优先级提升功能,可以用`GetProcessPriorityBoost`和`GetThreadPriorityBoost`这两个函数来判断 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/72838.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python数据可视化实战:从基础图表到高级分析

Python数据可视化实战&#xff1a;从基础图表到高级分析 数据可视化是数据分析的重要环节&#xff0c;通过直观的图表可以快速洞察数据规律。本文将通过5个实际案例&#xff0c;手把手教你使用Python的Matplotlib库完成各类数据可视化任务&#xff0c;涵盖条形图、堆积面积图、…

【机器学习-分类算法】

比如将一张图片按尺寸识别分类为横向或者纵向两类就是二分类问题 设x轴为图像的宽、y轴为图像的高&#xff0c;那么把训练数据展现在图上就是这样的: 若增加更多的数据集有: 如果只用一条线将图中白色的点和黑色的点分开,那么: 分类的目的就是找到这条线,就可以根据点在线…

Docker build 会在本地产生巨大的文件

Docker build 会在本地产生巨大的文件&#xff0c; 比如 用 这个命令列出本地镜像 docker images 可见size都是很大的&#xff0c; 到docker目录下&#xff0c;看到ext4.vhdx的大小 80多G 那只能用这个命令把不用的镜像删掉了&#xff1a; &#xff08;rmi后面是镜像id&a…

台式机电脑组装---电脑机箱与主板接线

台式机电脑组装—电脑机箱与主板接线 1、机箱连接主板的跳线一般主要有USB 2.0、USB 3.0、前置音频接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四个主板跳线&#xff0c;这些跳线分别的含义如下。 RESET SW&#xff1a;机箱重启按键&#xff1b;注&#xff1a…

【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法

虚幻引擎版本&#xff1a;5.5.4 问题描述 刚创建的Third Person项目里&#xff0c;定义一个BP_Enemy蓝图&#xff0c;拖拽到场景中产生的实例会追随玩家&#xff0c;但SpawnActor产生的实例会固定不动。BP_Enemy蓝图具体设计如下&#xff1a; BP_Enemy的Event Graph ​​ 又定义…

跨平台RTSP高性能实时播放器实现思路

跨平台RTSP高性能实时播放器实现思路 目标&#xff1a;局域网100ms以内超低延迟 一、引言 现有播放器&#xff08;如VLC&#xff09;在RTSP实时播放场景中面临高延迟&#xff08;通常数秒&#xff09;和资源占用大的问题。本文提出一种跨平台解决方案&#xff0c;通过网络层…

【Linux内核系列】:动静态库详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 有些鸟儿是注定是关不住的&#xff0c;因为它们的每一片羽翼都沾满了自由的光辉 ★★★ 本文前置知识&#xff1a; 编译与链接的过程…

深度解读DeepSeek部署使用安全(48页PPT)(文末有下载方式)

深度解读DeepSeek&#xff1a;部署、使用与安全 详细资料请看本解读文章的最后内容。 引言 DeepSeek作为一款先进的人工智能模型&#xff0c;其部署、使用与安全性是用户最为关注的三大核心问题。本文将从本地化部署、使用方法与技巧、以及安全性三个方面&#xff0c;对Deep…

【详细解决】pycharm 终端出现报错:“Failed : 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

昨天在终端一顿操作后突然打开pycharm时就开始报错&#xff1a; 无法将“Failed”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1 Failed to act…

【电路笔记】-D型触发器

D型触发器 文章目录 D型触发器1、概述2、主从D触发器3、使用D型触发器进行分频4、D触发器作为数据锁存器5、透明数据锁存器6、总结D型触发器是一种改进的置位-复位触发器,通过增加一个反相器来防止S和R输入处于相同的逻辑电平。 1、概述 D型触发器克服了基本SR NAND门双稳态电…

智慧共享杆:城市智能化管理的 “多面手”

智慧共享杆&#xff1a;城市智能化管理的 “多面手” 在智慧城市建设的进程中&#xff0c;智慧共享杆凭借其多功能与集约化的特性&#xff0c;逐渐成为城市基础设施建设领域的重点关注对象。它不仅革新了传统路灯杆的固有模式&#xff0c;更为城市的高效管理与便捷服务开创了全…

Microchip AN1477中关于LLC数字补偿器的疑问

最近在学习Microchip的AN1477关于LLC的功率级传递函数推导及数字补偿器设计&#xff0c;对其中的2P2Z数字补偿器的系数有一些困惑。我在MATLAB中运行了源程序提供的VMC_LLC.m文件&#xff0c;发现有些地方和AN1477中的结果不一致。现在把相关有疑问的地方列举出来&#xff0c;也…

云盘搭建笔记

报错问题&#xff1a; No input file specified. 伪静态 location / {if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last;break;} } location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; break; } } 设…

如何打造安全稳定的亚马逊采购测评自养号下单系统?

在当今的电商领域&#xff0c;亚马逊作为全球领先的在线购物平台&#xff0c;其商品种类繁多&#xff0c;用户基数庞大&#xff0c;成为了众多商家和消费者的首选。而对于一些需要进行商品测评或市场调研的用户来说&#xff0c;拥有一个稳定、安全的亚马逊账号体系显得尤为重要…

笔记本电脑关不了机是怎么回事 这有解决方法

在快节奏的现代生活中&#xff0c;笔记本电脑已成为我们工作、学习和娱乐的得力助手。在使用电脑的过程中&#xff0c;笔记本电脑突然关不了机了&#xff0c;怎么回事&#xff1f;下面驱动人生就来讲一讲笔记本电脑不能正常关机的解决方法&#xff0c;有需要的可以来看看。 一、…

【动态规划篇】91. 解码方法

91. 解码方法 题目链接&#xff1a; 91. 解码方法 题目叙述&#xff1a; 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; “1” -> ‘A’ “2” -> ‘B’ … “25” -> ‘Y’ “26” -> ‘Z’ 然而&#xff0c;在解码已编码的消息时&#xff0c;你…

使用【docker】+【shell】脚本半自动化部署微服务项目

一.前言 以下是一个基于 ‌Docker Shell脚本‌ 的半自动化部署方案&#xff0c;包含镜像构建、容器管理、网络配置和日志监控等核心功能&#xff0c;适用于大多数Web应用或微服务项目。 二‌.目录结构 三.脚本代码实现 1.‌Shell脚本实现 (deploy.sh) #!/bin/bash# 设置颜…

win10搭建opengl环境搭建并测试--输出立方体球体和碗型并在球体上贴图

参照本文档可以完成环境搭建和测试&#xff0c;如果想要快速完成环境的搭建可以获取本人的工程&#xff0c;包括所用到的工具链和测试工程源码获取&#xff08;非免费介意务下载&#xff09;&#xff1a;链接: https://pan.baidu.com/s/1H2ejbT7kLM9ore5MqyomgA 提取码: 8s1b …

CIR-Net:用于 RGB-D 显著性目标检测的跨模态交互与优化(问题)

摘要 问题一&#xff1a;自模态注意力优化单元和跨模态加权优化单元什么意思&#xff1f; 1 优化中间件结构的作用 位置&#xff1a;位于编码器和解码器之间 输入&#xff1a;编码器提取的RGB特征&#xff0c;深度特征以及RGB-D特征。 输出&#xff1a;经过优化的RGB&…

【正点原子K210连载】第七十六章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第七十六章 音频FFT实验 本章将介绍CanMV下FFT的应用&#xff0c;通过将时域采集到的音频数据通过FFT为频域。通过本章的学习&#xff0c;读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节&#xff1a; 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…