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

  免費注冊 查看新帖 |

Chinaunix

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

[CPU及多核] 中斷返回與調(diào)度救助 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2015-01-06 11:46 |只看該作者 |倒序瀏覽
各位大神有沒有搞匯編或懂底層的高人。有個問題困擾了蠻久
如能回答不勝感激

中斷返回與進程調(diào)度的區(qū)別是什么?
我這里主要指的是smp環(huán)境下的狀態(tài)恢復(fù)

比如中斷打斷當(dāng)前運行的環(huán)境包括兩種
1.當(dāng)前運行在進程上下文
2.當(dāng)前運行在軟中斷上下文
中斷處理的一般步驟為:保存cpu寄存器 和 堆棧等--->切換到中斷處理--->中斷處理完成--->恢復(fù)cpu環(huán)境
那么這個恢復(fù)cpu環(huán)境的過程,有沒有可能發(fā)生cpu的切換。又是如何控制的?
比如軟中斷一般的理解是“誰觸發(fā),誰執(zhí)行”,就是說軟中斷執(zhí)行過程中不會跨cpu。而開啟smp的同個進程,卻又是可以跨cpu的。
那么針對軟中斷 和 進程 被中斷后的恢復(fù),是否可能發(fā)生cpu的切換?


還有針對以上問題。調(diào)度又是如何處理的。現(xiàn)在一般都是 搶占式內(nèi)核
那么如果進程a 被進程b給打斷,也是  保存cpu寄存器 和 堆棧等--->切換到進程b--->進程b完成,重新調(diào)度--->恢復(fù)cpu環(huán)境
這種流程嗎。應(yīng)該不對吧。感覺很奇怪


還有中說法是,系統(tǒng)堆棧是 per cpu結(jié)構(gòu)。所以從這個理解,中斷返回后,中斷前的環(huán)境肯定只能恢復(fù)到原來的cpu上
而這種說法同時認為 cpu的負載均衡,是通過調(diào)度器拉實現(xiàn)的。那么這種拉 指的是per cpu變量的copy 和 刪除嗎?

論壇徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辭舊歲徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亞洲杯之卡塔爾
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08處女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技術(shù)圖書徽章
日期:2014-03-25 09:00:29
2 [報告]
發(fā)表于 2015-01-06 14:15 |只看該作者
看似有點亂,呵呵~

中斷返回是進程調(diào)度的一個時機點,這兩者并非并列的概念。進程調(diào)度通常發(fā)生在:
1、中斷、異常、系統(tǒng)調(diào)用返回處。
2、wakeup和手工調(diào)用schedule的地方
其中中斷返回時,進行系統(tǒng)調(diào)度,是進程調(diào)度發(fā)生最頻繁的地方,因為調(diào)度主要依賴于時鐘中斷(一般來說哈)。具體的代碼可以看看entry_xx.S匯編代碼。

"中斷處理的一般步驟為:保存cpu寄存器 和 堆棧等--->切換到中斷處理--->中斷處理完成--->恢復(fù)cpu環(huán)境
那么這個恢復(fù)cpu環(huán)境的過程,有沒有可能發(fā)生cpu的切換。又是如何控制的?"
--- 這個應(yīng)該是不會發(fā)生CPU切換的,也就是說中斷處理過程中不會切換CPU(準確的說應(yīng)該是遷移)。

”比如軟中斷一般的理解是“誰觸發(fā),誰執(zhí)行”,就是說軟中斷執(zhí)行過程中不會跨cpu。而開啟smp的同個進程,卻又是可以跨cpu的。
那么針對軟中斷 和 進程 被中斷后的恢復(fù),是否可能發(fā)生cpu的切換?“
--- 首先軟中斷確實是“誰觸發(fā),誰執(zhí)行”,所以軟中斷通常不會發(fā)生CPU遷移;進程在被中斷后,在中斷返回時,有一個調(diào)度的時機點,如果此時沒發(fā)生調(diào)度,則返回原進程上下文執(zhí)行,此時應(yīng)該也不會遷移CPU;如果此時發(fā)生調(diào)度,則調(diào)度其它進程到當(dāng)前CPU運行,則原來的進程暫停運行,此時通常也不會遷移到其它CPU,除非有特殊的情況(如:cpu負載均衡將其拉倒其它CPU)。

”還有針對以上問題。調(diào)度又是如何處理的,F(xiàn)在一般都是 搶占式內(nèi)核
那么如果進程a 被進程b給打斷,也是  保存cpu寄存器 和 堆棧等--->切換到進程b--->進程b完成,重新調(diào)度--->恢復(fù)cpu環(huán)境
這種流程嗎。應(yīng)該不對吧。感覺很奇怪“
--- 剛才說的中斷返回只是調(diào)度的一個時機點,不是并行的概念。搶占式內(nèi)核比普通內(nèi)核來說,只能調(diào)度的時機點更多,但主要還是要依賴中斷返回,所以這里”進程a 被進程b給打斷“說法不對,b進程不能直接打斷a進程,能打斷a進程的只能是中斷或異常等情況,然后待中斷/異常返回時,進行調(diào)度,調(diào)度時檢查是否開啟了搶占,如果開啟,則能在內(nèi)核態(tài)發(fā)生調(diào)度。

”還有中說法是,系統(tǒng)堆棧是 per cpu結(jié)構(gòu)。所以從這個理解,中斷返回后,中斷前的環(huán)境肯定只能恢復(fù)到原來的cpu上
而這種說法同時認為 cpu的負載均衡,是通過調(diào)度器拉實現(xiàn)的。那么這種拉 指的是per cpu變量的copy 和 刪除嗎?“
--- 這里的”系統(tǒng)堆!罢f法也不準確,應(yīng)該是說的中斷棧吧?中斷棧的確是per cpu的,但內(nèi)核棧和用戶棧是per task的,因為Linux中對中斷進行了串行話處理,所以中斷通常不會嵌套,所以per cpu的中斷棧應(yīng)該不會有問題。中斷返回后會切換到進程的內(nèi)核棧,而內(nèi)核棧是per task的,上下文也是獨立的,所以被中斷的進程理論上是可以被拉到其它CPU上運行的(通常不會)。

請參考:
http://blog.chinaunix.net/uid-14528823-id-4739291.html
http://blog.chinaunix.net/uid-14528823-id-4740294.html


論壇徽章:
0
3 [報告]
發(fā)表于 2015-01-06 19:53 |只看該作者
回復(fù) 2# humjb_1983
多謝83兄的指導(dǎo)。說的很明白。尤其是per task棧的概念,以前完全沒這個概念。所以總是感覺明白了,深淺想?yún)s又糊涂

看你兩篇大作應(yīng)該是剛發(fā)出來的。還未審核通過。稍后一定拜讀

還有個問題不太明白。你也說了per task棧重新調(diào)度后。一般還是保持在原來的cpu上運行
這個很容易理解 可能是為了cache擊中考慮
但是既然非 per cpu結(jié)構(gòu),如何還能保證調(diào)度后還在原來的cpu上執(zhí)行,這個很難理解

當(dāng)然還有種說法 是 所有的棧都是per cpu的,所以負載均衡導(dǎo)致的切換,代價會很大。但至于如何切換倒是不慎明了
   

論壇徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辭舊歲徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亞洲杯之卡塔爾
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08處女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技術(shù)圖書徽章
日期:2014-03-25 09:00:29
4 [報告]
發(fā)表于 2015-01-07 08:46 |只看該作者
anyhit 發(fā)表于 2015-01-06 19:53
回復(fù) 2# humjb_1983
多謝83兄的指導(dǎo)。說的很明白。尤其是per task棧的概念,以前完全沒這個概念。所以總是 ...

每個CPU的調(diào)度是相對獨立運轉(zhuǎn)的,每個cpu都有自己的調(diào)度隊列,當(dāng)某task在某CPU上運行后,該task就位于該CPU相應(yīng)的調(diào)度隊列中了,在沒有特別情況時(如需要負載均衡),該task應(yīng)該一直在該CPU上運行的。

論壇徽章:
0
5 [報告]
發(fā)表于 2015-02-03 17:18 |只看該作者


中斷 和軟中斷,都是中斷,沒有進程上下文,不能發(fā)生調(diào)度
你可能跟ksoftirqd這個進程搞混了,他只是一個進程訪問了
全局的 softirq那個數(shù)組變量

ksoftirqd這個進程里面做了好多限制(就是你亂想的那些)
1》這個進程不會被搶占,除非自己聲明可以被搶占(看代碼是他沒有真正調(diào)用do_softirq的時候)
2》他也不會被調(diào)度,除非自己讓出CPU(調(diào)用schedule 看代碼)
3》他可以被中斷,但是中斷之后,他直接是進不了do_softirq函數(shù)的(do_softirq做了檢測),反回之后,被中斷的ksoftirqd進程 GO ON

1 2 要時不時讓出CPU,因為他要一直執(zhí)行下去(因有中斷可以打斷),其它進程沒法執(zhí)行了

論壇徽章:
0
6 [報告]
發(fā)表于 2015-02-03 17:19 |只看該作者
本帖最后由 wzw200 于 2015-02-03 17:19 編輯

blog.csdn.net/dianhuiren/article/details/7294408

http://

我沒有權(quán)限發(fā)URL,我這樣發(fā)吧

論壇徽章:
0
7 [報告]
發(fā)表于 2015-02-03 18:42 |只看該作者
回復(fù) 5# wzw200
你說的我是明白的。irq_exit 中調(diào)用do_softirq 時 會判斷in_interrupt 。若之前為軟中斷環(huán)境,in_interrupt 通不過就返回了

ksoftirqd的復(fù)雜實現(xiàn) 只是為了保證兩點 1.軟中斷不可被進程打斷的特性 2. 中斷誰觸發(fā)誰執(zhí)行的特性(通過綁定cpu實現(xiàn))

humjb_1983 兄說的是對的。我是沒搞清楚 “中斷棧,用戶棧” 這些概念

也就是中斷返回后。如何保證原先執(zhí)行的軟中斷 還在本來執(zhí)行的cpu上執(zhí)行。也就是說我對中斷“誰觸發(fā)誰執(zhí)行”的特性產(chǎn)生了疑問

而進程 被中斷后返回 ,跨cpu又是如何實現(xiàn)的。因為一般認為進程跨cpu調(diào)度,發(fā)生在中斷返回后

humjb_1983 兄說的中斷棧 是per cpu  而用戶棧 是 per task,可以解釋這些情況。但因為匯編較差,其實更深層次我還是未搞明白





   

論壇徽章:
0
8 [報告]
發(fā)表于 2015-02-03 18:50 |只看該作者
回復(fù) 6# wzw200
而你另外一個帖子。我還以為你也是對中斷“誰觸發(fā),誰執(zhí)行”等產(chǎn)生了疑問
因為軟中斷變量是 per cpu的32位數(shù),所以一旦 軟中斷執(zhí)行過程中跨cpu,就會發(fā)生沖突

可能是我理解錯了你的問題

論壇徽章:
0
9 [報告]
發(fā)表于 2015-02-03 18:54 |只看該作者
回復(fù) 5# wzw200

沒有真正調(diào)用 do_softirq 不知道你的意思是什么?

以下為我之前看的ksoftirqd執(zhí)行函數(shù),部分注釋是自己寫的,不知道是否正確


/*軟中斷維護內(nèi)核線程
每個處理器都有一個這樣的線程,命名為ksoftirqd/n*/
static int ksoftirqd(void * __bind_cpu)
{
    set_user_nice(current, 19);
    current->flags |= PF_NOFREEZE;
    set_current_state(TASK_INTERRUPTIBLE);
    while (!kthread_should_stop()) {
        preempt_disable(); //禁止搶占
        if (!local_softirq_pending()) {
            preempt_enable_no_resched();
            schedule();//調(diào)度其他進程執(zhí)行
            preempt_disable();
        }
        __set_current_state(TASK_RUNNING);//do_softirq中便不會重新**ksoftirqd(wakeup_softirqd會判斷當(dāng)前狀態(tài))
        while (local_softirq_pending()) {      
              /*禁止搶占會停止讓CPU下線,如果已經(jīng)下線,那么就
              正在一個錯誤的CPU上,那么就不要執(zhí)行
               goto wait_to_die
            */
            /* Preempt disable stops cpu going offline.
               If already offline, we'll be on wrong CPU:
               don't process */
            if (cpu_is_offline((long)__bind_cpu))
                goto wait_to_die;
            do_softirq();    // 執(zhí)行軟中斷
            preempt_enable_no_resched();// 可以搶占
            cond_resched();   // 確保對當(dāng)前進程設(shè)置了TIE_NEED_RESCHED . 因為所有這些函數(shù)執(zhí)行時都啟用了硬件中斷
            preempt_disable();//禁止搶占
        }
        preempt_enable();
        set_current_state(TASK_INTERRUPTIBLE);
    }
    __set_current_state(TASK_RUNNING);
    return 0;
wait_to_die:
    preempt_enable();
    /* Wait for kthread_stop  等待kthread_stop停止 */
    set_current_state(TASK_INTERRUPTIBLE);//可搶占
    while (!kthread_should_stop()) {
        schedule();//顯示調(diào)度
        set_current_state(TASK_INTERRUPTIBLE);
    }
    __set_current_state(TASK_RUNNING);
    return 0;
}


   

論壇徽章:
0
10 [報告]
發(fā)表于 2015-02-03 20:33 |只看該作者
本帖最后由 wzw200 于 2015-02-03 21:04 編輯

  也就是中斷返回后。如何保證原先執(zhí)行的軟中斷 還在本來執(zhí)行的cpu上執(zhí)行。也就是說我對中斷“誰觸發(fā)誰執(zhí)行”的特性產(chǎn)生了疑問

我先回這個問題,不知道我說的對不對,
do_softirq 這個函數(shù)是所有CPU都可以調(diào)用的
你再向下跟代碼就會發(fā)現(xiàn)tasklet_hi_action之類的函數(shù)里面都用了每CPU變量
用tasklet_schedule函數(shù)都加到每CPU變量里面

中斷返回后,別的CPU也只是執(zhí)行自己 每CPU變量的 BH,多CPU的就不是一個變量,你想想,會沖突嗎,
不知道你明白了沒有

open_softirq(NET_TX_SOFTIRQ, net_tx_action);
open_softirq(NET_RX_SOFTIRQ, net_rx_action);
open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq);
open_softirq(int nr, void (*action)(struct softirq_action *))
open_softirq(TASKLET_SOFTIRQ, tasklet_action);
open_softirq(HI_SOFTIRQ, tasklet_hi_action);
open_softirq(TIMER_SOFTIRQ, run_timer_softirq);

深入Linux設(shè)備驅(qū)動程序內(nèi)核機制.pdf 這本書的
第6章  tasklet,你看明白了,就知道了
http://
www.
cnblogs.com/hustcat/archive/2009/08/15/1546601.html
YY哥的中斷三編,你可以看看

因為軟中斷變量是 per cpu的32位數(shù) 這個不是每CPU變量
softirq_vec 不是每CPU變量
raise_softirq_irqoff-》__raise_softirq_irqoff(nr)-》or_softirq_pending-再向下跟,pending是每CPU變量
tasklet_hi_action的鏈表是每CPU變量

do_softirq
{
     查看自己的每CPU變量pending
     tasklet_hi_action
           開始用每CPU變量
}
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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