chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

線程是如何靠中斷切換的呢

冬至配餃子 ? 來(lái)源:天奇工作室 ? 作者:LRC ? 2022-08-02 18:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上一次的大合集我們從半導(dǎo)體講到了邏輯門,再?gòu)倪壿嬮T講到了組合邏輯電路和時(shí)序邏輯電路,又緊接著介紹了CPU內(nèi)核的設(shè)計(jì)體系,最后以CPU的指令集作為結(jié)尾,一個(gè)CPU已經(jīng)頗具雛形。

經(jīng)過(guò)11-19章的更新,我們又介紹了線程和進(jìn)程,處理器的中斷和異常、特權(quán)模式以及最主要的緩存。我將用更清楚連貫的語(yǔ)言將這些內(nèi)容重新串講一次,幫助大家更好地理解,當(dāng)然這也是大合集的本來(lái)初衷。

下面開始。

首先是線程和進(jìn)程。早期的計(jì)算機(jī)在一段時(shí)間內(nèi)只能運(yùn)行一段代碼,比如計(jì)算導(dǎo)彈軌跡,計(jì)算完了出結(jié)果就好了。這也是計(jì)算機(jī)最本來(lái)最初級(jí)的用法。但是隨著計(jì)算機(jī)不斷發(fā)展,尤其是人民生活水平的不斷提高,計(jì)算機(jī)這樣的用法實(shí)在是有些過(guò)于枯燥了。比如我想邊用計(jì)算機(jī)聽歌的同時(shí)打下這段文字,就需要計(jì)算機(jī)能同時(shí)做兩件事,于是人們就發(fā)明了線程,而線程之間通過(guò)少量的必要的溝通可以組合形成一個(gè)進(jìn)程,也就是我們通常意義上的應(yīng)用程序。比如說(shuō)音樂(lè)播放器中,音樂(lè)的播放是一個(gè)線程,用戶的操作界面是另外一個(gè)線程,兩個(gè)線程合起來(lái)構(gòu)成了音樂(lè)播放器。當(dāng)然,一個(gè)應(yīng)用程序(進(jìn)程)也可以只有一個(gè)線程。每個(gè)線程包括系統(tǒng)線程都被劃定了一個(gè)空間,并且高權(quán)限線程(系統(tǒng)線程)能訪問(wèn)低權(quán)限線程(應(yīng)用程序)的空間,低權(quán)限線程只能訪問(wèn)屬于自己的空間,不然病毒線程將大行其道。所以線程的一個(gè)基本屬性需要在CPU中被明確記錄的是權(quán)限等級(jí)。

對(duì)于計(jì)算機(jī)系統(tǒng)或者CPU來(lái)說(shuō),越值得信賴的線程的權(quán)限等級(jí)是越高的。什么是越值得信賴的線程呢?計(jì)算機(jī)本身的操作系統(tǒng)肯定是值得信賴的,畢竟如果連操作系統(tǒng)都不能信賴,還有什么值得信賴?不過(guò)操作系統(tǒng)雖然值得信賴,但本身肯定多多少少存在一些Bug,不然Windows也不會(huì)天天藍(lán)屏了,但是對(duì)于CPU來(lái)講,操作系統(tǒng)即使有無(wú)心的錯(cuò)誤,但肯定不會(huì)是有害的錯(cuò)誤。

那么權(quán)限等級(jí)能決定什么呢?能決定這個(gè)線程能訪問(wèn)哪些內(nèi)容。

話說(shuō)回來(lái),早期的那個(gè)計(jì)算導(dǎo)彈的程序在現(xiàn)在看來(lái)就可以算是一個(gè)線程。而具體是如何做到并行處理的呢?看過(guò)三體的同學(xué)應(yīng)該都知道三體人是怎么用一顆智子封鎖地球科技的,靠的就是智子光速來(lái)回穿梭干擾在位于地球各處的高能粒子對(duì)撞機(jī)。因?yàn)橹亲铀俣忍炝耍灾恍枰活w就能封鎖整個(gè)地球的科技。CPU也是同理,隨著CPU性能的提升,它也可以快速來(lái)回切換并處理不同的線程,底層都是串行的,但給我們的感覺(jué)卻是并行的。

當(dāng)然隨著科技的進(jìn)一步發(fā)展,CPU的核心數(shù)早已從單核心變成了多核心,甚至在一些服務(wù)器里我們還能見到多CPU的主板,所以依靠多個(gè)CPU核心,現(xiàn)在也能實(shí)現(xiàn)真正意義上的并行,不過(guò)線程數(shù)總是多于CPU核心數(shù),因此線程的切換即使到了今天也是一直在用的。

那么線程是如何切換的呢?最常見的就是靠中斷了。中斷顧名思義,做到中間的時(shí)候被打斷了,有更高優(yōu)先級(jí)的人物需要處理。什么被打斷了?當(dāng)前執(zhí)行的線程被打斷了。被什么打斷了?不好說(shuō),有可能是定時(shí)時(shí)鐘,有可能是你敲擊的鍵盤或你移動(dòng)的鼠標(biāo),有可能是某一個(gè)線程自己發(fā)出來(lái)的“軟中斷”。為什么要有中斷?就我個(gè)人理解,中斷是人與電腦進(jìn)行實(shí)時(shí)交互的窗口,沒(méi)有中斷就像你沒(méi)有鼠標(biāo)和鍵盤,啥也做不了。但是中斷并不是只有人可以用,計(jì)算機(jī)本身也能用,只要是優(yōu)先級(jí)更高的任務(wù)需要介入就可以用。

所以線程是如何靠中斷切換的呢?

第一個(gè)方法,我稱之為被動(dòng)切換。系統(tǒng)里的計(jì)時(shí)器會(huì)對(duì)該線程計(jì)時(shí),時(shí)間差不多了(大概是5ms左右,看系統(tǒng)設(shè)定)就該把CPU讓位置出來(lái)給另一個(gè)線程了。具體過(guò)程是,當(dāng)系統(tǒng)時(shí)鐘達(dá)到設(shè)定的時(shí)間時(shí),向CPU發(fā)送一個(gè)中斷信號(hào),CPU將現(xiàn)在線程的上下文作為棧保存在內(nèi)存中,暫時(shí)儲(chǔ)存起來(lái),同時(shí)將pc寄存器跳轉(zhuǎn)到內(nèi)存中存有中斷服務(wù)例程的入口處,執(zhí)行中斷服務(wù)例程的程序,程序會(huì)查找得知中斷來(lái)源(這一步在高級(jí)的CPU上可以用硬件實(shí)現(xiàn)從而省略軟件查找的過(guò)程),進(jìn)而跳轉(zhuǎn)到系統(tǒng)調(diào)度線程,這個(gè)線程會(huì)根據(jù)執(zhí)行情況將一個(gè)新線程調(diào)度到CPU上執(zhí)行,自己則退隱。從而實(shí)現(xiàn)線程的切換。

第二個(gè)辦法,我稱之為主動(dòng)切換。當(dāng)本線程沒(méi)事干了,或者說(shuō)在等另一邊的結(jié)果,那么這個(gè)時(shí)候就會(huì)執(zhí)行一個(gè)軟中斷,自覺(jué)地把線程讓出來(lái)(要是不自覺(jué)就沒(méi)辦法了),流程和上面一致,只不過(guò)中斷源不再是時(shí)鐘了,而是線程本身,稱之為軟(軟件)中斷。

還有一種辦法不是靠中斷切換線程,也可以并行處理的一種技術(shù)叫做超線程技術(shù)。這個(gè)技術(shù)是Intel率先提出來(lái)的,他們聲稱增加5%的晶體管數(shù)量可以提升20%的性能。

可以理解為如果當(dāng)前線程沒(méi)事干,而且這個(gè)線程“不自覺(jué)退出”,那么硬件直接介入讓另外一個(gè)線程運(yùn)行。與上面靠中斷的第二種方法不同的是,這種切換是CPU硬件自發(fā)的,操控粒度可以更細(xì)(前者只能在軟件層面判斷是否會(huì)有空閑情況發(fā)生,后者則能在硬件層面監(jiān)控,硬件發(fā)生堵塞情況軟件是無(wú)法知道的),智能程度會(huì)更高,線程切換的過(guò)程消耗也會(huì)更小。如此一來(lái),CPU可以在本該空等的地方擇機(jī)執(zhí)行另外一個(gè)線程的指令,實(shí)現(xiàn)了時(shí)間管理,縮短了兩個(gè)程序執(zhí)行的總體時(shí)間。

上文中提到的線程切換技術(shù)中除了第一種被時(shí)鐘叫停的以外,基本都是太閑了主動(dòng)讓位或者被讓位的。那么為什么會(huì)出現(xiàn)線程太閑的情況呢?因?yàn)樗麄冊(cè)诘?。等的可能是遠(yuǎn)方服務(wù)器的響應(yīng),可能是用戶的輸入,可能是內(nèi)存數(shù)據(jù)的返回……前兩種無(wú)關(guān)性能,解決不了也不用解決,但是等內(nèi)存可不行,所以介于CPU核心和內(nèi)存之間的緩存出現(xiàn)了。

緩存讀寫速度要比內(nèi)存快,因?yàn)榫彺娌捎玫氖荢RAM存儲(chǔ)器內(nèi)建在CPU上,而內(nèi)存采用的是DRAM。前者可以達(dá)到很高的讀取速度但是面積占用比較大因此容量上不去,在幾M容量就止步了。后者讀取速度慢且每次讀取后都要刷新電容,但面積占用小,因此容量可以達(dá)到好幾個(gè)G甚至幾百幾千個(gè)G。

那為什么緩存能提高CPU性能呢?程序運(yùn)行具有一定規(guī)律——順序和反復(fù)性,即順序執(zhí)行和循環(huán)執(zhí)行。對(duì)于順序執(zhí)行,可以采取預(yù)讀策略。即將后面的程序一并讀取至緩存中,減少內(nèi)存讀取次數(shù)(注意CPU的讀指令并沒(méi)有減少,只是內(nèi)存響應(yīng)次數(shù)少了)。緩存行是緩存的基本單位,目前主流緩存行大小是64字節(jié)因?yàn)閮?nèi)存一次讀操作是64字節(jié),而64位CPU對(duì)數(shù)據(jù)的讀取是8字節(jié)即64bit,因此若CPU要讀的八字節(jié)落入某一緩存行中,該緩存行的內(nèi)容將會(huì)全部從內(nèi)存中被讀取到緩存中,接下來(lái)的程序也被這次讀寫一并帶到了緩存中去。對(duì)于循環(huán)執(zhí)行,則正是緩存的強(qiáng)項(xiàng),之前訪問(wèn)過(guò)的程序都存儲(chǔ)在緩存中,再次讀取時(shí),直接可以從緩存而不是從內(nèi)存中讀取,大大提高了運(yùn)行效率。

緩存又有分為一級(jí)緩存、二級(jí)緩存等等。他們的速度也有所不同,從一級(jí)緩存以后讀取速度依次降低。為什么呢?雖然都是采用的SRAM存儲(chǔ)器,但是數(shù)據(jù)檢索需要時(shí)間,數(shù)據(jù)存儲(chǔ)量大的三級(jí)緩存找的時(shí)間就比數(shù)據(jù)存儲(chǔ)量小的一級(jí)緩存找的時(shí)間久。如果把內(nèi)存比作圖書館的書架,那么緩存就像是CPU面前的一張桌子。給你地址讓你去找CPU想要的數(shù)據(jù),如果你是在書架上找,你可以很清楚這個(gè)數(shù)據(jù)放在哪一行哪一列,如果恰好你運(yùn)動(dòng)速度是光速的話,那么你總能在一個(gè)確定的時(shí)間內(nèi)拿到CPU想要的數(shù)據(jù)。可是緩存就不一樣了,書就在你面前,還亂糟糟的,你需要翻閱查看地址是否對(duì)應(yīng)上了。因此桌子越大,你找得也就越慢。

就沒(méi)有別的辦法了嗎?當(dāng)然有。桌子亂可以整理整理嘛。比如規(guī)定一下,第一書架的書只能放在桌子上的A區(qū),第二書架放B區(qū)……以此類推。這樣一來(lái),找的人便會(huì)方便很多,放的人也沒(méi)有什么困難。

舉個(gè)例子,假設(shè)內(nèi)存可以被劃分成四個(gè)緩存塊(即內(nèi)存大小是緩存大小的四倍),記為00,01,10,11四塊。每個(gè)緩存塊又可以劃分成四個(gè)緩存行,記為00,01,10,11四行。結(jié)合起來(lái),最上面緩存塊的最上面的緩存行就可以寫成0000,則這個(gè)部分的數(shù)據(jù)應(yīng)該存在于緩存中的第一個(gè)緩存行的位置即00位置。如果1000號(hào)緩存行需要寫入,那么就要把0000號(hào)緩存行擦除再寫入,不能存儲(chǔ)在緩存中別的地方即使還有空間存放。


審核編輯:劉清


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    20255

    瀏覽量

    252299
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11279

    瀏覽量

    224995
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    917

    瀏覽量

    43758
  • 計(jì)時(shí)器
    +關(guān)注

    關(guān)注

    1

    文章

    434

    瀏覽量

    35199
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    解析Linux的進(jìn)程、線程和協(xié)程

    )輕量級(jí):相對(duì)于進(jìn)程,線程的創(chuàng)建和切換開銷較小。 (3)同步與通信:線程之間需要通過(guò)同步機(jī)制(如互斥鎖、信號(hào)量)來(lái)保證數(shù)據(jù)的一致性。 協(xié)程(Coroutine) 協(xié)程是一種輕量級(jí)的用戶態(tài)
    發(fā)表于 12-22 11:00

    RISC-V怎么實(shí)現(xiàn)核間中斷?核心本地中斷控制器(CLINT)深度解析

    于每個(gè)核心 / 硬件線程(hart)的中斷控制器,專門處理「核心本地、非共享」的中斷類型,區(qū)別于處理外設(shè)共享中斷的 PLIC(Platform-Level Interrupt Cont
    的頭像 發(fā)表于 12-13 14:06 ?2434次閱讀
    RISC-V怎么實(shí)現(xiàn)核間<b class='flag-5'>中斷</b>?核心本地<b class='flag-5'>中斷</b>控制器(CLINT)深度解析

    線程的系統(tǒng)

    線程系統(tǒng)的事件響應(yīng)也是在中斷中完成的,但事件的處理是在線程中完成的。在多線程系統(tǒng)中,線程中斷
    發(fā)表于 12-08 07:55

    Linux多線程對(duì)比單線程的優(yōu)勢(shì)

    ,而單線程則需要通過(guò)進(jìn)程間通信來(lái)實(shí)現(xiàn)?!干舷挛?b class='flag-5'>切換開銷小」:線程的上下文切換比進(jìn)程小,因?yàn)樗鼈児蚕硐嗤牡刂房臻g?!柑岣唔憫?yīng)性」:多線程可以
    發(fā)表于 12-01 06:11

    線程問(wèn)題,線程已經(jīng)創(chuàng)建成功了,為什么線程調(diào)用的函數(shù)不會(huì)運(yùn)行?

    我這個(gè)線程創(chuàng)建成功了,為啥ai_thread_entry()函數(shù)不運(yùn)行? void airun_thread() { /* 創(chuàng)建 serial 線程 */ rt_thread_t
    發(fā)表于 10-10 08:02

    rtt中線程切換,當(dāng)執(zhí)行完rt_schedule,為什么不立即進(jìn)入下個(gè)線程開始執(zhí)行?

    感覺(jué)是切換完了,也得等到下一個(gè)時(shí)鐘中斷產(chǎn)生后才能執(zhí)行?
    發(fā)表于 10-10 07:05

    rtt中建兩個(gè)線程a和b,怎么確保線程a執(zhí)行完立刻切到線程b?

    怎么獲取從線程開始切換切換完成用的總的CPU時(shí)鐘節(jié)拍數(shù)量?
    發(fā)表于 10-10 06:37

    切換線程中斷被屏蔽怎么解決?

    退出,已經(jīng)切換到main線程,但是發(fā)現(xiàn)此時(shí)中斷是被屏蔽的。 跟代碼發(fā)現(xiàn)rt_schedule最后切換線程時(shí)是先調(diào)用rt_hw_context
    發(fā)表于 09-29 07:48

    ulog輸出異常-中斷線程打印沖突怎么解決?

    邏輯:can收到數(shù)據(jù)后,can中斷打印test,并把數(shù)據(jù)放到消息隊(duì)列,main函數(shù)的消息隊(duì)列打印消息內(nèi)容 問(wèn)題:只要can中斷中有test打印的代碼,整個(gè)串口就會(huì)卡死; 中斷中無(wú)test打印的代碼
    發(fā)表于 09-28 11:44

    CAN發(fā)送只能使用中斷或者DMA,為什么?

    ,RT_DEVICE_FLAG_INT_RX|RT_DEVICE_FLAG_INT_TX ); 我明明可以選擇一個(gè)定時(shí)器,時(shí)間到了之后直接手動(dòng)發(fā)送就完成了,配置成中斷發(fā)送模式涉及線程切換勢(shì)必要浪費(fèi)不必要的時(shí)間,使用DMA又會(huì)
    發(fā)表于 09-25 07:19

    rtthread在線程執(zhí)行過(guò)程中,被中斷打斷后進(jìn)入中斷處理時(shí),是否有保護(hù)FPU的狀態(tài)?

    會(huì)先進(jìn)行一些補(bǔ)償校正計(jì)算, 然后在接收特定消息后在中斷中進(jìn)行切換, 新下傳的幅值相同但是按0.1v遞增;頻率固定為50Hz,相位固定0°,-120°,120°,所有數(shù)據(jù)*10000放大, 其中
    發(fā)表于 09-24 07:50

    使用串口485線程,發(fā)現(xiàn)收到數(shù)據(jù)回調(diào)函數(shù)一直沒(méi)有運(yùn)行是怎么回事?

    ,引腳PB6和PB7,串口配置沒(méi)有問(wèn)題,開機(jī)可以正常打印,如下圖。 發(fā)送485指令,通過(guò)打印和debug發(fā)現(xiàn)信號(hào)量一直為-2,且收到數(shù)據(jù)會(huì)自動(dòng)進(jìn)入串口中斷函數(shù),不會(huì)進(jìn)入我寫的線程中接收。 我這邊硬件上有485自動(dòng)引腳切換
    發(fā)表于 09-18 06:03

    中斷發(fā)送信號(hào)量不能釋放等待信號(hào)量的線程是怎么回事?

    MCU為stm32f407vgt6,rt-thread的版本為4.0.3。 代碼如下: /* 接收數(shù)據(jù)回調(diào)函數(shù),該函數(shù)會(huì)在uart中斷例程中調(diào)用*/ static rt_err_t
    發(fā)表于 09-10 06:28

    深度剖析 RT-Thread 線程調(diào)度流程

    rt_system_scheduler_start:調(diào)度系統(tǒng)第一個(gè)線程rt_hw_context_switch_to:初始化上下文切換環(huán)境,觸發(fā)PendSV異常first_thread:系統(tǒng)中優(yōu)先級(jí)最高
    的頭像 發(fā)表于 06-25 18:24 ?1771次閱讀
    深度剖析 RT-Thread <b class='flag-5'>線程</b>調(diào)度流程

    進(jìn)程、線程、協(xié)程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    它們就像程序界的「三國(guó)演義」: 進(jìn)程:曹魏政權(quán)(獨(dú)占資源,穩(wěn)如老狗) 線程:孫劉聯(lián)軍(共享資源,相愛(ài)相殺) 協(xié)程:諸葛亮北伐(一人帶十軍,的是「空城計(jì)」) 第一章:進(jìn)程——程序界的「獨(dú)狼」 定義
    發(fā)表于 03-26 09:27