例如 我有一个 函数A,需要运行差不多 1、2s 时间。
那么它在运行过程中,肯定会被分割成好多个 时间片 来跑,那我能不能有啥方法得知这个函数运行过程中经历了几个时间片????
比如我有一个全局变量 int i ,在 函数A 开始的时候 i=0 ,在 函数A 经历 线程切换的时候,i++ ,这样在 函数A 跑完的时候 我查看 i 就知道经历了几次 线程切换了。
能不能实现啊??
29 个解决方案
#1
帮顶
为什么要获取这个数?
为什么要获取这个数?
#2
不可能把,太底层了
#3
没有办法通过API获取到的,而且这个值也毫无意义吧。
倒是有API可以获取线程的实际执行时间就是了。
倒是有API可以获取线程的实际执行时间就是了。
#4
经历了几个时间片 != 经历了几次 线程切换
#5
Kthread->ContextSwitches
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
KWAIT_REASON WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
KWAIT_REASON WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
#6
windows下你是基本上无法知道的,因为不同版本的系统调度算法略微不同,而且线程也分优先级,同等优先级下大概20ms的时间片。线程中有个CONTEXT结构来记录线程的上下文,里面有保存被调度的次数。
#7
想错
#8
这要看CPU频率,一般的情况,切换一次20ms
#9
操作系统底层的操作,需要底层获取.
#10
稍微 随便 给点信息~~ 给点关键字让我查查也行啊
#11
系统底层的无法通过API访问的。。。
#12
获取运行时间,在第一个线程结束时,获取下系统运行时间,再到第二次运行前获取,应该就是切换时间了
#13
GetTickCount();
#14
很简单的问题,线程函数执行时给某个窗口发一个消息,消息响应函数里就可以记录执行次数了
#15
你设置两个全局变量,运行到了就给加1
#16
NtQuerySystemInformation
#17
曾经是C程序员吧?呵呵,全局变量不是好的代码风格,尽量少用。
#18
可以的,你可以嵌入汇编,直接的到CPU运行时间。
不过比支持多核。。。
__int64 BegTime = 0;
__int64 EndTime = 0;
int a[ 3 ] = { 4, 5, 6 };
__asm
{
rdtsc
mov dword ptr [ BegTime ], eax
lea eax, dword ptr [ BegTime ]
mov dword ptr [ eax + 4 ], edx
}
ADD< 3, int >::Result( a );
__asm
{
rdtsc
mov dword ptr [ EndTime ], eax
lea eax, dword ptr [ EndTime ]
mov dword ptr [ eax + 4 ], edx
}
printf("%d___\n",EndTime - BegTime);
不过比支持多核。。。
#19
可以用驱动Hook SwapContext 或者 NtQuerySystemInformation把执行时间和CPU时间片大小拿到然后算一下...
#20
正解
#21
个人觉得不太可能。
#22
答案都出来了还不太可能
#23
那我错了。
#24
process explorer就可以看到线程的切换次数
#25
楼主问的好像不是线程的切换次数吧,它问的是一个函数A在执行过程中经历了几次切换啊!
#26
调度策略同 ,很难实现
#27
用那个方法就可以得到某个线程在执行a的过程切换了几次
#28
很随机的,你如果要获取运行多长的时间,可以,你要知道多少时间片,麻烦,因为线程的优先级不同,时间片也不同吧
#29
在线程内部用全局变量计数是绝对不可能的。但是线程内核对象里应该有这个计数值,查查sdk吧
#1
帮顶
为什么要获取这个数?
为什么要获取这个数?
#2
不可能把,太底层了
#3
没有办法通过API获取到的,而且这个值也毫无意义吧。
倒是有API可以获取线程的实际执行时间就是了。
倒是有API可以获取线程的实际执行时间就是了。
#4
经历了几个时间片 != 经历了几次 线程切换
#5
Kthread->ContextSwitches
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
KWAIT_REASON WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
KWAIT_REASON WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
#6
windows下你是基本上无法知道的,因为不同版本的系统调度算法略微不同,而且线程也分优先级,同等优先级下大概20ms的时间片。线程中有个CONTEXT结构来记录线程的上下文,里面有保存被调度的次数。
#7
想错
#8
这要看CPU频率,一般的情况,切换一次20ms
#9
操作系统底层的操作,需要底层获取.
#10
稍微 随便 给点信息~~ 给点关键字让我查查也行啊
#11
系统底层的无法通过API访问的。。。
#12
获取运行时间,在第一个线程结束时,获取下系统运行时间,再到第二次运行前获取,应该就是切换时间了
#13
GetTickCount();
#14
很简单的问题,线程函数执行时给某个窗口发一个消息,消息响应函数里就可以记录执行次数了
#15
你设置两个全局变量,运行到了就给加1
#16
NtQuerySystemInformation
#17
曾经是C程序员吧?呵呵,全局变量不是好的代码风格,尽量少用。
#18
可以的,你可以嵌入汇编,直接的到CPU运行时间。
不过比支持多核。。。
__int64 BegTime = 0;
__int64 EndTime = 0;
int a[ 3 ] = { 4, 5, 6 };
__asm
{
rdtsc
mov dword ptr [ BegTime ], eax
lea eax, dword ptr [ BegTime ]
mov dword ptr [ eax + 4 ], edx
}
ADD< 3, int >::Result( a );
__asm
{
rdtsc
mov dword ptr [ EndTime ], eax
lea eax, dword ptr [ EndTime ]
mov dword ptr [ eax + 4 ], edx
}
printf("%d___\n",EndTime - BegTime);
不过比支持多核。。。
#19
可以用驱动Hook SwapContext 或者 NtQuerySystemInformation把执行时间和CPU时间片大小拿到然后算一下...
#20
正解
#21
个人觉得不太可能。
#22
答案都出来了还不太可能
#23
那我错了。
#24
process explorer就可以看到线程的切换次数
#25
楼主问的好像不是线程的切换次数吧,它问的是一个函数A在执行过程中经历了几次切换啊!
#26
调度策略同 ,很难实现
#27
用那个方法就可以得到某个线程在执行a的过程切换了几次
#28
很随机的,你如果要获取运行多长的时间,可以,你要知道多少时间片,麻烦,因为线程的优先级不同,时间片也不同吧
#29
在线程内部用全局变量计数是绝对不可能的。但是线程内核对象里应该有这个计数值,查查sdk吧