Windows核心编程:第7章 线程调度、优先级和关联性
Github
https://github.com/gongluck/Windows-Core-Program.git
//第7章 线程调度、优先级和关联性.cpp: 定义应用程序的入口点。
//
#include "stdafx.h"
#include "第7章 线程调度、优先级和关联性.h"
//线程函数
DWORD WINAPI ThreadProc(PVOID param)
{
return 0;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
//线程的挂起和恢复
HANDLE hthread = CreateThread(nullptr, 0, ThreadProc, nullptr, CREATE_SUSPENDED, nullptr);
DWORD suspendcount = SuspendThread(hthread);//返回线程的前一个挂起计数
suspendcount = ResumeThread(hthread);//返回线程的前一个挂起计数
BOOL bret = SwitchToThread();//当前线程放弃调度,返回是否有其他可调度线程(低优先级的饥饿线程也会调度)
Sleep(0);//当前线程放弃调度,但是低优先级的饥饿线程不会调度
FILETIME c, e, k, u;
bret = GetThreadTimes(hthread, &c, &e, &k, &u);//获取线程时间
//(更)精确的时间计算
LARGE_INTEGER start, end;
bret = QueryPerformanceCounter(&start);//时钟次数
LARGE_INTEGER frequency;
bret = QueryPerformanceFrequency(&frequency);//时钟频率
bret = QueryPerformanceCounter(&end);
double time = (double)(end.QuadPart - start.QuadPart) / (double)frequency.QuadPart;
//黑科技GetThreadContext、SetThreadContext
//进程优先级
STARTUPINFO si = { 0 };
si.cb = sizeof(si);
PROCESS_INFORMATION pi = { 0 };
bret = CreateProcess(TEXT("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE"), nullptr, nullptr, nullptr, FALSE, CREATE_SUSPENDED|NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &pi);
bret = SetPriorityClass(pi.hProcess, BELOW_NORMAL_PRIORITY_CLASS);//修改进程优先级
DWORD priority = GetPriorityClass(pi.hProcess);
//线程优先级
bret = SetThreadPriority(pi.hThread, THREAD_PRIORITY_BELOW_NORMAL);
priority = GetThreadPriority(pi.hThread);
//禁止系统自动的优先级提升
BOOL bPriority;
bret = SetProcessPriorityBoost(pi.hProcess, FALSE);
bret = GetProcessPriorityBoost(pi.hProcess, &bPriority);
bret = SetThreadPriorityBoost(pi.hThread, FALSE);
bret = GetThreadPriorityBoost(pi.hThread, &bPriority);
CloseHandle(pi.hProcess);
pi.hProcess = nullptr;
CloseHandle(pi.hThread);
pi.hThread = nullptr;
//调度IO请求优先级
bret = SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);//降低线程调度优先级,不允许改变另一个线程的IO优先级
/*IO操作*/
bret = SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);//让线程进程normal级别的调度级别,不允许改变另一个线程的IO优先级
//设置进程下所有进程的IO请求优先级
bret = SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN);
bret = SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END);
//单独设置文件IO优先级
HANDLE hFile = CreateFile(TEXT("C:\\gongluck"), 0, 0, NULL, CREATE_NEW, 0, NULL);
DWORD err = GetLastError();
FILE_IO_PRIORITY_HINT_INFO phi;
phi.PriorityHint = IoPriorityHintLow;
bret = SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &phi, sizeof(phi));
err = GetLastError();
CloseHandle(hFile);
hFile = nullptr;
//进程和CPU关联性
DWORD processmask = 0;
DWORD systemmask = 0;
bret = GetProcessAffinityMask(GetCurrentProcess(), &processmask, &systemmask);
bret = SetProcessAffinityMask(GetCurrentProcess(), processmask);
bret = GetProcessAffinityMask(GetCurrentProcess(), &processmask, &systemmask);
//线程和CPU关联性
DWORD oldmask = SetThreadAffinityMask(hthread, 0x00000001);//限制只能在CPU0上运行
DWORD oldidea = SetThreadIdealProcessor(hthread, MAXIMUM_PROCESSORS);//设置理想CPU
CloseHandle(hthread);
hthread = nullptr;
system("pause");
return 0;
}
Windows核心编程:第7章 线程调度、优先级和关联性的更多相关文章
- windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题
// 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...
- windows核心编程 第5章job lab示例程序 解决小技巧
看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里” 用process explorer程序查看 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- Windows核心编程 第六章 线程基础知识 (上)
第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...
- Windows核心编程 第五章 作业(上)
第5章 作 业 通常,必须将一组进程当作单个实体来处理.例如,当让 Microsoft Developer Studio为你创建一个应用程序项目时,它会生成 C l . e x e,C l . e x ...
- windows核心编程---第六章 线程的调度
每个线程都有一个CONTEXT结构,保存在线程内核对象中.大约每隔20ms windows就会查看所有当前存在的线程内核对象.并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入c ...
- windows核心编程---第四章 进程
上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了.首先要给大家介绍的是进程内核对象.进程大家都不陌生,它是资源和分配的基本单位,而进程内核对象就是与进程相关联的一个数据结构.操作系统内核通过 ...
- Windows核心编程 第27章 硬件输入模型和局部输入状态
第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...
随机推荐
- html中 和空格的区别
Non-Breaking Space 注意是 这6个字符是一个整体, 在html中, 是空格的占位符.一个 代表一个空格:两个 代表两个空格,即使用几个 就显示几个空格. 但是普通的空格在h ...
- PHP5.3的编译扩展
./configure --prefix=/usr/local/php --enable-fastcgi --enable-zip --enable-fpm --enable-gd-native-tt ...
- maven mirror , profile , snapshot 和release
1. settings.xml 配置的mirror <mirrors> <mirror> <id>Nexus</id> <name>nexu ...
- 常用jvm参数
如果你是Eclipse ,可以通过 run -> Run Configurations->Arguments 添加-XX:+PrintGCDetails 打开gc日志 -Xmx 设置jav ...
- 20170531动手实践MyOD——20155312
实践题目 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 对题目分析如下 od的功能(参考Linux od命令详细介绍及用法实例): od命令用 ...
- IDEA如何把写好的java文件/项目打包成一个jar的文件
一.命令行的方法 打开cmd,输入jar -cvf [打包后的文件名].jar [要打包的目录]. 二.IDEA的方法 写完一个java程序把它封装成一个jar的包 这样就可以在别的jar上面运行这 ...
- ubuntu禁用n卡驱动(进系统卡死)
显卡驱动 该发行版依旧内置了Nouveau 开源驱动,这是导致频繁死机的直接原因.接下来要做的三件事情是: 禁用Nouveau 内核模块 安装Intel HD 530 驱动(二选一) 安装NVIDIA ...
- 谷歌开源OCR,tesseract-ocr使用笔记
官方教程地址:https://github.com/tesseract-ocr/tesseract/wiki/Compiling 测试版本为 root@9a2a063f9534:/tesseract/ ...
- TOMCAT内存溢出及大小调整的实现方法
一.tomcat内存设置问题 收藏 在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat.jboss,weblogic)加载jar包时会出现java.lang.OutOfMemor ...
- 2018.11.06 bzoj1040: [ZJOI2008]骑士(树形dp)
传送门 由题可知给出的是基环森林. 因此对于每个基环森林找到环断开dpdpdp两次就行了. 代码: #include<bits/stdc++.h> using namespace std; ...