亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

【協(xié)程原理】 - 協(xié)程不過是用戶態(tài)的線程

pcChao / 3667人閱讀

摘要:也就是現(xiàn)代操作系統(tǒng)的虛擬內(nèi)存空間。有在兩個進程之間切換狀態(tài)的時候,需要把內(nèi)存的映射關系調整過來,否則虛擬內(nèi)存的地址是無法對應到正確的物理地址的。但是原理是非常類似的。協(xié)程與線程的區(qū)別在于,協(xié)程的是在完全在用戶態(tài),由語言的或者是庫來完成的。

TL;DR

筆者最美好的記憶來自于早年在6502 cpu的cc800上寫匯編的年代, 那個時代的計算機甚至沒有操作系統(tǒng),也沒有實模式等保護機制。在6502上寫匯編應用其實非常簡單,系統(tǒng)會把bin文件加載到一個固定的內(nèi)存地址中,cpu會固定地從一個特定的位置開始執(zhí)行。然后cpu就按照你提供的機器指令開始一條一條的執(zhí)行。在高級語言中的“函數(shù)調用”的概念,在匯編里主要體現(xiàn)為兩個寄存器。寄存器是cpu內(nèi)部臨時保存數(shù)據(jù)的區(qū)域,相當于高級語言里的變量。但是有一個寄存器是特殊的,它存放了cpu當前正在執(zhí)行的指令的內(nèi)存地址(Instruction Register)。一個高級語言中的函數(shù)一般會被編譯成指令存放在一段連續(xù)的內(nèi)存空間中(data segment)。那么所謂函數(shù)執(zhí)行到了第幾行這樣的信息其實就是保存在這個Instruction Register中的。另外一個很特殊的寄存器是Stack Register,它其中存放的內(nèi)存地址指向的內(nèi)存區(qū)域用于函數(shù)之間傳遞參數(shù)和返回值,以及存放一個函數(shù)內(nèi)的局部變量。如果不考慮現(xiàn)代計算機cpu中各種各樣其他存放中間結果的寄存器,理論上保存了Instruction Register(執(zhí)行到哪兒了)和Stack Register(堆棧上的變量)就保存了一個函數(shù)的當前執(zhí)行狀態(tài),分別是函數(shù)當前執(zhí)行到了哪,以及這個函數(shù)局部變量所代表的當前state。

事實上,操作系統(tǒng)的幾個關鍵切換也是這么來完成的。操作系統(tǒng)提供了兩個執(zhí)行態(tài),一個是用戶態(tài),一般我們的代碼都是執(zhí)行在用戶態(tài)的。另外一個是內(nèi)核態(tài),像驅動程序之類的代碼會用各種方式被加載到操作系統(tǒng)內(nèi)部執(zhí)行在內(nèi)核之中。內(nèi)核態(tài)里的代碼可以完全控制CPU的I/O中斷,從而可以和外部設備交互。用戶態(tài)的代碼屬于受限代碼,必須把I/O請求通過syscall交由運行在內(nèi)核態(tài)的操作系統(tǒng)來完成。當一個cpu的核在執(zhí)行用戶態(tài)代碼時,其寄存器里存放的狀態(tài)是你的應用的代碼的狀態(tài),但是應用要進行I/O操作的時候,cpu要被切換到內(nèi)核的代碼里去執(zhí)行內(nèi)核態(tài)的代碼。這里就需要進行一次context switch,所謂context switch其實原理不會比把寄存器的值存到內(nèi)存的一個地方,等回來的時候再把內(nèi)存中臨時保存的值加載回寄存器復雜多少。

操作系統(tǒng)還有一個需要進行context switch的地方,那就是在協(xié)程與協(xié)程之間。操作系統(tǒng)在執(zhí)行一個ELF或者PE的可執(zhí)行文件的時候,對于這個可執(zhí)行文件內(nèi)的匯編代碼來說,整個內(nèi)存尋址空間是獨立的。也就是1.exe的執(zhí)行狀態(tài)完全無法感知到2.exe的執(zhí)行狀態(tài)的內(nèi)存。也就是現(xiàn)代操作系統(tǒng)的虛擬內(nèi)存空間。有cpu在兩個進程之間切換狀態(tài)的時候,需要把內(nèi)存的映射關系調整過來,否則虛擬內(nèi)存的地址是無法對應到正確的物理地址的。一個進程內(nèi)的兩個線成切換的時候,要稍微簡單一些,只需要把當前線成正在執(zhí)行的位置和棧做切換就可以了。

無論是操作系統(tǒng)做user/kernel的switch,還是process/process,thread/thread的switch,其實現(xiàn)方式都是大同小異的。通過把“當前執(zhí)行狀態(tài)”這樣的一個抽象概念落實為一個具體的數(shù)據(jù)結構存儲起來,然后指揮cpu在不同的場合加載不同的數(shù)據(jù)恢復不同的“當前執(zhí)行狀態(tài)”。

在高級語言中,一個函數(shù)正在執(zhí)行的位置以及其狀態(tài),內(nèi)部都可以有一個抽象的表達方式。有的高級語言直接被編譯成原生的機器碼,那么其執(zhí)行狀態(tài)的表述就和操作系統(tǒng)的context switch的context非常類似。有的高級語言自身執(zhí)行在一個虛擬機之上,那么其context的表述可能是虛擬機的instruction register和stack register,而不是80x86這樣原生的機器的物理寄存器。但是原理是非常類似的。

取決于語言設計者的覺悟,有的語言會把這種表達執(zhí)行狀態(tài)的能力直接提供出來,讓一個函數(shù)在執(zhí)行過程中可以把當前狀態(tài)保存,然后把執(zhí)行權交給另外一個函數(shù)執(zhí)行,等那個函數(shù)放棄執(zhí)行權回來的時候再把保存的狀態(tài)恢復。這也就是所謂的協(xié)程(co-routine)。協(xié)程與線程的區(qū)別在于,協(xié)程的context switch是在完全在用戶態(tài),由語言的runtime或者是庫來完成的。而線程的context switch則是操作系統(tǒng)來完成的。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/45309.html

相關文章

  • PHP協(xié)程

    摘要:協(xié)程協(xié)程就是用戶態(tài)的線程要理解是什么是用戶態(tài)的線程,必然就要先理解什么是內(nèi)核態(tài)的線程。記住,不是協(xié)程,而是協(xié)程需要借助的特性來實現(xiàn)。 協(xié)程 協(xié)程就是用戶態(tài)的線程 要理解是什么是用戶態(tài)的線程,必然就要先理解什么是內(nèi)核態(tài)的線程。 內(nèi)核態(tài)的線程是由操作系統(tǒng)來進行調度的,在切換線程上下文時,要先保存上一個線程的上下文,然后執(zhí)行下一個線程,當條件滿足時,切換回上一個線程,并恢復上下文。 協(xié)程也...

    SolomonXie 評論0 收藏0
  • 【Go語言學習】2019-04-24 協(xié)程初步討論與簡單擴展

    摘要:它避免了上下文切換的額外耗費,兼顧了多線程的優(yōu)點,簡化了高并發(fā)程序的復雜。而可以理解為一種語言的協(xié)程。線程輕量級進程,,是程序執(zhí)行流的最小單元。一個標準的線程由線程,當前指令指針,寄存器集合和堆棧組成。其實就是或者等語言中的多線程開發(fā)。 grape 全部視頻:https://segmentfault.com/a/11... 原視頻地址:https://biglive.xueersi.c...

    SnaiLiu 評論0 收藏0
  • PHP下的異步嘗試二:初識協(xié)程

    摘要:如果僅依靠程序自動交出控制的話,那么一些惡意程序將會很容易占用全部時間而不與其他任務共享。多個操作可以在重疊的時間段內(nèi)進行。 PHP下的異步嘗試系列 如果你還不太了解PHP下的生成器,你可以根據(jù)下面目錄翻閱 PHP下的異步嘗試一:初識生成器 PHP下的異步嘗試二:初識協(xié)程 PHP下的異步嘗試三:協(xié)程的PHP版thunkify自動執(zhí)行器 PHP下的異步嘗試四:PHP版的Promise ...

    MudOnTire 評論0 收藏0
  • PHP回顧之協(xié)程

    摘要:本文先回顧生成器,然后過渡到協(xié)程編程。其作用主要體現(xiàn)在三個方面數(shù)據(jù)生成生產(chǎn)者,通過返回數(shù)據(jù)數(shù)據(jù)消費消費者,消費傳來的數(shù)據(jù)實現(xiàn)協(xié)程。解決回調地獄的方式主要有兩種和協(xié)程。重點應當關注控制權轉讓的時機,以及協(xié)程的運作方式。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 sess...

    Java3y 評論0 收藏0
  • 三年半Java后端面試經(jīng)歷

    摘要:經(jīng)過半年的沉淀,加上對,和分布式這塊的補齊,終于開始重拾面試信心,再次出征。面試官提示沒有提到線程的有內(nèi)核態(tài)的切換,程只在用戶態(tài)調度。三面綜合技術面這面面的是陣腳大亂,面試官采用刨根問底的方式提問,終究是面試經(jīng)驗不夠,導致面試的節(jié)奏有點亂。 經(jīng)過半年的沉淀,加上對MySQL,redis和分布式這塊的補齊,終于開始重拾面試信心,再次出征。 鵝廠 面試職位:go后端開發(fā)工程師,接受從Jav...

    kviccn 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<