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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12
最近訪問板塊 發(fā)新帖
樓主: anyhit
打印 上一主題 下一主題

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

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

你現(xiàn)在把 ksoftirqd想成是一個進(jìn)程
    do_softirq想成是一個全局變量,do_softirq函數(shù)本身實現(xiàn)了多CPU的互斥(互斥我們想成原子操作)

ksoftirqd函數(shù)中沒有調(diào)用do_softirq的時候,可以被調(diào)度走,



   

論壇徽章:
0
12 [報告]
發(fā)表于 2015-02-04 10:34 |只看該作者
回復(fù) 11# wzw200
首先非常感謝你的回復(fù)。但其實還不是我的疑惑

ksoftirqd是內(nèi)核線程。運行在進(jìn)程上下文。同時他用一些機制,保證了執(zhí)行do_softirq時軟中斷的一切特性(通過綁定cpu ,禁下半部,禁調(diào)度等實現(xiàn))。否者ksoftirqd調(diào)用do_softirq時還跟普通進(jìn)程一樣,對開發(fā)者是很麻煩的,比如鎖機制就不同了(中斷中的鎖不能隨眠,進(jìn)程上下文可以睡眠)


do_softirq 是一個函數(shù),分配內(nèi)存在代碼段,且固定不變(詳細(xì)可以了解下elf文件等)


        asmlinkage void __do_softirq(void)
{
        struct softirq_action *h;
        __u32 pending;
        int max_restart = MAX_SOFTIRQ_RESTART;
        int cpu;

        pending = local_softirq_pending();
        account_system_vtime(current);

        __local_bh_disable((unsigned long)__builtin_return_address(0));
        lockdep_softirq_enter();

        cpu = smp_processor_id();
restart:
        /* Reset the pending bitmask before enabling irqs */
        set_softirq_pending(0);

        local_irq_enable();
        h = softirq_vec;

因為pending  取到了 per cpu的變量(pending是局部變量,所以他本身就是在棧中分配空間)
那么若開中斷后被打斷了執(zhí)行

這時候cpu會保存環(huán)境和堆棧 。比如 cpu寄存器環(huán)境,當(dāng)前代碼地址寄存器 值(假設(shè)運行在cpu1)等壓棧

等中斷結(jié)束了
若這些堆棧 恢復(fù)到之前執(zhí)行的cpu1,那么ok沒問題
但是若被恢復(fù)到了另外一個cpu2上,問題就來了。因為pending 已經(jīng)取得了per cpu變量,所以其實是cpu2 執(zhí)行cpu1的軟中斷

對于對稱處理器系統(tǒng)
從理論上來說 中斷環(huán)境是不允許上面的情況發(fā)生的
但是進(jìn)程環(huán)境完全可以允許這么做。且這么做后,可以減少跨cpu的開銷。比如
task1運行在cpu1---》被中斷---》task1恢復(fù)到cpu1----》task1調(diào)度到cpu2
task1運行在cpu1---》被中斷---》task1恢復(fù)到cpu2
第二種情況就少了一次跨cpu的開銷

當(dāng)然實際中考慮到cache擊中等可能沒那么簡單


那么具體是如何實現(xiàn)的。我是這里產(chǎn)生了疑問

現(xiàn)在只是進(jìn)一步確定了 軟中斷不會跨cpu,對開發(fā)來說就沒什么影響了,但其實更深層的疑問并沒有消除

論壇徽章:
0
13 [報告]
發(fā)表于 2015-02-05 15:07 |只看該作者
本帖最后由 wzw200 于 2015-02-05 15:12 編輯

回復(fù) 12# anyhit


    你的問題我沒有看明白了,不過我覺得你現(xiàn)在是鉆一個地方出不來了

你從原生的 irq_enter() irq_exit()看好理解點,
還有什么時候才可以調(diào)度這類的,跟你那個HIT有什么關(guān)系

task1運行在cpu1---》被中斷---》task1恢復(fù)到cpu2
這個是不是你自己想出來的

task1這個在task_schedule的時候,就注定他只能在一個CPU上運行了,
我跟你說的那本書你看了沒。?

論壇徽章:
0
14 [報告]
發(fā)表于 2015-02-06 10:10 |只看該作者
回復(fù) 13# wzw200

你的問題我沒有看明白了,不過我覺得你現(xiàn)在是鉆一個地方出不來了
其實有些問題,你不知道也沒關(guān)系。但總感覺如鯁在喉 不太爽


你從原生的 irq_enter() irq_exit()看好理解點,
這個還沒到我產(chǎn)生問題的哪層。我產(chǎn)生問題的那層。在irq_exit之后

還有什么時候才可以調(diào)度這類的,跟你那個HIT有什么關(guān)系
調(diào)度一般發(fā)生在
從中斷返回 用戶空間
從中斷返回 內(nèi)核空間(開搶占)
從異常(系統(tǒng)調(diào)用)返回用戶空間
這個幾乎上所有資料都是一致的


task1運行在cpu1---》被中斷---》task1恢復(fù)到cpu2
這個是不是你自己想出來的
是我想出來的。但我搜集到的資料也是兩種聲音。而且如果排除per cpu等競爭資源的訪問,從理論上有什么不合理呢?

task1這個在task_schedule的時候,就注定他只能在一個CPU上運行了,
其實這個跟我的理解是一致的
就是說 只有調(diào)度了才會發(fā)生cpu的切換。否者per cpu變量的獲取就很危險了
而中斷由于沒法調(diào)度。所以不會發(fā)生cpu的切換。那么問題來了,軟中斷的SMP負(fù)載均衡是如何實現(xiàn)的。這個是我下一步要研究的

這個也是大多數(shù)資料的理解。
我搜集的資料包括兩種方向
1.調(diào)度才會有cpu的切換 2.中斷的恢復(fù)就會有cpu的切換
當(dāng)然cpu的切換是非常復(fù)雜的。一般認(rèn)為能不切換就不切換。否者萬一cache不一致。訪存的消耗就成了瓶頸。關(guān)于這個做過一些實際的測試,處理某些頻繁的單一任務(wù)的時候,開SMP性能反而下降


我跟你說的那本書你看了沒。。
這個有空我了解下,F(xiàn)在確實很難看大部頭的書了。因為很多時候,時間消耗了,發(fā)現(xiàn)不是自己想要的
   

論壇徽章:
0
15 [報告]
發(fā)表于 2015-02-06 13:53 |只看該作者
回復(fù) 13# wzw200
重新整理了下思路 和搜了下資料。更明白了些。這里分享出來。

http://
blog.csdn.net/shaohaigod1981/article/details/4768449
從中斷返回,也就是irq_exit之后
ENTRY(ret_from_intr)
        GET_CURRENT(%ebx)
ret_from_exception:
         movl EFLAGS(%esp),%eax          # mix EFLAGS and CS
         movb CS(%esp),%al
         testl $(VM_MASK | 3),%eax       # return to VM86 mode or non-supervisor?
         jne ret_from_sys_call
         jmp restore_all

果中斷發(fā)生在內(nèi)核空間,則控制權(quán)直接轉(zhuǎn)移到標(biāo)號restore_all。如果中斷發(fā)生于用戶空間(或VM86模式),則轉(zhuǎn)移到ret_from_sys_call:


ENTRY(ret_from_sys_call)
         cli                             # need_resched and signals atomic test
         cmpl $0,need_resched(%ebx)
         jne reschedule
         cmpl $0,sigpending(%ebx)
         jne signal_return
restore_all:
         RESTORE_ALL
need_resched(%ebx)表示當(dāng)前進(jìn)程task_struct結(jié)構(gòu)中偏移量need_resched處的內(nèi)容,如果調(diào)度標(biāo)志為非0,說明需要進(jìn)行調(diào)度,則去調(diào)用schedule()

__schedule
中                idle_balance(cpu, rq); 負(fù)責(zé)smp下的cpu切換(負(fù)載均衡)
context_switch 負(fù)責(zé)切換到新的進(jìn)程。switch_to負(fù)責(zé)堆棧等恢復(fù)

再結(jié)合83兄的兩文章
應(yīng)該就能搞懂了。后面再看下堆;謴(fù)相關(guān)的
   

論壇徽章:
0
16 [報告]
發(fā)表于 2015-02-09 21:01 |只看該作者
回復(fù) 14# anyhit


    LINUX內(nèi)核為了設(shè)計操作系統(tǒng)方便,自己做了好多限制,
我也是看的別人的帖子,
您需要登錄后才可以回帖 登錄 | 注冊

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