一個簡單、輕量的 Linux 協程實現

HevTaskSystem (https://github.com/heiher/hev-task-system) 是一個簡單的、輕量的多任務系統(或稱協程),它工作於 Linux 平臺,I/O event poll 基於 Epoll。


協程其實是一種古老的技術,協程有這麼幾個特點:

  1. 協程是一個併發運行的多任務系統,一般由一個操作系統線程驅動。
  2. 協程任務元數據資源佔用比操作系統線程更低,且任務切換開銷小。
  3. 協程是任務間協作式調度,即某一任務主動放棄執行後進而調度另外一任務投入運行。

與異步、非阻塞式I/O模型類似,協程技術同樣適用於處理海量的併發I/O任務,而且還不會像異步方式使業務代碼邏輯支離破碎。

基本信息

HevTaskSystem 目前開放了四個類:HevTaskSystem、HevTask、HevTaskPoll 和 HevMemoryAllocator。

HevTaskSystem 是協程任務系統,管理、調度眾多的 HevTask 實例運行。由單一操作系統線程驅動,多個線程可並行驅動多套任務系統。

HevTask 是協程任務,實例可加入某一 HevTaskSystem 中調度運行。

HevTaskPoll 是提供了 poll 兼容的系統調用。

HevMemoryAllocator 是一個內存分配器接口,其後端有兩套實現:

  • 原始分配器,等價於 malloc/free。
  • Slice 分配器,按分配大小限量緩存的分配器,緩存替換算法是 LRU。

Public API

  • TaskSystem – 參考 github 代碼倉庫的頭文件:hev-task-system.h
  • Task – 參考 github 代碼倉庫的頭文件:hev-task.h
  • TaskPoll – 參考 github 代碼倉庫的頭文件:hev-task-poll.h
  • MemoryAllocator – 參考 github 代碼倉庫的頭文件:hev-memory-allocator.h

簡單示例

該示例演示了在主線程上運行一個協程任務系統,並創建兩個獨立的協程任務,分別以不同的優先級運行各自的入口函數。各自的入口函數中各循環2次,每次打印一個字符串並 yield 釋放CPU 觸發調度切換。

<code>/*============================================================================Name:simple.cAuthor:HeiherCopyright:Copyright(c)2017everyone.Description:============================================================================*/#include<stdio.h>#include<hev-task.h>#include<hev-task-system.h>staticvoidtask_entry1(void*data){inti;for(i=0;i<2;i++){printf("hello1\\n");/*主動放棄執行,yield函數會觸發重新調度選取另一任務投入執行*/hev_task_yield(HEV_TASK_YIELD);}}staticvoidtask_entry2(void*data){inti;for(i=0;i<2;i++){printf("hello2\\n");hev_task_yield(HEV_TASK_YIELD);}}intmain(intargc,char*argv[]){HevTask*task;/*在當前線程上初始化tasksystem*/hev_task_system_init();/*創建一個新的task,棧空間採用默認大小*/task=hev_task_new(-1);/*設置該task的優先級為1*/hev_task_set_priority(task,1);/*將該task放入當前線程的tasksystem中,任務人口函數為task_entry1* task_entry1 並不會在 hev_task_run 執行後立即調用,需等到該 task 被調度。*/hev_task_run(task,task_entry1,NULL);task=hev_task_new(-1);hev_task_set_priority(task,0);hev_task_run(task,task_entry2,NULL);/*運行當前線程上相關的tasksystem,當無任務可調度時該函數返回*/hev_task_system_run();/*銷燬當前線程上相關的tasksystem*/hev_task_system_fini();return0;}/<hev-task-system.h>/<hev-task.h>/<stdio.h> 
/<code>



分享到:


相關文章: