线程切换??时间片??

时间:2021-07-06 09:20:07
如下情况:
例如 我有一个 函数A,需要运行差不多 1、2s 时间。
那么它在运行过程中,肯定会被分割成好多个 时间片 来跑,那我能不能有啥方法得知这个函数运行过程中经历了几个时间片????
比如我有一个全局变量 int i ,在 函数A 开始的时候 i=0 ,在 函数A 经历 线程切换的时候,i++ ,这样在 函数A 跑完的时候 我查看 i 就知道经历了几次 线程切换了。

能不能实现啊??

29 个解决方案

#1


帮顶
为什么要获取这个数?

#2


不可能把,太底层了

#3


没有办法通过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; 

#6


windows下你是基本上无法知道的,因为不同版本的系统调度算法略微不同,而且线程也分优先级,同等优先级下大概20ms的时间片。线程中有个CONTEXT结构来记录线程的上下文,里面有保存被调度的次数。

#7


引用 4 楼 yzm888 的回复:
经历了几个时间片 != 经历了几次 线程切换

想错

#8


这要看CPU频率,一般的情况,切换一次20ms

#9


操作系统底层的操作,需要底层获取.

#10


引用 9 楼 oyljerry 的回复:
操作系统底层的操作,需要底层获取.

稍微 随便 给点信息~~ 给点关键字让我查查也行啊

#11


系统底层的无法通过API访问的。。。

#12


获取运行时间,在第一个线程结束时,获取下系统运行时间,再到第二次运行前获取,应该就是切换时间了

#13


GetTickCount();

#14


很简单的问题,线程函数执行时给某个窗口发一个消息,消息响应函数里就可以记录执行次数了

#15


你设置两个全局变量,运行到了就给加1

#16


NtQuerySystemInformation

#17


引用 15 楼 gao5214637 的回复:
你设置两个全局变量,运行到了就给加1

曾经是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


引用 5 楼 smwhotjay 的回复:
Kthread->ContextSwitches

typedef struct _SYSTEM_THREADS { 
LARGE_INTEGER KernelTime; 
LARGE_INTEGER UserTime; 
LARGE_INTEGER CreateTime; 
ULONG WaitTime; 
PVOID StartAddress; 
CLIENT_ID Clien……

正解

#21


个人觉得不太可能。

#22


答案都出来了还不太可能

#23


引用 22 楼 lactoferrin 的回复:
答案都出来了还不太可能

那我错了。

#24


process explorer就可以看到线程的切换次数

#25


引用 24 楼 lactoferrin 的回复:
process explorer就可以看到线程的切换次数

楼主问的好像不是线程的切换次数吧,它问的是一个函数A在执行过程中经历了几次切换啊!

#26


调度策略同 ,很难实现

#27


引用 25 楼 wltg2001 的回复:
引用 24 楼 lactoferrin 的回复:
process explorer就可以看到线程的切换次数

楼主问的好像不是线程的切换次数吧,它问的是一个函数A在执行过程中经历了几次切换啊!

用那个方法就可以得到某个线程在执行a的过程切换了几次

#28


很随机的,你如果要获取运行多长的时间,可以,你要知道多少时间片,麻烦,因为线程的优先级不同,时间片也不同吧

#29


在线程内部用全局变量计数是绝对不可能的。但是线程内核对象里应该有这个计数值,查查sdk吧

#1


帮顶
为什么要获取这个数?

#2


不可能把,太底层了

#3


没有办法通过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; 

#6


windows下你是基本上无法知道的,因为不同版本的系统调度算法略微不同,而且线程也分优先级,同等优先级下大概20ms的时间片。线程中有个CONTEXT结构来记录线程的上下文,里面有保存被调度的次数。

#7


引用 4 楼 yzm888 的回复:
经历了几个时间片 != 经历了几次 线程切换

想错

#8


这要看CPU频率,一般的情况,切换一次20ms

#9


操作系统底层的操作,需要底层获取.

#10


引用 9 楼 oyljerry 的回复:
操作系统底层的操作,需要底层获取.

稍微 随便 给点信息~~ 给点关键字让我查查也行啊

#11


系统底层的无法通过API访问的。。。

#12


获取运行时间,在第一个线程结束时,获取下系统运行时间,再到第二次运行前获取,应该就是切换时间了

#13


GetTickCount();

#14


很简单的问题,线程函数执行时给某个窗口发一个消息,消息响应函数里就可以记录执行次数了

#15


你设置两个全局变量,运行到了就给加1

#16


NtQuerySystemInformation

#17


引用 15 楼 gao5214637 的回复:
你设置两个全局变量,运行到了就给加1

曾经是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


引用 5 楼 smwhotjay 的回复:
Kthread->ContextSwitches

typedef struct _SYSTEM_THREADS { 
LARGE_INTEGER KernelTime; 
LARGE_INTEGER UserTime; 
LARGE_INTEGER CreateTime; 
ULONG WaitTime; 
PVOID StartAddress; 
CLIENT_ID Clien……

正解

#21


个人觉得不太可能。

#22


答案都出来了还不太可能

#23


引用 22 楼 lactoferrin 的回复:
答案都出来了还不太可能

那我错了。

#24


process explorer就可以看到线程的切换次数

#25


引用 24 楼 lactoferrin 的回复:
process explorer就可以看到线程的切换次数

楼主问的好像不是线程的切换次数吧,它问的是一个函数A在执行过程中经历了几次切换啊!

#26


调度策略同 ,很难实现

#27


引用 25 楼 wltg2001 的回复:
引用 24 楼 lactoferrin 的回复:
process explorer就可以看到线程的切换次数

楼主问的好像不是线程的切换次数吧,它问的是一个函数A在执行过程中经历了几次切换啊!

用那个方法就可以得到某个线程在执行a的过程切换了几次

#28


很随机的,你如果要获取运行多长的时间,可以,你要知道多少时间片,麻烦,因为线程的优先级不同,时间片也不同吧

#29


在线程内部用全局变量计数是绝对不可能的。但是线程内核对象里应该有这个计数值,查查sdk吧