monkv開(kāi)發(fā)筆記:關(guān)于epoll和I/O的梳理,以及搔课。胰柑。。某些吐槽

繼續(xù)寫我的mini服務(wù)器monkv爬泥。目前還只能支持get方法柬讨。
今天用webbench做壓測(cè)的時(shí)候,效果非常差袍啡,百思不得其解踩官。按理說(shuō)我這個(gè)mini服務(wù)器做的全部工作就是根據(jù)url讀響應(yīng)的文件,然后寫入客戶端socket葬馋,正因?yàn)樘幚磉^(guò)程非常簡(jiǎn)單卖鲤,所以性能應(yīng)該很高才對(duì),為什么顯示性能很差呢畴嘶?
找了半天原因蛋逾,還是epoll設(shè)置問(wèn)題以及對(duì)recv和send方法返回值的理解不夠,在網(wǎng)上找了資料窗悯,找到一篇文章很好区匣,文章鏈接在后面的參考里面。所以現(xiàn)在把關(guān)于epoll以及與epoll對(duì)應(yīng)的I/O的知識(shí)再梳理一遍蒋院。其實(shí)就是把這篇文章里面的東西拷貝了過(guò)來(lái)亏钩,但把一篇文章細(xì)細(xì)讀一遍,然后轉(zhuǎn)述一下欺旧,還是很有意義的姑丑。

epoll的流程

1,新建服務(wù)端socket辞友,暫記為server_sock栅哀,將server_sock注冊(cè)到epoll
2震肮,監(jiān)聽(tīng)epoll,如果server_sock上有可讀事件留拾,說(shuō)明有來(lái)自客戶端的新連接戳晌,accept客戶端連接(* 插入一個(gè)問(wèn)題,回想一下TCP三次握手的流程痴柔,accept方法是哪一步返回呢 *)沦偎,暫記為client_sock,并注冊(cè)進(jìn)epoll事件(該客戶端socket可以設(shè)置非阻塞或者非阻塞)
3咳蔚,監(jiān)聽(tīng)epoll豪嚎,如果客戶端socket上有可讀事件。用read或者recv方法讀取client_sock上的字符串屹篓,疙渣。有以下幾種情況:

  • recv返回值 > 0:讀到了內(nèi)容,正常處理

  • recv返回值 = 0:客戶端對(duì)方的socket關(guān)閉堆巧,處理方式:關(guān)閉客戶端socket妄荔,刪除epoll事件,并且記入log

  • recv返回值 < 0:出錯(cuò)谍肤,并且設(shè)置errno啦租,出錯(cuò)又分為以下情況:

    • errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN:連接正常,常見(jiàn)的原因是已經(jīng)全部讀取socket數(shù)據(jù)荒揣,更新epoll事件篷角,并且處理已經(jīng)讀到的內(nèi)容,需要注意的是如果socket是阻塞的系任,則會(huì)一直阻塞在recv方法上

    • 其他情況恳蹲,連接異常,處理方式:關(guān)閉客戶端socket俩滥,刪除epoll事件嘉蕾,并且記入log

4,讀完socket之后霜旧,解析字符串错忱,生成響應(yīng)文本,開(kāi)始等待epoll的寫入事件挂据,調(diào)用send方法以清。send方法的返回值以及對(duì)應(yīng)的含義包括errno和recv方式類似

與I/O相關(guān)的errno以及對(duì)應(yīng)的含義

EAGAIN:套接字已標(biāo)記為非阻塞,而接收操作被阻塞或者接收超時(shí)
EBADF:sock不是有效的描述詞
ECONNREFUSE:遠(yuǎn)程主機(jī)阻絕網(wǎng)絡(luò)連接
EFAULT:內(nèi)存空間訪問(wèn)出錯(cuò)
EINTR:操作被信號(hào)中斷
EINVAL:參數(shù)無(wú)效
ENOMEM:內(nèi)存不足
ENOTCONN:與面向連接關(guān)聯(lián)的套接字尚未被連接上
ENOTSOCK:sock索引的不是套接字 當(dāng)返回值是0時(shí)崎逃,為正常關(guān)閉連接
EWOULDBLOCK:與EAGAIN相同

還有幾個(gè)問(wèn)題不太明白(不知道下面的描述能不能看懂)

  • socket上的緩存區(qū)是在內(nèi)核空間嗎掷倔?
  • read或者recv是復(fù)制socket緩存區(qū)上的內(nèi)容到指定地址上,復(fù)制之后肯定還要?jiǎng)h除socket讀寫緩存以便進(jìn)行下一次I/O个绍。具體的過(guò)程是怎樣的今魔?

關(guān)于I/O的重要性以及勺像。障贸。错森。某些吐槽

以前對(duì)I/O并不重視,覺(jué)得非常簡(jiǎn)單篮洁。我之前是做PHP的(其實(shí)如果沒(méi)有變化的話涩维,今后我也是做PHP的,不過(guò)以前是純PHP程序員袁波,今后可能是偽裝成PHPer的C程序員瓦阐,嘿嘿),類似PHP這種高級(jí)語(yǔ)言做的更多是表現(xiàn)層面的事情篷牌,已經(jīng)將I/O封裝的很完美了睡蟋,所以不需要了解I/O的具體細(xì)節(jié)就可以實(shí)現(xiàn)很多炫酷的功能。記得第一次看《Unix環(huán)境高級(jí)編程》的時(shí)候枷颊,覺(jué)得幾乎整本書(shū)都在講I/O戳杀,這有什么好講的呢?現(xiàn)在看夭苗,我真是naive呀信卡,too young too simple。
曾經(jīng)你覺(jué)得不值一提的東西题造,會(huì)在將來(lái)的某個(gè)瞬間傍菇,忽然讓你莫名的心痛。早歲那知世事艱呀界赔,只是當(dāng)時(shí)已惘然丢习。這是我這些年來(lái)一直重復(fù)不斷的一種體驗(yàn)。
I/O太重要了淮悼。從某種意義上說(shuō)咐低,計(jì)算機(jī)的工作就兩個(gè),計(jì)算和I/O敛惊,所有的程序無(wú)非是趨向于計(jì)算或者趨向于I/O渊鞋。而網(wǎng)絡(luò)編程,例如HTTP或者TCP瞧挤,甚至UDP锡宋,都是偏向I/O的。對(duì)大多數(shù)的web應(yīng)用而言特恬,I/O是網(wǎng)絡(luò)編程里面資源消耗最大的部分执俩。所以對(duì)I/O的理解和熟悉是一個(gè)網(wǎng)絡(luò)工程師的最核心素質(zhì)之一。

我的路還很長(zhǎng)癌刽,最近常常陷入一種迷茫役首,就是感覺(jué)自己明白了一個(gè)知識(shí)點(diǎn)之后隨即發(fā)現(xiàn)這個(gè)知識(shí)點(diǎn)背后還有五個(gè)六個(gè)甚至十個(gè)知識(shí)點(diǎn)需要去學(xué)習(xí)尝丐。知識(shí)是越學(xué)越多,又找不到工作衡奥,進(jìn)亦憂退亦憂爹袁。我也挺努力的,為人也溫和圓潤(rùn)矮固,但就是不知道為什么失息,我的生活總會(huì)陷入一種怪圈。我不勝其煩卻無(wú)能為力档址。
說(shuō)句心里話盹兢,這些年,我活得很不盡興守伸。

參考文章:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绎秒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尼摹,更是在濱河造成了極大的恐慌见芹,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窘问,死亡現(xiàn)場(chǎng)離奇詭異辆童,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)惠赫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門把鉴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人儿咱,你說(shuō)我怎么就攤上這事庭砍。” “怎么了混埠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵怠缸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我钳宪,道長(zhǎng)揭北,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任吏颖,我火速辦了婚禮搔体,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘半醉。我一直安慰自己疚俱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布缩多。 她就那樣靜靜地躺著呆奕,像睡著了一般养晋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上梁钾,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天绳泉,我揣著相機(jī)與錄音,去河邊找鬼陈轿。 笑死圈纺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的麦射。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼灯谣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼潜秋!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起胎许,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤峻呛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后辜窑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钩述,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年穆碎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牙勘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡所禀,死狀恐怖方面,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情色徘,我是刑警寧澤恭金,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站褂策,受9級(jí)特大地震影響横腿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斤寂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一耿焊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扬蕊,春花似錦搀别、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒂培。三九已至,卻和暖如春榜苫,著一層夾襖步出監(jiān)牢的瞬間护戳,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工垂睬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媳荒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓驹饺,卻偏偏與公主長(zhǎng)得像钳枕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赏壹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容