溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行l(wèi)ibgo的源碼剖析

發(fā)布時(shí)間:2021-11-22 18:21:55 來(lái)源:億速云 閱讀:222 作者:柒染 欄目:軟件技術(shù)

如何進(jìn)行l(wèi)ibgo的源碼剖析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

閑談

協(xié)程是一個(gè)很早的概念了,早些年的游戲行業(yè)中已經(jīng)大規(guī)模地在使用,像lua、go這些語(yǔ)言中的協(xié)程原語(yǔ)已經(jīng)相對(duì)比較完善了,一般來(lái)說(shuō)直接使用就好,但是在系統(tǒng)后臺(tái)開(kāi)發(fā)上,出現(xiàn)的時(shí)間并不長(zhǎng)。
我是做C++方向的后臺(tái)開(kāi)發(fā),目前國(guó)內(nèi)一些公司也開(kāi)源了一些C++協(xié)程庫(kù),但目前來(lái)說(shuō),還是在逐步完善的階段。最早接觸的C++協(xié)程庫(kù)是騰訊微信的 libco,可以說(shuō)是相當(dāng)輕量級(jí)的協(xié)程,網(wǎng)上關(guān)于libco的實(shí)現(xiàn)的文章也是相對(duì)較多,這里的話不會(huì)去過(guò)多地?cái)⑹觥?/p>


在網(wǎng)上查找關(guān)于 libgo 的資料,關(guān)于代碼實(shí)現(xiàn)的文章并沒(méi)有多少,因此,打算自己看代碼總結(jié),之后的文章中,可能會(huì)針libgo和libco的部分功能進(jìn)行簡(jiǎn)單對(duì)比,不足之處,希望讀者指出。

背景

因?yàn)楣ぷ餍枰?,以前系統(tǒng)的異步框架已經(jīng)顯得不再那么地具有擴(kuò)展性,異步使得原本很簡(jiǎn)單的邏輯(讀->處理->寫),要拆分開(kāi)來(lái)成多個(gè)階段,通過(guò)回調(diào)來(lái)響應(yīng)各個(gè)事件,因此有計(jì)劃地使用協(xié)程來(lái)代替。

為什么最后選擇了libgo,而沒(méi)有選擇更加輕量級(jí)的libco ?網(wǎng)上有人給出過(guò)兩者的性能對(duì)比,從自旋鎖、協(xié)程的數(shù)量以及??臻g、線程支持等各個(gè)角度考慮,貌似libgo完勝。
如何進(jìn)行l(wèi)ibgo的源碼剖析

圖片來(lái)源于網(wǎng)絡(luò)

性能對(duì)比數(shù)據(jù)來(lái)源于網(wǎng)絡(luò),并不是說(shuō)libco不好,也許各自應(yīng)用的場(chǎng)景略有不同,libco幾千行的代碼可以實(shí)現(xiàn)一個(gè)相對(duì)較完備的協(xié)程,而且經(jīng)得住微信后臺(tái)龐大的數(shù)據(jù)流量,自有它的優(yōu)勢(shì)。由于對(duì) libgo 的代碼正在研究當(dāng)中,因此,暫不對(duì)兩者評(píng)價(jià)。

協(xié)程

不管是什么樣的協(xié)程,最核心的內(nèi)容,都是在系統(tǒng)發(fā)生阻塞的時(shí)候上層主動(dòng)讓出CPU,切換就緒協(xié)程的上下文,簡(jiǎn)要總結(jié),有如下幾個(gè)方面:

  1. 上下文切換的實(shí)現(xiàn)

  2. 系統(tǒng)函數(shù)的hook;

  3. 協(xié)程調(diào)度;

  4. 時(shí)間管理;

libgo 源碼

https://github.com/yyzybb537/libgo

libgo 目錄結(jié)構(gòu)說(shuō)明

muhui@ASIAYANG-MB0:~/code/libgo/libgo-master$ ll
total 64
-rw-r--r--@  1 muhui  staff  5913 11  7 11:20 CMakeLists.txt
-rw-r--r--@  1 muhui  staff  1084 11  7 11:20 LICENSE
-rw-r--r--@  1 muhui  staff  8758 11  7 11:20 README.md
-rw-r--r--@  1 muhui  staff  4230 11  7 11:20 TODO
drwxr-xr-x@  4 muhui  staff   128 11  7 11:20 imgs
drwxr-xr-x@ 15 muhui  staff   480 11  7 11:20 libgo
drwxr-xr-x@  8 muhui  staff   256 11  7 11:20 test
drwxr-xr-x@  6 muhui  staff   192 11  7 11:20 third_party
drwxr-xr-x@ 20 muhui  staff   640 11  7 11:20 tutorial
drwxr-xr-x@  4 muhui  staff   128 11  7 11:20 vs_proj
muhui@ASIAYANG-MB0:~/code/libgo/libgo-master$ cd libgo/
muhui@ASIAYANG-MB0:~/code/libgo/libgo-master/libgo$ ll
total 16
drwxr-xr-x@  4 muhui  staff   128 11  7 11:20 cls
drwxr-xr-x@ 19 muhui  staff   608 11  7 11:20 common
drwxr-xr-x@  6 muhui  staff   192 11  7 11:20 context
-rw-r--r--@  1 muhui  staff  1848 11  7 11:20 coroutine.h
drwxr-xr-x@  5 muhui  staff   160 11  7 11:20 debug
drwxr-xr-x@  4 muhui  staff   128 11  7 11:20 defer
-rw-r--r--@  1 muhui  staff    36 11  7 11:20 libgo.h
drwxr-xr-x@  4 muhui  staff   128 11  7 11:20 netio
drwxr-xr-x@  5 muhui  staff   160 11  7 11:20 pool
drwxr-xr-x@  8 muhui  staff   256 11  7 11:20 scheduler
drwxr-xr-x@  7 muhui  staff   224 11  7 11:20 sync
drwxr-xr-x@  4 muhui  staff   128 11  7 11:20 task
drwxr-xr-x@  4 muhui  staff   128 11  7 11:20 timer

libgo 做的較好的一點(diǎn)是增加了對(duì)windows 環(huán)境的支持等,我們只針對(duì) Linux 環(huán)境做研究。

  • TODO:libgo 后續(xù)會(huì)逐步完善或增加的功能;

  • libgo:源碼實(shí)現(xiàn)的主目錄,關(guān)于協(xié)程和調(diào)度策略的實(shí)現(xiàn)都在該目錄下;

  • test:測(cè)試代碼;

  • tutorial:libgo 使用教程代碼;

  • vs_proj:VS 環(huán)境下如何使用libgo。

    在libgo目錄下

    • task:協(xié)程的相關(guān)實(shí)現(xiàn);

    • scheduler:協(xié)程調(diào)度的實(shí)現(xiàn);

    • debug:libgo 自帶的調(diào)試功能(用于協(xié)程狀態(tài)的定位等);

    • coroutine.h:對(duì)一些常用對(duì)方法進(jìn)行了重定義。

  • netio:hook的系統(tǒng)調(diào)用;

  • context:上下文的切換;

  • pool:libgo 實(shí)現(xiàn)的連接池




libgo調(diào)度原理概述

我們知道,協(xié)程是用戶態(tài)線程,因此libco的話是不支持線程的。但在libgo中,線程同樣是支持的,這于它的調(diào)度方式有關(guān)。

首先我們要說(shuō)的一點(diǎn)是,在libgo中,每個(gè)協(xié)程是一個(gè)task,libgo 的調(diào)度并不是直接作用于協(xié)程,是通過(guò)間接調(diào)度實(shí)現(xiàn)的。

libgo中有調(diào)度器(scheduler)和執(zhí)行器(processer)的概念:

  1. 直接負(fù)責(zé)協(xié)程調(diào)度的是執(zhí)行器,它會(huì)在協(xié)程阻塞的時(shí)候切出上下文,并切入一個(gè)就緒協(xié)程的上下文去繼續(xù)處理,當(dāng)沒(méi)有可執(zhí)行的協(xié)程時(shí),執(zhí)行器就會(huì)阻塞等待,當(dāng)有新到來(lái)的任務(wù)時(shí),會(huì)繼續(xù)處理;

  2. 負(fù)責(zé)管理執(zhí)行器的是調(diào)度器,對(duì)調(diào)度器而言,每個(gè)執(zhí)行器是一個(gè)單獨(dú)的線程,調(diào)度器做的最主要的工作,就是平衡各個(gè)執(zhí)行器中的協(xié)程數(shù)量,防止饑餓效應(yīng),部分執(zhí)行器過(guò)忙,部分執(zhí)行器卻沒(méi)有task可執(zhí)行,另外,如果某個(gè)執(zhí)行器卡住,調(diào)度器也會(huì)將執(zhí)行器中的可運(yùn)行協(xié)程取出,放到負(fù)載最低的執(zhí)行器上。

  3. 當(dāng)然,調(diào)度器的個(gè)數(shù)的話是支持動(dòng)態(tài)擴(kuò)展的。

如下圖:
如何進(jìn)行l(wèi)ibgo的源碼剖析

看完上述內(nèi)容,你們掌握如何進(jìn)行l(wèi)ibgo的源碼剖析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI