请问,主线程和自己开的线程之间切换的机制是什么。。是根据时间片轮流切换么?

时间:2023-01-25 21:19:58
请问,主线程和自己开的线程之间切换的机制是什么。。是根据时间片轮流切换么?大概的机理可以介绍一下么?比如说,我自己开了一个线程,用于对外设采样数据的读取,那么它什么时候会切换到主线程,从主线程又切换回来后。其中大概有多少时间的间隔?因为我的线程是实时采样,故两次读数据的间隔不太太久。(我的主线程中没有什么操作。)
  刚学线程,很多概念不清楚,望高手指点一下,谢谢!!

14 个解决方案

#1


同一优先级的线程默认大概是以20ms的时间片切换吧。。
我想关键要看优先级。。。

#2


如果,在自己开的线程中有一句Sleep(200),停留200ms
或者,在自己开的线程中调用驱动IO_Control(...),级别Ring0,需要的时间大概为200ms,
那么线程该如何切换呢?根据什么原则呢?

#3


先看优先级。要是同一优先级的话,就是时间片轮流了。

#4


主要由操作系统的线程调度机制决定。

#5


人为的能控制吗

#6


我在自己开的线程中调用驱动DeviceIoControl(...),级别为Ring0,需要的时间大概为200ms,我知道,好像一般的应用程序运行级别都在Ring3,
可以帮我分析一下它和主线程是如何切换的呢?
---------------
按我的理解,是不是这样的:
由于自己开的线程中主要是执行DeviceIoControl(...),为驱动级别Ring0,运行优先级别很高,故在执行DeviceIoControl(...)的时候无法切换回主线程。
主线程(20ms)-->自己的线程(200ms) --> 主线程(20ms)-->自己的线程(200ms)

哪位高手可以指点一下,谢谢!!

#7


谢谢关注!

#8


自己开的线程调deviceiocontrol的时候,仍然是在ring3,不会到ring0去。是who告诉你的?

#9


我调用deviceiocontrol(),然后返回回来,就需要耗费200ms,在这期间。。
你的意思是。。
在调用deviceiocontrol(),然后返回出来的200ms的执行时间里,系统还是可以进行进程的切换么??

#10


不清楚你的时间是怎么算出来的。
调了deviceiocontrol,成功了就会有在ring0的线程run了,时间应该是被它占了。

#11


for(i=0;i<=100,i++) {
   deviceiocontrol(Device_ID,64000,temp,......);
}
其中,Device_ID是打开的设备名称,temp是一个64K字节数组的指针,执行一次deviceiocontrol(Device_ID,64000,temp,......);意味着从设备上读取64K个字节,成功了返回TRUE,失败了返回FALSE;
我循环执行了100次,用了20秒,所以,我算出每个deviceiocontrol()的时间是200ms

是不是,我哪里理解不对,概念不清,请指点,谢谢!!

#12


按我的理解,是不是这样的:
主线程(20ms)-->自己的线程(200ms) --> 主线程(20ms)-->自己的线程(200ms)。。。


----------------------------------------
之前,我执行100次deviceiocontrol(),耗时20秒,没有开线程,直接在主线程中,相应按钮事件,计时为20秒。

#13


up

#14


谢谢关注!

#1


同一优先级的线程默认大概是以20ms的时间片切换吧。。
我想关键要看优先级。。。

#2


如果,在自己开的线程中有一句Sleep(200),停留200ms
或者,在自己开的线程中调用驱动IO_Control(...),级别Ring0,需要的时间大概为200ms,
那么线程该如何切换呢?根据什么原则呢?

#3


先看优先级。要是同一优先级的话,就是时间片轮流了。

#4


主要由操作系统的线程调度机制决定。

#5


人为的能控制吗

#6


我在自己开的线程中调用驱动DeviceIoControl(...),级别为Ring0,需要的时间大概为200ms,我知道,好像一般的应用程序运行级别都在Ring3,
可以帮我分析一下它和主线程是如何切换的呢?
---------------
按我的理解,是不是这样的:
由于自己开的线程中主要是执行DeviceIoControl(...),为驱动级别Ring0,运行优先级别很高,故在执行DeviceIoControl(...)的时候无法切换回主线程。
主线程(20ms)-->自己的线程(200ms) --> 主线程(20ms)-->自己的线程(200ms)

哪位高手可以指点一下,谢谢!!

#7


谢谢关注!

#8


自己开的线程调deviceiocontrol的时候,仍然是在ring3,不会到ring0去。是who告诉你的?

#9


我调用deviceiocontrol(),然后返回回来,就需要耗费200ms,在这期间。。
你的意思是。。
在调用deviceiocontrol(),然后返回出来的200ms的执行时间里,系统还是可以进行进程的切换么??

#10


不清楚你的时间是怎么算出来的。
调了deviceiocontrol,成功了就会有在ring0的线程run了,时间应该是被它占了。

#11


for(i=0;i<=100,i++) {
   deviceiocontrol(Device_ID,64000,temp,......);
}
其中,Device_ID是打开的设备名称,temp是一个64K字节数组的指针,执行一次deviceiocontrol(Device_ID,64000,temp,......);意味着从设备上读取64K个字节,成功了返回TRUE,失败了返回FALSE;
我循环执行了100次,用了20秒,所以,我算出每个deviceiocontrol()的时间是200ms

是不是,我哪里理解不对,概念不清,请指点,谢谢!!

#12


按我的理解,是不是这样的:
主线程(20ms)-->自己的线程(200ms) --> 主线程(20ms)-->自己的线程(200ms)。。。


----------------------------------------
之前,我执行100次deviceiocontrol(),耗时20秒,没有开线程,直接在主线程中,相应按钮事件,计时为20秒。

#13


up

#14


谢谢关注!