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核心编程&线程的更多相关文章

  1. windows核心编程 - 线程同步机制

    线程同步机制 常用的线程同步机制有很多种,主要分为用户模式和内核对象两类:其中 用户模式包括:原子操作.关键代码段 内核对象包括:时间内核对象(Event).等待定时器内核对象(WaitableTim ...

  2. windows核心编程 - 线程基础

    一.基本概念: 一个进程至少需要一个线程. 组成:一个线程包括仅包括一个线程堆栈和一个线程内核对象 线程堆栈:用于维护线程在执行代码时需要的所有函数参数和局部变量 线程内核对象:操作系统用它来对线程实 ...

  3. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  4. 【windows核心编程】 第八章 用户模式下的线程同步

    Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ①    需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ②    一个线程需要通知其他线程 ...

  5. 【windows核心编程】 第六章 线程基础

    Windows核心编程 第六章 线程基础 欢迎转载 转载请注明出处:http://www.cnblogs.com/cuish/p/3145214.html 1. 线程的组成 ①    一个是线程的内核 ...

  6. Windows核心编程学习九:利用内核对象进行线程同步

    注:源码为学习<Windows核心编程>的一些尝试,非原创.若能有助于一二访客,幸甚. 1.程序框架 #include "Queue.h" #include <t ...

  7. 《windows核心编程系列》十九谈谈使用远程线程来注入DLL。

    windows内的各个进程有各自的地址空间.它们相互独立互不干扰保证了系统的安全性.但是windows也为调试器或是其他工具设计了一些函数,这些函数可以让一个进程对另一个进程进行操作.虽然他们是为调试 ...

  8. 用户模式下的线程同步的分析(Windows核心编程)

    线程同步 同一进程或者同一线程可以生成许多不同的子线程来完成规定的任务,但是多个线程同时运行的情况下可能需要对某个资源进行读写访问,比如以下这个情况:创建两个线程对同一资源进行访问,最后打印出这个资源 ...

  9. CreateThread 线程操作与 _beginthreadex 线程安全(Windows核心编程)

    0x01 线程的创建 线程不同于进程,Windows 中的进程是拥有 '惰性' 的,本身并不执行任何代码,而执行代码的任务转交给主线程,列如使用 CreateProcess 创建一个进程打开 Cmd ...

随机推荐

  1. java基础概述

    写代码: 1,明确需求. 2,分析思路. 3,确定步骤. 4,代码实现. Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用 ...

  2. 利用jquery encoder解决XSS脚本注入所产生的问题

    问题现象:前端接收到后台一个数据(其中包含html)标签,自动转译成html页面元素,且自动执行了脚本,造成了前端页面的阻塞 接受的后台数据为大量重复的如下代码 ");</script ...

  3. .net的retrofit--WebApiClient库深入篇

    前言 本篇文章的内容是对上一篇.net的retrofit--WebApiClient库的深层次补充,你可能需要先阅读上一篇才能理解此篇文章.本文将详细地讲解WebApiClient的原理,结合实际项目 ...

  4. 关于java中,json字符串转集合和对象,或者集合转json字符串的解决方法

    1 List集合转成json字符串 //Java集合 List<String> list = new ArrayList<String>(); list.add("a ...

  5. Luogu P1231 教辅的组成

    Luogu P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还 ...

  6. metasploit魔鬼训练营 (安全漏洞生命周期)

    1,前期 渗透测试工程师在挖掘0day的出来的 2,前中期 在一个密封的团体里,互相交流,利用漏洞带来的价值和,金钱 3,中期 安全漏洞被披露!!黑客们快速掌握该漏洞 4,中后期 漏洞被制作成更为简单 ...

  7. Gym 100952D&&2015 HIAST Collegiate Programming Contest D. Time to go back【杨辉三角预处理,组合数,dp】

    D. Time to go back time limit per test:1 second memory limit per test:256 megabytes input:standard i ...

  8. [Codeforces 696D] Legen...

    题目大意: 给出一些匹配串,要造一个长度不超过L的字符串,每个匹配串有自己的价值,匹配串每次出现在字符串里都会贡献一次价值...要求可能得到的最大价值. 匹配串总长不超200,L<=10^14, ...

  9. [bzoj1910] [Ctsc2002] Award 颁奖典礼

    应该是第一次写这种图形类的DP.. 一个“I”可以分成三个矩形..令f[1..3][i][j][k]表示第几个矩形,下边界为第i行的j~k列,的最大面积. 然后就是各种优化啊什么的...时间复杂度O( ...

  10. 连连看(dfs)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...