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

  免費注冊 查看新帖 |

Chinaunix

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

[進(jìn)程管理] 關(guān)于linux內(nèi)核搶占的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-06-05 12:42 |只看該作者 |倒序瀏覽
關(guān)于linux內(nèi)核搶占的問題:
在不支持內(nèi)核搶占中:
如果中斷發(fā)生在內(nèi)核中,本次中斷返回是不會引起調(diào)度的,而要到最初使CPU從用戶空間進(jìn)入內(nèi)核空間的那次系統(tǒng)調(diào)用或中斷(異常)返回時才會發(fā)生調(diào)度。
這句話正確嗎?
或者 什么時候 引起調(diào)度!
附:編譯內(nèi)核的時候可選擇 配制成 可搶占 或 不可搶占!

論壇徽章:
0
2 [報告]
發(fā)表于 2012-06-05 13:21 |只看該作者
錯~
如果是從異常返回的話。Cli禁止中斷。(中斷返回時,本地中斷是禁止的)
1.        確定要返回到內(nèi)核態(tài)還是用戶態(tài)。
2.        如果是返回到內(nèi)核態(tài)的話:
resume_kernel:
cli
cmpl $0, 0x14(%ebp)  //檢查是否可以搶占thread_info->preempt_count
jz need_resched

restore_all:
popl %ebx
popl %ecx
popl %edx
popl %esi
popl %edi
popl %ebp
popl %eax
popl %ds
popl %es
addl $4, %esp
iret          //中斷和異常退出的硬件處理過程

need_resched:
movl 0x8(%ebp), %ecx
testb $(1<<TIF_NEED_RESCHED), %cl
jz restore_all  //如果falgs沒有設(shè)置TIF_NEED_RESCHED,不需要搶占
testl $0x00000200,0x30(%esp)
jz restore_all //如果正在禁用本地CPU,不需要搶占
call preempt_schedule_irq //打開本地中斷,調(diào)用preempt_schedule,進(jìn)行搶占
jmp need_resched
3.        如果是返回到用戶態(tài)的話:
resume_userspace:
cli
movl 0x8(%ebp), %ecx
andl $0x0000ff6e, %ecx //檢查flags是否只設(shè)置了某些標(biāo)志
je restore_all
jmp work_pending

work_pending:
testb $(1<<TIF_NEED_RESCHED), %cl
jz work_notifysig //如果falgs沒有設(shè)置TIF_NEED_RESCHED,不需要調(diào)度

work_resched:
call schedule      //進(jìn)程調(diào)度
cli
jmp resume_userspace

work_notifysig:   //處理掛起的信號,虛擬8086和單步執(zhí)行
movl %esp, %eax
testl $0x00020000, 0x30(%esp)
je 1f
work_notifysig_v86:
pushl %ecx
call save_v86_state
popl %ecx
movl %eax, %esp
1:
xorl %edx, %edx
call do_notify_resume
jmp restore_all

restore_all:
popl %ebx
popl %ecx
popl %edx
popl %esi
popl %edi
popl %ebp
popl %eax
popl %ds
popl %es
addl $4, %esp
iret          //中斷和異常退出的硬件處理過程

注意:不管返回到內(nèi)核態(tài)還是返回到用戶態(tài),都會試圖進(jìn)行進(jìn)程調(diào)度。在返回內(nèi)核態(tài)進(jìn)行進(jìn)程調(diào)度就叫做內(nèi)核搶占。在返回用戶態(tài)進(jìn)行進(jìn)程調(diào)度屬于普通進(jìn)程調(diào)度。它們都會檢查current->thread_info->flags 的TIF_NEED_RESCHED標(biāo)志是否需要進(jìn)行進(jìn)程調(diào)度。但是返回內(nèi)核態(tài)的時候,額外的需要檢查current->thread_info->preempt_count的內(nèi)核搶占位確定是否可以進(jìn)行內(nèi)核搶占。

論壇徽章:
0
3 [報告]
發(fā)表于 2012-06-05 13:40 |只看該作者

多謝,沒有研究這么深,看來還要學(xué)習(xí)一下關(guān)于進(jìn)程調(diào)度方面的知識。。。thks

論壇徽章:
0
4 [報告]
發(fā)表于 2012-06-05 15:53 |只看該作者
回復(fù) 3# zhuqing_739
在不支持內(nèi)核搶占中,進(jìn)程時間片用完,由于資源原因放棄cpu,進(jìn)程結(jié)束等情況會發(fā)生切換。

   

論壇徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
5 [報告]
發(fā)表于 2012-06-10 21:13 |只看該作者
回復(fù) 2# blake326
current->thread_info->flags 的TIF_NEED_RESCHED標(biāo)志是如何被設(shè)置的?
以前這一標(biāo)志是全局變量,如果代碼認(rèn)為某個事件可能導(dǎo)致reschedule,就在全局變量里設(shè)置這一標(biāo)志;
現(xiàn)在這一標(biāo)志被挪到了task_struct, 那就是說在系統(tǒng)的任何地方,如果某個事件可能導(dǎo)致reschedule, 就要設(shè)置current task_struct的這一標(biāo)志。問題是current task_struct是否隨時可以access?

   

論壇徽章:
2
CU十二周年紀(jì)念徽章
日期:2013-10-24 15:41:34處女座
日期:2013-12-27 22:22:41
6 [報告]
發(fā)表于 2012-06-10 21:17 |只看該作者
current宏很有名的啊。

論壇徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
7 [報告]
發(fā)表于 2012-06-11 00:15 |只看該作者
回復(fù) 6# tempname2
是有名,但是是不是任何情況下都可以操作?
如果cpu b引起cpu a context switch(如果不是通過中斷方式), 那么如何設(shè)置cpu a的CURRENT這一標(biāo)志?

   

論壇徽章:
0
8 [報告]
發(fā)表于 2012-06-11 10:32 |只看該作者
本帖最后由 blake326 于 2012-06-11 10:32 編輯

回復(fù) 5# linuxfellow


一般是在cfs調(diào)度時候設(shè)置的。
具體來說,調(diào)度具體分:

1. cfs正常調(diào)度,hrtick() hrtimer定時器,  cfs在enqueue_task,dequeue_task一些工作之后,可能需要設(shè)置下次中斷時間。在hrtick中直接resched_task進(jìn)行調(diào)度。

2. fork新創(chuàng)建一個進(jìn)程。一般來說會交換父子進(jìn)程的虛擬時間,那么就會直接調(diào)用resched_task進(jìn)行調(diào)度。

3. wakeup一個進(jìn)程,一般會補(bǔ)償虛擬時間。通過check_preempt_wakeup,如果需要重新調(diào)度則調(diào)用resched_task進(jìn)行調(diào)度。


resched_task設(shè)置了TIF_NEED_RESCHED,在中斷或者異常返回時適當(dāng)?shù)倪M(jìn)行搶占或者調(diào)度。

暫時就想到這么多,歡迎補(bǔ)充糾正。


------------------------------------------------------------------------------------------------------------
如果cpu b引起cpu a context switch(如果不是通過中斷方式), 那么如何設(shè)置cpu a的CURRENT這一標(biāo)志?
不可能把,cpu b wakeup一個進(jìn)程都是到cpu b上的吧, 應(yīng)該沒有你說的這種狀況把》

論壇徽章:
3
15-16賽季CBA聯(lián)賽之山東
日期:2016-10-30 08:47:3015-16賽季CBA聯(lián)賽之佛山
日期:2016-12-17 00:06:31CU十四周年紀(jì)念徽章
日期:2017-12-03 01:04:02
9 [報告]
發(fā)表于 2012-06-12 05:22 |只看該作者
回復(fù) 7# linuxfellow


    嗯, 看了一下. 你的問題是resched_task標(biāo)志如何被設(shè)置, 這個和何時會進(jìn)行調(diào)度是兩回事. flag被設(shè)置成TIF_NEED_RESCHED是在發(fā)生調(diào)度之前, 只要是在調(diào)度之前, 任何時候設(shè)置(當(dāng)然如LS所言, 設(shè)置flag也是有時機(jī)的)都是可以的. current宏只要是在進(jìn)程上下文中都可以訪問, 中斷上下文中不可以. 對于smp的情況, 以前貌似是一個全局的運行隊列, 現(xiàn)在每個cpu都有自己的運行隊列, 所以每個cpu都有自己獨立的進(jìn)程上下文, 假設(shè)兩個CPU同時訪問current宏, 那是不一樣的進(jìn)程上下文.
    個人愚見, 磚頭輕拍.

論壇徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
10 [報告]
發(fā)表于 2012-06-12 09:42 |只看該作者
回復(fù) 9# captivated
就是
PREEMPT可以有下面4種情況觸發(fā):
1 中斷(硬中斷或軟中斷)
2 一些函數(shù)觸發(fā), 如spin_unlock
3 進(jìn)程主動調(diào)用schedule
4. 進(jìn)程阻塞,被迫調(diào)用schedule

2,3,4都是運行在process stack上時發(fā)生,用CURRENT可以方便找到當(dāng)前task_struct,然后設(shè)置flag
1運行在irq stack,如果isr調(diào)用try_to_wakeup_process去喚醒一個優(yōu)先級高的進(jìn)程,這時候如何找到被中斷的current task_struct來設(shè)置這一標(biāo)志?

   
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP