国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

上一次的大合集我們從半導體講到了邏輯門,再從邏輯門講到了組合邏輯電路和時序邏輯電路,又緊接著介紹了CPU內核的設計體系,最后以CPU的指令集作為結尾,一個CPU已經頗具雛形。

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

下面開始。

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

對于計算機系統或者CPU來說,越值得信賴的線程的權限等級是越高的。什么是越值得信賴的線程呢?計算機本身的操作系統肯定是值得信賴的,畢竟如果連操作系統都不能信賴,還有什么值得信賴?不過操作系統雖然值得信賴,但本身肯定多多少少存在一些Bug,不然Windows也不會天天藍屏了,但是對于CPU來講,操作系統即使有無心的錯誤,但肯定不會是有害的錯誤。

那么權限等級能決定什么呢?能決定這個線程能訪問哪些內容。

話說回來,早期的那個計算導彈的程序在現在看來就可以算是一個線程。而具體是如何做到并行處理的呢?看過三體的同學應該都知道三體人是怎么用一顆智子封鎖地球科技的,靠的就是智子光速來回穿梭干擾在位于地球各處的高能粒子對撞機。因為智子速度太快了,所以只需要一顆就能封鎖整個地球的科技。CPU也是同理,隨著CPU性能的提升,它也可以快速來回切換并處理不同的線程,底層都是串行的,但給我們的感覺卻是并行的。

當然隨著科技的進一步發展,CPU的核心數早已從單核心變成了多核心,甚至在一些服務器里我們還能見到多CPU的主板,所以依靠多個CPU核心,現在也能實現真正意義上的并行,不過線程數總是多于CPU核心數,因此線程的切換即使到了今天也是一直在用的。

那么線程是如何切換的呢?最常見的就是靠中斷了。中斷顧名思義,做到中間的時候被打斷了,有更高優先級的人物需要處理。什么被打斷了?當前執行的線程被打斷了。被什么打斷了?不好說,有可能是定時時鐘,有可能是你敲擊的鍵盤或你移動的鼠標,有可能是某一個線程自己發出來的“軟中斷”。為什么要有中斷?就我個人理解,中斷是人與電腦進行實時交互的窗口,沒有中斷就像你沒有鼠標和鍵盤,啥也做不了。但是中斷并不是只有人可以用,計算機本身也能用,只要是優先級更高的任務需要介入就可以用。

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

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

第二個辦法,我稱之為主動切換。當本線程沒事干了,或者說在等另一邊的結果,那么這個時候就會執行一個軟中斷,自覺地把線程讓出來(要是不自覺就沒辦法了),流程和上面一致,只不過中斷源不再是時鐘了,而是線程本身,稱之為軟(軟件)中斷。

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

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

上文中提到的線程切換技術中除了第一種被時鐘叫停的以外,基本都是太閑了主動讓位或者被讓位的。那么為什么會出現線程太閑的情況呢?因為他們在等。等的可能是遠方服務器的響應,可能是用戶的輸入,可能是內存數據的返回……前兩種無關性能,解決不了也不用解決,但是等內存可不行,所以介于CPU核心和內存之間的緩存出現了。

緩存讀寫速度要比內存快,因為緩存采用的是SRAM存儲器內建在CPU上,而內存采用的是DRAM。前者可以達到很高的讀取速度但是面積占用比較大因此容量上不去,在幾M容量就止步了。后者讀取速度慢且每次讀取后都要刷新電容,但面積占用小,因此容量可以達到好幾個G甚至幾百幾千個G。

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

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

就沒有別的辦法了嗎?當然有。桌子亂可以整理整理嘛。比如規定一下,第一書架的書只能放在桌子上的A區,第二書架放B區……以此類推。這樣一來,找的人便會方便很多,放的人也沒有什么困難。

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


審核編輯:劉清


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    20255

    瀏覽量

    252300
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11279

    瀏覽量

    224995
  • 中斷
    +關注

    關注

    5

    文章

    917

    瀏覽量

    43758
  • 計時器
    +關注

    關注

    1

    文章

    434

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    解析Linux的進程、線程和協程

    )輕量級:相對于進程,線程的創建和切換開銷較小。 (3)同步與通信:線程之間需要通過同步機制(如互斥鎖、信號量)來保證數據的一致性。 協程(Coroutine) 協程是一種輕量級的用戶態
    發表于 12-22 11:00

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

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

    線程的系統

    線程系統的事件響應也是在中斷中完成的,但事件的處理是在線程中完成的。在多線程系統中,線程中斷
    發表于 12-08 07:55

    Linux多線程對比單線程的優勢

    ,而單線程則需要通過進程間通信來實現。「上下文切換開銷小」:線程的上下文切換比進程小,因為它們共享相同的地址空間。「提高響應性」:多線程可以
    發表于 12-01 06:11

    線程問題,線程已經創建成功了,為什么線程調用的函數不會運行

    我這個線程創建成功了,為啥ai_thread_entry()函數不運行? void airun_thread() { /* 創建 serial 線程 */ rt_thread_t
    發表于 10-10 08:02

    rtt中線程切換,當執行完rt_schedule,為什么不立即進入下個線程開始執行

    感覺是切換完了,也得等到下一個時鐘中斷產生后才能執行?
    發表于 10-10 07:05

    rtt中建兩個線程a和b,怎么確保線程a執行完立刻切到線程b?

    怎么獲取從線程開始切換切換完成用的總的CPU時鐘節拍數量?
    發表于 10-10 06:37

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

    退出,已經切換到main線程,但是發現此時中斷是被屏蔽的。 跟代碼發現rt_schedule最后切換線程時是先調用rt_hw_context
    發表于 09-29 07:48

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

    邏輯:can收到數據后,can中斷打印test,并把數據放到消息隊列,main函數的消息隊列打印消息內容 問題:只要can中斷中有test打印的代碼,整個串口就會卡死; 中斷中無test打印的代碼
    發表于 09-28 11:44

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

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

    rtthread在線程執行過程中,被中斷打斷后進入中斷處理時,是否有保護FPU的狀態?

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

    使用串口485線程,發現收到數據回調函數一直沒有運行是怎么回事?

    ,引腳PB6和PB7,串口配置沒有問題,開機可以正常打印,如下圖。 發送485指令,通過打印和debug發現信號量一直為-2,且收到數據會自動進入串口中斷函數,不會進入我寫的線程中接收。 我這邊硬件上有485自動引腳切換
    發表于 09-18 06:03

    中斷發送信號量不能釋放等待信號量的線程是怎么回事?

    MCU為stm32f407vgt6,rt-thread的版本為4.0.3。 代碼如下: /* 接收數據回調函數,該函數會在uart中斷例程中調用*/ static rt_err_t
    發表于 09-10 06:28

    深度剖析 RT-Thread 線程調度流程

    rt_system_scheduler_start:調度系統第一個線程rt_hw_context_switch_to:初始化上下文切換環境,觸發PendSV異常first_thread:系統中優先級最高
    的頭像 發表于 06-25 18:24 ?1771次閱讀
    深度剖析 RT-Thread <b class='flag-5'>線程</b>調度流程

    進程、線程、協程傻傻分不清?一文帶你徹底扒光它們的\"底褲\"!

    它們就像程序界的「三國演義」: 進程:曹魏政權(獨占資源,穩如老狗) 線程:孫劉聯軍(共享資源,相愛相殺) 協程:諸葛亮北伐(一人帶十軍,的是「空城計」) 第一章:進程——程序界的「獨狼」 定義
    發表于 03-26 09:27