亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5303 | 回復: 11
打印 上一主題 下一主題

關于內核調度的一點疑問 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-01-10 15:50 |只看該作者 |倒序瀏覽
類似下面的函數(shù):
signed long __sched schedule_timeout_interruptible(signed long timeout)
{
        __set_current_state(TASK_INTERRUPTIBLE);
        return schedule_timeout(timeout);
}

如果__set_current_state(TASK_INTERRUPTIBLE)執(zhí)行完畢,定時器開啟之前,發(fā)生中斷有可能高優(yōu)先級的其他進程搶占當前進程。那么當前進程是掛在等待隊列嗎?當前狀態(tài)不是TASK_RUNNING,調度程序如何使其再次運行的?

論壇徽章:
0
2 [報告]
發(fā)表于 2011-01-10 17:42 |只看該作者
按樓主理解那可運行的程序對于單cpu情況下,豈不是只有一個了?
可運行的程序由多個可運行進程鏈表管理的。

論壇徽章:
0
3 [報告]
發(fā)表于 2011-01-10 18:55 |只看該作者
回復 2# EZWORD


自認為技術人員的我表達看來真有問題。不好意思,可能我沒表達清楚我的困惑之處。

就以上面的schedule_timeout_interruptible函數(shù)為例。
如果內核代碼(包括驅動代碼)調用此函數(shù),在__set_current_state(TASK_INTERRUPTIBLE)之前被搶占,調度程序將當前進程放入可執(zhí)行隊列(狀態(tài)還是TASK_RUNNING,沒疑問),執(zhí)行調度程序。因為是放在可執(zhí)行隊列,再次調度沒什么疑問。
如果程序沒有被搶占,在__set_current_state(TASK_INTERRUPTIBLE)之后啟動完定時器,然后執(zhí)行調度程序。調度程序把當前進程放入等待隊列(什么等待隊列我不關心),調度程序暫時是不會調度此進程繼續(xù)運行的。當定時器時間到了之后會把當前進程狀態(tài)設置為TASK_RUNNING,然后放入可執(zhí)行隊列。沒有疑問。

我的困惑是:如果搶占發(fā)生在__set_current_state(TASK_INTERRUPTIBLE)之后,當然定時器還沒設置完,調度程序如何處理的……
當然所有的這一切都要求允許搶占,是否可以搶占我也不確定。但我覺得設置完__set_current_state(TASK_INTERRUPTIBLE),產生中斷,要求調度以及沒有占有鎖兩個條件同時滿足應該是大有可能的。

論壇徽章:
0
4 [報告]
發(fā)表于 2011-01-10 19:26 |只看該作者
我的理解是:進程能不能被調度,并不在于它的狀態(tài)是不是TASK_RUNNING,而在于它在不在運行隊列里面。
__set_current_state(TASK_INTERRUPTIBLE)之后,進程依然在運行隊列里面,所以它還有機會被調度。
進程要到什么時候才會被移出運行隊列呢?是在schedule函數(shù)里面,如果發(fā)現(xiàn)進程狀態(tài)不是TASK_RUNNING,則移出運行隊列。而在schedule里面,搶占是被禁止的,并且還要對運行隊列上鎖。

論壇徽章:
0
5 [報告]
發(fā)表于 2011-01-10 19:45 |只看該作者
回復 4# kouu


謝謝指教!

如果搶占發(fā)生在__set_current_state(TASK_INTERRUPTIBLE)之后,當然定時器還沒設置完,說白了,就是調度程序運行了,鎖住什么不關心,調度程序執(zhí)行的時候肯定不能也不需要再執(zhí)行調度程序。此時發(fā)現(xiàn)當前進程狀態(tài)不是TASK_RUNNING,把它移出隊列(當然,在此是不是要詳加判斷其他條件我不清楚),可是定時器還沒開啟,那豈不是不能設置回TASK_RUNNING,這應該不是真實的結果吧。

論壇徽章:
0
6 [報告]
發(fā)表于 2011-01-10 20:10 |只看該作者
本帖最后由 EZWORD 于 2011-01-10 20:11 編輯

神馬啊,設置完了狀態(tài),又沒有移出運行隊列,除非掉用那個schedule_timeout,其代碼如下:

  1.         signed long schedule_timeout(signed long timeout)
  2. {
  3. timer_t timer;
  4. unsigned long expire;

  5. switch (timeout)
  6. {
  7. case MAX_SCHEDULE_TIMEOUT:
  8. schedule();//此處必須自己去喚醒這個任務。
  9. goto out;
  10. default:
  11. if (timeout < 0)
  12. {
  13. printk(KERN_ERR “schedule_timeout: wrong timeout “
  14. “value %lx from %p\n”, timeout,
  15. __builtin_return_address(0));
  16. current->state = TASK_RUNNING;
  17. goto out;
  18. }
  19. }
  20. expire = timeout + jiffies;
  21. init_timer(&timer);
  22. timer.expires = expire;
  23. timer.data = (unsigned long) current;
  24. timer.function = process_timeout;
  25. add_timer(&timer);
  26. schedule();//再次調度時返回位置
  27. del_timer_sync(&timer);
  28. timeout = expire - jiffies;
  29. out:
  30. return timeout < 0 ? 0 : timeout;
  31. }

復制代碼

論壇徽章:
0
7 [報告]
發(fā)表于 2011-01-10 20:24 |只看該作者
回復 6# EZWORD


不是呀,哥們,我的困惑不在于正常執(zhí)行完畢,在于如果有搶占!設置完了狀態(tài),定時器還沒有設置完成,在此發(fā)生搶占,搶占實際上就是調用schedule()找到優(yōu)先級最高的進程進行切換(這個我理解不知道有沒有問題?),當前進程狀態(tài)不是TASK_RUNNING,切換的進程比當前進程優(yōu)先級高,這樣的情況是調度程序如何處理的?原進程是放在運行隊列還是等待隊列?因為我覺得放哪都有問題,困惑在于此!

論壇徽章:
0
8 [報告]
發(fā)表于 2011-01-10 20:36 |只看該作者
你的這個定時器不是指上面代碼的22-25行?

論壇徽章:
0
9 [報告]
發(fā)表于 2011-01-10 20:43 |只看該作者
本帖最后由 azfa123 于 2011-01-10 20:47 編輯

回復 8# EZWORD

是呀,這個很關鍵嗎?設置完狀態(tài)和定時器操作完成并非原子的,如果搶占發(fā)生在21,22,23,24,25甚至26里面,如何處理的……

論壇徽章:
0
10 [報告]
發(fā)表于 2011-01-10 21:14 |只看該作者
不關鍵,關鍵在的在于它還在運行隊列中。。。。
個人理解,呵呵,其實我也不是很懂
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP