技術文章:C語言協程的代碼細節

2022年10月08日01:57:07 科技 1901

「協程」(coroutine),就是把Linux epoll非同步IO機制通過長跳轉(long jmp)封裝起來,形成一個在用戶看來「連續的」流程。

所有操作系統的非同步IO,都分為啟動函數回調函數

Linux為例,啟動函數負責往epoll框架里添加讀寫事件。

事件觸發之後,再通過回調函數去進行下半部的處理。

整個事件處理過程,與Linux內核里的中斷處理差不多。

一個完整的IO流程需要回調好幾次,而且讀代碼時到處查找回調函數哪裡設置的

甚至,有的程序員中途修改回調函數的指針[捂臉]

C的函數指針比C++的虛函數「靈活」的地方是,C++的虛函數表在編譯時固定了,但C的函數指針可以在運行時修改(它就是個普通變數)。

然後,就真有人半截里修改它,讓代碼的可讀性急劇下降。

再然後,就出現了coroutine,看上去至少是同步的了。

程序流程在一個函數里跳轉,就是普通的goto語句

程序流程在2個函數的半截里跳轉,就是長跳轉(long jmp)。

協程的原理如下:

1,當某個文件描述符需要IO等待的時候,通過長跳轉回到epoll的主框架函數,讓其他的IO可以運行。

2,當這個文件描述符的IO再次就緒之後,再通過長跳轉從主框架函數跳回來,接著上次的位置繼續運行:

這個位置,是函數上一次放棄運行的位置,它是函數內的某個點。

技術文章:C語言協程的代碼細節 - 天天要聞

在函數的半截里放棄CPU之後還能回來,就需要保存函數的運行上下文:信息、寄存器信息。

保存到哪裡?

只能保存到上,因為棧和寄存器都會隨著代碼的運行而不斷地覆蓋,只有堆是受用戶控制的。

技術文章:C語言協程的代碼細節 - 天天要聞

用戶測試代碼

上圖是「用戶代碼」,雖然兩個函數__async_connect()和__async_write()的內部是非同步執行的,但它們都在一個函數_async_test()里,整個流程看上去是同步的。

技術文章:C語言協程的代碼細節 - 天天要聞

__async_connect()函數,上半部

__async_connect()分為上半部和下半部,以__asm_co_task_yield()為分隔點。

上半部調用非同步的connect(),下半部調用getsockopt()讀取結果。

為了避免阻塞線程,需要在非同步connect()之後讓出CPU,讓主框架函數可以做別的

這個讓出CPU的函數__asm_co_task_yield(),是「協程庫」的關鍵。

它讓出了CPU之後,在事件觸發之後再次恢復運行:這時函數__asm_co_task_yield()才會返回,然後接著運行下圖的代碼。

技術文章:C語言協程的代碼細節 - 天天要聞

__async_connect()函數,下半部

當非同步connect()成功時,getsockopt()獲取的錯誤碼err是0。

技術文章:C語言協程的代碼細節 - 天天要聞

__async_write()函數

__async_write()函數的流程與__async_connect()類似,也是在文件描述符變得不可寫時放棄CPU,等待下次可寫時再恢復運行。

技術文章:C語言協程的代碼細節 - 天天要聞

epoll主框架函數

epoll的主框架函數是一個while循環:使用epoll_wait()系統調用去監控事件的觸發。

它會同時處理IO事件定時器

定時器的精度受限於epoll_wait()的等待時間

技術文章:C語言協程的代碼細節 - 天天要聞

epoll主框架函數

__scf_co_task_run(),可以讓「協程任務」首次運行,或者再次恢復運行。

技術文章:C語言協程的代碼細節 - 天天要聞

_scf_co_task_run()函數

這個函數只是調用了__asm_co_task_run(),具體的長跳轉彙編里實現。

因為長跳轉涉及到細緻的內存控制,只能用彙編實現。

運行結果:

要在本機上用命令nc -vv -l 2000當服務端。

技術文章:C語言協程的代碼細節 - 天天要聞

列印的日誌,是長跳轉時的棧信息的變化

技術文章:C語言協程的代碼細節 - 天天要聞

兩個彙編函數的大概功能,如下面的3張圖。

細節就不說了,這種代碼,時間久了連作者都快看不懂了[捂臉]

技術文章:C語言協程的代碼細節 - 天天要聞

技術文章:C語言協程的代碼細節 - 天天要聞

技術文章:C語言協程的代碼細節 - 天天要聞

科技分類資訊推薦

雷軍披露小米 YU7 銷售數據;特斯拉 Q2 交付汽車 38.4 萬輛;榮耀 Magic V5 發布|Do早報 - 天天要聞

雷軍披露小米 YU7 銷售數據;特斯拉 Q2 交付汽車 38.4 萬輛;榮耀 Magic V5 發布|Do早報

Hello,大家早上好,又是元氣滿滿的一天,先來瀏覽新鮮的早報吧~【微信多端正式更新】7 月 2 日,微信 iOS / 安卓 8.0.61 正式版攜手登場;而在 7 月 1 日,微信在官網也上架了 PC 的新版本,Windows / Mac 4.0.6 迎來全新發布。【多地開放往屆高考成績網上查詢功能】河北、浙江、陝西、山東等地都開放了往屆高考成績的查...
長城為何不做增程?詳解Hi4背後的技術和戰略邏輯 - 天天要聞

長城為何不做增程?詳解Hi4背後的技術和戰略邏輯

在中國新能源汽車產業邁入智能化與電動化深水區的當下,動力技術路線的選擇,不僅關乎產品體驗,也在重塑車企的技術底盤與品牌認知。與越來越多自主品牌押注增程技術不同,長城汽車選擇走另一條更具挑戰性的路線——全場景智能四驅電混技術體系Hi4。這個選擇背後,是對效率、安全與技術普適性的權衡與押注。Hi4,一種技術「...
解碼「民生答卷」丨如何「喚醒」沉睡的養老資源 - 天天要聞

解碼「民生答卷」丨如何「喚醒」沉睡的養老資源

湖北日報全媒記者 方琳 李光正 張華「幸福食堂、健身房、閱覽室、娛樂室、理療室一應俱全,可沒多少人來。」6月19日,在鄂東南某鎮,一家開業一個多月的養老服務綜合體經營者王先生望著冷清的門廳,難掩焦慮。截然不同的是,在武漢眾多社區養老中心,唱歌、跳舞等活動日程排得滿滿當當,老人們排隊「搶位」,養老床位更是「...
YU7爆火是雷軍營銷太強?張全蛋貼臉開大車企大佬,遮羞布都撕了 - 天天要聞

YU7爆火是雷軍營銷太強?張全蛋貼臉開大車企大佬,遮羞布都撕了

6月26日,小米YU7正式公布售價,很多人都預料到小米YU7會非常火,但是完全沒有料到小米YU7能那麼火,3分鐘大定破20萬輛,18小時鎖單24.8萬輛,可以說創造了國內汽車市場前所未有的新紀錄。這也讓之前那些攻擊小米汽車的車企大佬和業外人士的表述顯得蒼白無力,小米YU7的價格不便宜,現在整個汽車行業的需求量也呈現疲軟態勢...
iOS 26新功能:FaceTime通話中干預脫衣行為 - 天天要聞

iOS 26新功能:FaceTime通話中干預脫衣行為

IT之家 7 月 3 日消息,科技媒體 9to5Mac 昨日(7 月 2 日)發布博文,報道稱 iOS 26 在引入「液態玻璃」設計的同時,在功能方面,進一步增強了 FaceTime 體驗,在檢測到脫衣裸露行為後,會暫停視頻和音頻通話。IT之家援引博文介紹,蘋果公司提供的通信安全功能之一,就是干預 FaceTime 視頻通話中的裸露內容,不過此前主要...
凈利暴跌70%!非洲手機之王,被小米逼得造車了 - 天天要聞

凈利暴跌70%!非洲手機之王,被小米逼得造車了

作為「非洲手機之王」,中國人創立的傳音,如同一頭雄獅,在非洲手機市場常年稱王稱霸。 然而如今這頭雄獅被小米等後來者圍攻,凈利潤居然暴跌約70%。 無奈之下,傳音被迫跨界進入造車行....
無人駕駛和4.7億城鎮就業人口 - 天天要聞

無人駕駛和4.7億城鎮就業人口

最近一段時間,車標形似鎚子的那家公司,有一款宣稱100%無人駕駛的計程車業務,在美國的某個城市開始運營了。 對於以開車為生的人而言,這並不是一個好消息,因為這意味著在未來的某一天,司機這個....
‌iOS 26 蘋果照片應用全新特性匯總 - 天天要聞

‌iOS 26 蘋果照片應用全新特性匯總

Apple 的照片應用程序去年進行了重大改革,iOS 26 帶來了一些新的變化。以下是 iOS 26 中照片應用程序的所有新功能。全新液態玻璃設計今年影響所有 Apple 應用的最大變化之一是 iOS 26 的新「液態玻璃」設計。
Omdia:蘋果明年將推 OLED MacBook Pro筆記本 - 天天要聞

Omdia:蘋果明年將推 OLED MacBook Pro筆記本

IT之家 7 月 3 日消息,Omdia 分析師 Linda Lin 近期預估,蘋果公司將會在明年推出配備 OLED 屏幕的首批 MacBook Pro 機型。這些新機型將帶來更高亮度、更高對比度和更長的電池續航等優勢。在最新發布的市場投資研究報告中,Linda Lin 再次認為蘋果會在明年推出首批配備 OLED 屏幕的 MacBook 機型。IT之家註:盡
今日數據精選:中國短劇拯救美國三線演員;深圳華強北清理無3C認證充電寶 - 天天要聞

今日數據精選:中國短劇拯救美國三線演員;深圳華強北清理無3C認證充電寶

【宏觀經濟及政策】9000萬科技文獻元數據平台上線,基礎功能免費開放在7月2日北京舉行的2025全球數字經濟大會上,由我國機構自主創建的具有完全自主知識產權的全球科技文獻數據平台上線。東壁全球科技文獻數據平台共收錄了全球近9000萬條高質量科技文獻元數據,是依據中國機構自主提出的評價指標體系,自主採集、加工、建設...