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章 线程调度、优先级和关联性的更多相关文章

  1. windows核心编程 第8章201页旋转锁的代码在新版Visual Studio运行问题

    // 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExcha ...

  2. windows核心编程 第5章job lab示例程序 解决小技巧

    看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里”         用process explorer程序查看 ...

  3. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  4. Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)

    第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...

  5. windows核心编程---第七章 用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

  6. Windows核心编程 第六章 线程基础知识 (上)

    第6章 线程的基础知识 理解线程是非常关键的,因为每个进程至少需要一个线程.本章将更加详细地介绍线程的知识.尤其是要讲述进程与线程之间存在多大的差别,它们各自具有什么作用.还要介绍系统如何使用线程内核 ...

  7. Windows核心编程 第五章 作业(上)

    第5章 作 业 通常,必须将一组进程当作单个实体来处理.例如,当让 Microsoft Developer Studio为你创建一个应用程序项目时,它会生成 C l . e x e,C l . e x ...

  8. windows核心编程---第六章 线程的调度

    每个线程都有一个CONTEXT结构,保存在线程内核对象中.大约每隔20ms windows就会查看所有当前存在的线程内核对象.并在可调度的线程内核对象中选择一个,将其保存在CONTEXT结构的值载入c ...

  9. windows核心编程---第四章 进程

    上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了.首先要给大家介绍的是进程内核对象.进程大家都不陌生,它是资源和分配的基本单位,而进程内核对象就是与进程相关联的一个数据结构.操作系统内核通过 ...

  10. Windows核心编程 第27章 硬件输入模型和局部输入状态

    第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...

随机推荐

  1. TI and RI

    https://blog.csdn.net/qq_27977257/article/details/70677661 51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据.当串行发送完毕 ...

  2. Python 单列

    1.__new__内置方法 在对类进行实例化时自动执行 功能1:为对象分配空间 功能2:返回空间的引用 2.单列实现方法 class MusicPlayer: # 记录对象内存引用,初始值为None ...

  3. New users can not log on Win8

    方案: http://www.eightforums.com/tutorials/38838-user-profile-service-failed-sign-fix-windows-8-a.html ...

  4. 自学java坎坷之路——20155312张竞予

    20155312 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一周并没有在课堂上对教材内容进行学习,学习内容概括如下 课程分数构成,其中包括课堂测验(每 ...

  5. vue-cli引入jquery方法

    方法一: 一,在package.json里加入, dependencies:{ ”jquery“:”^2.3.4“ } 二,在webpack.base.conf.js里加入 const webpack ...

  6. html-day04

    html-day04 1.html属性的弊端 1.完成相同的功能需要不同的属性支持 2.可维护性不高2.CSS 1.什么是CSS Cascading Style Sheet 层叠样式表.级联样式表.样 ...

  7. Oracle修改数据库的日期

    ---Oracle数据库更新时间字段数据时的sql语句---格式化时间插入 update t_invite_activityinfo set endtime=to_date('2019-10-30 1 ...

  8. windows10; ERROR 1010 (HY000): Error dropping database (can't rmdir './test/', errno: 17);默认数据库位置查找

    1.想要导入数据到一个数据库中,但是,无法导入,同时也无法删除数据库重新建立-----------------------------备份当前数据库 2,分析:很多资料显示说数据库下有异常文件,于是就 ...

  9. 微信小程序之跨界面传参

    微信小程序在两个之间传参类似js传递url拼接参数,举个例子来说吧 input自己设置参数 //index.wxml <form bindsubmit="formSubmit" ...

  10. Arria10中的IOPLL与fPLL

    最近在用Arria10.从480降到270的过程中,IOPLL出现问题,大概是说几个Bank的IOPLL已经被占用,没有空间再给别的IOPLL去适配. 因为在工程中,所用的PLL多达35个之多,其中明 ...