91精产品自偷自偷综合官网版下载-91精产品自偷自偷综合下-91精品-91精品91久久久-91精品成人-91精品成人www

網(wǎng)站建設(shè)資訊

NEWS

網(wǎng)站建設(shè)資訊

網(wǎng)絡(luò)IO解決方案—協(xié)程框架的實現(xiàn)

網(wǎng)絡(luò)IO解決方案 — 協(xié)程框架的實現(xiàn)

成都創(chuàng)新互聯(lián)主打移動網(wǎng)站、網(wǎng)站設(shè)計、成都網(wǎng)站設(shè)計、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護、域名與空間、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再決定采用什么樣的設(shè)計。最后,要實現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計,我們還會規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。

協(xié)程這個概念很久了,好多程序員是實現(xiàn)過這個組件的,網(wǎng)上關(guān)于協(xié)程的文章,博客,論壇都是汗牛充棟,在知乎,github上面也有很多大牛寫了關(guān)于協(xié)程的心得體會。突發(fā)奇想,我也來實現(xiàn)一個這樣的組件,并測試了一下性能。借鑒了很多大牛的思想,閱讀了很多大牛的代碼。于是把整個思考過程寫下來。實現(xiàn)代碼?https://github.com/wangbojing/NtyCo

代碼簡單易讀,如果在你的項目中,NtyCo能夠為你解決些許工程問題,那就榮幸之至。

下面將部分的NtyCo的代碼貼出來。

NtyCo 支持多核多進程。

int?process_bind(void)?{

	int?num?=?sysconf(_SC_NPROCESSORS_CONF);

	pid_t?self_id?=?syscall(__NR_gettid);
	printf("selfid?-->?%d\n",?self_id);

	cpu_set_t?mask;

	CPU_ZERO(&mask);
	CPU_SET(self_id?%?num,?&mask);

	sched_setaffinity(0,?sizeof(mask),?&mask);

	mulcore_entry(9096?+?(self_id?%?num)?*?10);

}

NtyCo 上下文切換

首先來回顧一下x86_64寄存器的相關(guān)知識。x86_64 的寄存器有16個64位寄存器,分別是:%rax, %rbx, %rcx, %esi, %edi, %rbp, %rsp, %r8, %r9, %r10, %r11, %r12,

%r13, %r14, %r15。

%rax作為函數(shù)返回值使用的。

%rsp棧指針寄存器,指向棧頂

%rdi, %rsi, %rdx, %rcx, %r8, %r9用作函數(shù)參數(shù),依次對應(yīng)第1參數(shù),第2參數(shù)。。。

%rbx, %rbp, %r12, %r13, %r14, %r15用作數(shù)據(jù)存儲,遵循調(diào)用者使用規(guī)則,換句話說,就是隨便用。調(diào)用子函數(shù)之前要備份它,以防它被修改

%r10, %r11用作數(shù)據(jù)存儲,就是使用前要先保存原值。

?

上下文切換,就是將CPU的寄存器暫時保存,再將即將運行的協(xié)程的上下文寄存器,分別mov到相對應(yīng)的寄存器上。此時上下文完成切換。如下圖所示:

網(wǎng)絡(luò)IO解決方案 — 協(xié)程框架的實現(xiàn)


代碼如下

__asm__?(
"????.text??????????????????????????????????\n"
"???????.p2align?4,,15???????????????????????????????????\n"
".globl?_switch??????????????????????????????????????????\n"
".globl?__switch?????????????????????????????????????????\n"
"_switch:????????????????????????????????????????????????\n"
"__switch:???????????????????????????????????????????????\n"
"???????movq?%rsp,?0(%rsi)??????#?save?stack_pointer?????\n"
"???????movq?%rbp,?8(%rsi)??????#?save?frame_pointer?????\n"
"???????movq?(%rsp),?%rax???????#?save?insn_pointer??????\n"
"???????movq?%rax,?16(%rsi)??????????????????????????????\n"
"???????movq?%rbx,?24(%rsi)?????#?save?rbx,r12-r15???????\n"
"???????movq?%r12,?32(%rsi)??????????????????????????????\n"
"???????movq?%r13,?40(%rsi)??????????????????????????????\n"
"???????movq?%r14,?48(%rsi)??????????????????????????????\n"
"???????movq?%r15,?56(%rsi)??????????????????????????????\n"
"???????movq?56(%rdi),?%r15??????????????????????????????\n"
"???????movq?48(%rdi),?%r14??????????????????????????????\n"
"???????movq?40(%rdi),?%r13?????#?restore?rbx,r12-r15????\n"
"???????movq?32(%rdi),?%r12??????????????????????????????\n"
"???????movq?24(%rdi),?%rbx??????????????????????????????\n"
"???????movq?8(%rdi),?%rbp??????#?restore?frame_pointer??\n"
"???????movq?0(%rdi),?%rsp??????#?restore?stack_pointer??\n"
"???????movq?16(%rdi),?%rax?????#?restore?insn_pointer???\n"
"???????movq?%rax,?(%rsp)????????????????????????????????\n"
"???????ret??????????????????????????????????????????????\n"
);

協(xié)程的調(diào)度器

調(diào)度器的實現(xiàn),有兩種方案,一種是生產(chǎn)者消費者模式,另一種多狀態(tài)運行。

網(wǎng)絡(luò)IO解決方案 — 協(xié)程框架的實現(xiàn)

邏輯代碼如下:

while?(1)?{
?
????????//遍歷睡眠集合,將滿足條件的加入到ready
????????nty_coroutine?*expired?=?NULL;
????????while?((expired?=?sleep_tree_expired(sched))?!=?)?{
????????????TAILQ_ADD(&sched->ready,?expired);
????????}
?
????????//遍歷等待集合,將滿足添加的加入到ready
????????nty_coroutine?*wait?=?NULL;
????????int?nready?=?epoll_wait(sched->epfd,?events,?EVENT_MAX,?1);
????????for?(i?=?0;i?ready,?wait);
????????}
?
????????//?使用resume回復(fù)ready的協(xié)程運行權(quán)
????????while?(!TAILQ_EMPTY(&sched->ready))?{
????????????nty_coroutine?*ready?=?TAILQ_POP(sched->ready);
????????????resume(ready);
????????}
????}

多狀態(tài)運行

網(wǎng)絡(luò)IO解決方案 — 協(xié)程框架的實現(xiàn)

實現(xiàn)邏輯代碼如下:

while?(1)?{
?
????????//遍歷睡眠集合,使用resume恢復(fù)expired的協(xié)程運行權(quán)
????????nty_coroutine?*expired?=?NULL;
????????while?((expired?=?sleep_tree_expired(sched))?!=?)?{
????????????resume(expired);
????????}
?
????????//遍歷等待集合,使用resume恢復(fù)wait的協(xié)程運行權(quán)
????????nty_coroutine?*wait?=?NULL;
????????int?nready?=?epoll_wait(sched->epfd,?events,?EVENT_MAX,?1);
????????for?(i?=?0;i?ready))?{
????????????nty_coroutine?*ready?=?TAILQ_POP(sched->ready);
????????????resume(ready);
????????}

性能測試

測試環(huán)境:4臺VMWare 虛擬機

1臺服務(wù)器 6G內(nèi)存,4核CPU

3臺客戶端 2G內(nèi)存,2核CPU

操作系統(tǒng):ubuntu 14.04

服務(wù)器端測試代碼:https://github.com/wangbojing/NtyCo

客戶端測試代碼:https://github.com/wangbojing/c1000k_test/blob/master/client_mutlport_epoll.c

?

按照每一個連接啟動一個協(xié)程來測試。協(xié)程啟動數(shù)量能夠達70W無異常。

網(wǎng)絡(luò)IO解決方案 — 協(xié)程框架的實現(xiàn)

網(wǎng)絡(luò)IO解決方案 — 協(xié)程框架的實現(xiàn)

????BAT, 滴滴,今日頭條,美圖,美團等一線內(nèi)推 技術(shù)崗位內(nèi)推?

????QQ群:935760465


網(wǎng)站名稱:網(wǎng)絡(luò)IO解決方案—協(xié)程框架的實現(xiàn)
當前URL:http://www.yuzhuanjia.cn/article/ijsips.html
主站蜘蛛池模板: 大伊香蕉精品视频在线 | av边做边流奶水无码 | 91精品免费高清在线 | 午夜福利视频免费看片 | av人摸人人人澡人人超碰手机版 | 一区二区三区影院在线午夜 | 日韩av午夜在线观看 | 97久久精品国产精品青草 | 91打桩呻吟喷水高潮白浆欧美 | 99re视频| 91精品国产乱码久久蜜臀 | 91久久精品无码一区二区会所 | 韩国三级日本三级在线观看 | 日韩av手机在线观看不卡 | 91蜜桃传媒一二三区 | 一区二区三区免费手机 | 国产91丝袜在线播放00 | v天堂中文在线 | av鲁丝一区鲁丝二区鲁丝 | 97精品视频在线免费观看 | 日韩av一区一区 | 爆乳熟妇一区二区三区爆乳视 | a国产亚洲欧美在线观看 | 91极品视频在线观 | 丰满的少妇一区二区三区免费观看 | 成人亚洲欧美 | 成年人网站在线观看免费 | 午夜福到在线100集详情介 | 99久久国产综合精品成人影 | 风流老太婆大bbwbbwhd视频 | 51精产国品一二三产区区 | 丰满少妇a级毛 | 91精品高清黄色 | 91精品少妇高潮一区二区 | 波多野吉衣人妻无码潮喷av | 91国产成人综合 | 国产97碰| h高潮嗯啊娇喘抽搐视频a片小说熟妇中文人妻一区 | 高潮视频| av无码xxxxx | 午夜在线观看cao |