go lang學習筆記——channel機理及排程理解

後開啟撒打發了發表於2018-05-15
《Go語言程式設計》一書介紹了libtask庫,可以認為這個庫等同於go的底層goroutine實現。
libtask庫的channel的資料結構如下
struct Alt
{
Channel *c;
void *v;
unsigned int op;
Task *task;
Alt *xalt;
};
struct Altarray
{
Alt **a;
unsigned int n;
unsigned int m;
};
struct Channel
{
unsigned int bufsize;
unsigned int elemsize;
unsigned char *buf;
unsigned int nbuf;
unsigned int off;
Altarray asend;
Altarray arecv;
char *name;
};

我們可以看到channel的基本組成如下:
  記憶體快取,用於存放元素;
  傳送佇列;
  接受佇列。

書中羅列完channel的結構後沒有深入講解如何在channel這個結構上進行通訊的過程。其實結合書中前面介紹的內容task(協程)的通訊過程已經不言而明瞭。
但是從學習者的角度,當然是把這個問題講解的越明白越好。接下來我試著介紹一下task(協程)是如何在這個channel的基礎上通訊的。
對於一個往channel裡寫資料的情況:



對於一個從channel裡讀資料的情況:


注意:以上兩個流程都是基於書中對協程的工作原理和channel資料結構的介紹後我個人腦補的,並沒有去翻看libtask的程式碼。很可能存在疏漏,只應當把這兩個流程作為理解協程工作方式的參照。

相關文章