Windows核心编程&线程
1. 线程上下文:线程内核对象保存线程上一次执行时的CPU寄存器状态
2. 线程上下文切换
3. windows操作系统为抢占式多线程操作系统,系统可以在任何时刻停止一个线程而另行调度另外一个线程。我们无法保证
线程总在运行,无法保证线程会获得整个处理器而不运行运行其他线程等。
4. 系统只调度可调度的线程,系统中大多数线程都是不可调度的,比如挂起(SUSPENDED)线程或等待线程(等待某些事件发生,
如键盘输入)
5. 枚举线程
CreateToolhelp32Snapshot Thead32First Thread32Next
6. 线程的执行时间
在抢占式操作系统中,我们不可能知道线程什么时候会获得CPU时间,当线程失去CPU时间时,为线程执行的各种任务进行计时很
困难。我们需要的是一个能够返回线程已获得的CPU时间量的函数GetThreadTimes
精度更高的有:QueryPerformanceFrequency和QueryPerformanceCounter
当线程被调度程序暂停时将计算此时TSC值与线程开始执行时间量时的TSC值之差,并在线程执行时间上加上这个差值,不计算中断时间
//typedef struct _FILETIME
//{
// DWORD dwLowDateTime;
// DWORD dwHighDateTime;
//} FILETIME;
// 设计概念逻辑左移动和算术左移
INT64 FileTimeToQuadWord(FILETIME* pft)
{
return (Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
// 函数无法检测
void PerformLongOperation()
{
FILETIME ftCreateTime;
FILETIME ftExitTime;
FILETIME ftKernelTimeStart;
FILETIME ftKernelTimeEnd;
FILETIME ftUserStart;
FILETIME ftUserEnd;
INT64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
GetThreadTimes(GetCurrentThread(), &ftCreateTime, &ftExitTime, &ftKernelTimeStart, &ftUserStart);
// 进行一系列操作
for ( int i = 0; i < 100; i ++)
{
int j = i;
}
GetThreadTimes(GetCurrentThread(), &ftCreateTime, &ftExitTime, &ftKernelTimeEnd, &ftUserEnd);
qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) - FileTimeToQuadWord(&ftKernelTimeStart);
qwUserTimeElapsed = FileTimeToQuadWord(&ftUserEnd) - FileTimeToQuadWord(&ftUserStart);
qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
}
class CStopwatch
{
private:
// 64位有符号整数可以用INT64 _int64 LARGE_INTEGER表示
LARGE_INTEGER m_nPerfFrequency;
LARGE_INTEGER m_nPerFrefStart;
public:
CStopwatch(){QueryPerformanceFrequency(&m_nPerfFrequency); Start();}
void Start(){QueryPerformanceCounter(&m_nPerFrefStart);}
INT64 Now() const
{
LARGE_INTEGER nPerfNow;
QueryPerformanceCounter(&nPerfNow);
return ((nPerfNow.QuadPart - m_nPerFrefStart.QuadPart) * 1000) / m_nPerfFrequency.QuadPart;
}
INT64 NowInMicro() const
{
LARGE_INTEGER nPerfNow;
QueryPerformanceCounter(&nPerfNow);
return ((nPerfNow.QuadPart - m_nPerFrefStart.QuadPart) * 1000000) / m_nPerfFrequency.QuadPart;
}
};
7. CONTEXT结构分以下及部分:
CPU控制寄存器:指令指针、栈指针、标志和函数返回地址等
CPU整数寄存器
CPU浮点数寄存器
CPU段寄存器
CPU调试寄存器
CPU扩展寄存器
8. 用户模式下线程同步
1). 原子访问InterLocked系列函数,无论编译器如何生成代码,无论机器上装配了多少个CPU,这些函数都能保证对值的修改是以原子方式进行的。
但是我们必须保证传给这些函数的变量地址是对齐的,否则这些函数可能会失败。
2). 注意原子系列函数返回的是原来的值
3). 关键段CRITICAL_SECTION
CRITICAL_SECTION g_cs;
EnterCriticalSection(&g_cs);
LeaveCriticalSection(&g_cs);
4). SRWLOCK读/写锁
InitializeSRWLOCK(PSRWLOCK SRWLock);
// 独占方式写入者线程
AcquireSRWLockExclusive(PSRWLOCK SRWLock);
ReleaseSRWLockExclusive(PSRWLOCK SRWLock);
// 共享方式读取者线程
AcquireSRWLockShared(PSRWLOCK SRWLock);
ReleaseSRWLockShared(PSRWLOCK SRWLock);
5). 条件变量
BOOL SleepConditionVariableCS(PCONDITIONVARIABLE pConditionVariable, PCRITICAL_SECTION pCriticalSection, DWORD dwMillseconds);
BOOL SleepConditionVariableCS(PCONDITIONVARIABLE pConditionVariable, PSRWLOCK pSRWLock, DWORD dwMillseconds, ULONG Flags);
Flags: 对写入者线程来说应该传入0,表示希望以独占的方式对资源访问
CONDITION_VARIABLE_LOCKMODE_SHARED 表示希望共享对资源的访问
9. 高速缓存行
虽然高速缓存行存在提高性能,但在多处理器的机器上他们能够损伤性能
_declspec (align(32)) struct data
{
int a;
char cBuff[100];
_declspec (align(64))
double d;
int c;
};
附录:
elapsed 失去过去 elapsedtime
query 询问 QueryPerformanceFrequency
conditionvariable 条件变量
void* _aligned_malloc(size_t size, size_t alignment); 分配一块对齐过的内存
LONG InterlockedExchangeAdd(PLONG volatile plAddend, LONG lIncrement);
LONG InterlockedExchange(PLONG volatile plTarget, LONG lValue);
PVOID InterlockedExchangePointer(PVOID* volatile ppvTarget, PVOID pvValue);
LPCOID HeadAlloc(HEADLE hHeap, DWORD dwFlag, SIZE_T dwBytes);
参数1可以通过GetProcessHeap()获得
参数2 HEAP_GENERATE_EXCEPTIONS 如果分配错误将会抛出异常而不是返回NULL
HEAP_NO_SERIALIZE 不实用连续存储
HEAP_ZERO_MEMORY 将分配的内存全部清零
Windows核心编程&线程的更多相关文章
- windows核心编程 - 线程同步机制
线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...
- windows核心编程 - 线程基础
一.基本概念: 一个进程至少需要一个线程. 组成:一个线程包括仅包括一个线程堆栈和一个线程内核对象 线程堆栈:用于维护线程在执行代码时需要的所有函数参数和局部变量 线程内核对象:操作系统用它来对线程实 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- 【windows核心编程】 第六章 线程基础
Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ① 一个是线程的内核 ...
- Windows核心编程学习九:利用内核对象进行线程同步
注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...
- 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。
windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...
- 用户模式下的线程同步的分析(Windows核心编程)
线程同步 同一进程或者同一线程可以生成许多不同的子线程来完成规定的任务,但是多个线程同时运行的情况下可能需要对某个资源进行读写访问,比如以下这个情况:创建两个线程对同一资源进行访问,最后打印出这个资源 ...
- CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)
0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...
随机推荐
- 骗子网站,X毛都没有,骗我九十九
前言 这几天在A市和B市奔波着,眼瞅着自己就要毕业了,必须得出来找份工作了. 和小伙伴在A市兜兜转转了几天,要不就是不合适没下文,要不就是给了offer,工资是在太低.心很累,然后就下B市了,看看B市 ...
- Kafka的特点及使用场景
Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. ...
- Windows下使用pip安装mysql-python
安装的过程很煎熬,留个爪,希望对其他人有帮助. 先声明我安装前的电脑配置: Win10: Python2和Python3共存(备注一个好用的方法,感谢知乎大神:https://www.zhihu.co ...
- 5.移植uboot-设置默认环境变量,裁剪,并分区
在上一章,我们使用网卡传输文件,每次启机时,环境变量都要变为默认值,需要重新设置ip,MAC地址才行,由于没有配置mtdparts命令,启动内核也不成功 所以本章主要学习: 1)修改环境变量默认值 2 ...
- mybatis foreach批量插入数据:Oracle与MySQL区别
mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...
- Beyond Globally Optimal: Focused Learning
这里对WWW 2017文章<Beyond Globally Optimal: Focused Learning for Improved Recommendations>进行一个简单的分析 ...
- 【转】TCP粘包分析
一 .两个简单概念长连接与短连接: 1.长连接 Client方与Server方先建立通讯连接,连接建立后不断开, 然后再进行报文发送和接收. 2.短连接 Client方与Server每 ...
- CSS3阴影 box-shadow的使用总结
text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...
- Link-Cut-Trees
填坑,填坑,填坑…… 开篇镇人品……下文的比喻仅供娱乐…… 为了迎接JSZX校内互测,我临时填坑学了LCT…… 怎么说呢……我也是懵懵懂懂地看了N篇博客,对着标程敲上一发代码,然后才慢慢理解.这里推荐 ...
- 2017 Multi-University Training Contest - Team 1 1011&&HDU 6043 KazaQ's Socks【规律题,数学,水】
KazaQ's Socks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...