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. Python编程笔记(第三篇)【补充】三元运算、文件处理、检测文件编码、递归、斐波那契数列、名称空间、作用域、生成器

    一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件处理: if 条件成立: val = 1 else: val = 2 改成三元运算 val = 1 if 条件成立 else ...

  2. Android相关概念

    2017-06-02 armeabi就是针对普通的或旧的arm v5 cpu,armeabi-v7a是针对有浮点运算或高级扩展功能的arm v7 cpu. armeabi-v7a(32位ARM设备), ...

  3. https的名词解释

    原文 http://www.cnblogs.com/guogangj/p/4118605.html 那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等) ...

  4. CRC-32的原理和实现

    /* crc32.c -- compute the CRC-32 of a data stream * Copyright (C) 1995-2002 Mark Adler * For conditi ...

  5. 【转】mysql查看表空间占用情况

    ${database} 为数据库的名称 /*1.查看索引 (1)单位是GB*/ SELECT CONCAT(ROUND(SUM(index_length)/(**), ), ' GB') AS 'To ...

  6. 《从0到1》深度阅读笔记zz

    没有人能精准地预测未来,我们只知道两件事:一是世界必然会变得不同:二是现在再好的描述也不能让我们看到清晰的未来. 创业者把成就归功于商业模式和机会窗口,归功于创业者本人拥有的资源和能力,但还有一个最重 ...

  7. 基础知识之nginx重写规则

    nginx重写规则 nginx rewrite 正则表达式匹配 大小写匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配 -f ...

  8. ThinkPHP redirect 传参

    重定向带参 $this->redirect('pay/under_line_success',array('order_id'=>$stuInfo),5,'页面跳转中….'); 第一个参数 ...

  9. C++程序生成.exe文件,在文件夹中运行时闪现问题

    问题描述:在IDE(此为Dev-C++)中编写C++程序,运行时会产生如下文字 但我想取消这三行的显示. 解决方法:1:在IDE中运行时,“请按任意键继续”是消失不掉的,但在该程序的保存路径下可以消灭 ...

  10. IntelliJ IDEA 2017版 Spring5 的RunnableFactoryBean配置

    1.新建RunnableFactoryBean package com.spring4.pojo; import org.springframework.beans.factory.FactoryBe ...