justin_wang0710 发表于 2015-01-09 16:34

請問scheduling 與 signal


假設我有兩個thread
thread A為高優先權 固定執行一段時間後 Sleep
thread B有設置信號驅動,若driver有收到ISR則會驅動此信號

想請問板上高手,
信號有可能會中斷高優先權的Thread ,重新schedule,然後調度到threadB 嗎?



super皮波 发表于 2015-01-09 17:15

个人觉得不会
信号的传递点有两个
1.进程即将被调度,如果此进程上有挂起的信号,则会立刻传递给这个进程
2.向进程自身传递信号,如果信号没有被阻塞的情况下,会立即发往本进程

humjb_1983 发表于 2015-01-10 08:56

justin_wang0710 发表于 2015-01-09 16:34 static/image/common/back.gif
假設我有兩個thread
thread A為高優先權 固定執行一段時間後 Sleep
thread B有設置信號驅動,若driver有 ...
答案是否定的。
首先,信号是用户态使用的通信或同步方式,内核态不使用。
其次,信号只有在当前进程正在运行,且“从内核态返回用户态”时,才能得到处理,也就是说当threadA正在运行时,此时threadB收到了信号,但不会立即得到处理,只是设置了该thread信号的pending标记、并将该thread进程设置成Running状态而已。信号需要等到诸如如下时机时才能得到处理:
comming a 中断,theadA在用户态被中断打断,当中断处理完成,返回用户态之前,有调度时机,如果threadB的优先级更高、或者threadA时间片到、或者其它原因导致threadB得到调度,threadB得到调度后,需要等待再次从“内核态返回用户态”(如系统调用或中断返回),并且不被调度出去时,才能处理pending的信号。

也就是说,信号处理依赖于:1、threadB被调度;2、threadB从内核态返回用户态(如系统调用或中断返回)

总的来说,信号处理的优先级比较低,比较难保证及时。

Tinnal 发表于 2015-01-10 12:43

最近一直在忙新版本的事情,这个月10天都没有回过贴了。我来补充一下。

1. 信号可以由进程发给进程,也可以有内核发给进程。
2. 信号本身就是一异步通讯机制,本无什么优先级可言。humjb_1983说得没错,信号处理程序只会在特定进程从内核态返回用户态那一刻才执行。如果想响应实时一点,那就得在驱动里构造机会了,又不把对应的驱动和处理进程都绑在同一个核,要不给进程所在的核主动再发一个resched IPI 过去让该核陷入内核态。
3. 是否能执行和实时性没关,B能执行的条件是比A优先级高或B已经退出。实际情况可以比这个更复杂。CFS优先级高仅仅是执行的时间长点,也不代表就能抢占别人。如果是FIFO类型的进程,也有可能因为配额用完而不能得到调度。

humjb_1983 发表于 2015-01-10 15:33

Tinnal 发表于 2015-01-10 12:43 static/image/common/back.gif
最近一直在忙新版本的事情,这个月10天都没有回过贴了。我来补充一下。

1. 信号可以由进程发给进程,也可 ...

呵呵,tinnal兄,有段时间不见了。。

justin_wang0710 发表于 2015-01-11 05:51

謝謝各位高手的說明...:em03::em03::em03:

在請問..
若無priority機制,無interrupt,CONFIG_HZ=100 ,CPU = Cortex A8 1Ghz
我有3個process 裡面分別有2,1,2 個thread

1.Linux scheduling 是以process 還是thread 為單位在調度的呢???
2.每個process 分配到的時間都會相同嗎?大約多少時間片?
3.每個thread分配到時間都會相同嗎? 大約多少時間片?
4.thread 與process context switch time 大約多少時間?


humjb_1983 发表于 2015-01-12 08:45

justin_wang0710 发表于 2015-01-11 05:51 static/image/common/back.gif
謝謝各位高手的說明...

在請問..

调度是以线程为单位的。对于Linux调度器,线程和进程是平等。
关于切换时间,这个不好评估了,还取决于硬件性能。好像有测试工具可以专门测试这一指标的~,记不得了。
页: [1]
查看完整版本: 請問scheduling 與 signal