亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

Http Server : 一個差生的逆襲

2024-04-27 15:09:18
字體:
來源:轉載
供稿:網友

我剛畢業那會兒,國家還是包分配工作的, 我的死黨小明被分配到了一個叫數據庫的大城市,天天都可以坐在高端大氣上檔次的機房里, 在那里專門執行SQL查詢優化 , 工作穩定又舒適;

隔壁宿舍的小白被送到了編譯器鎮,在那里專門把C源文件編譯成EXE程序, 雖然累,但是技術含量非常高, 工資高,假期多。

我成績不太好,典型的差生,四級補考了兩次才過, 被發配到了一個不知道什么名字的村莊,據說要處理什么HTTP請求, 這個村莊其實就是一個破舊的電腦, 令我欣慰的是可以上網,時不時能和死黨們通個信什么的。

不過輔導員說了, 我們都有光明的前途。

1

Http Server 1.0

HTTP是個新鮮的事物, 能夠激起我一點點工作的興趣, 不至于沉淪下去。

一上班,操作系統老大扔給我一大堆文檔: “這是HTTP協議, 兩天看完!”

我這樣的英文水平,  這幾十頁的英文HTTP協議我不吃不喝不睡兩天也看不完, 死豬不怕開水燙,慢慢磨吧。

兩個星期以后, 我終于大概明白了這HTTP是怎么回事: 無非是有些電腦上的瀏覽器向我這個破電腦發送一個預先定義好的文本(Http request), 然后我這邊處理一下(通常是從硬盤上取一個后綴名是html的文件), 然后再把這個文件通過文本方式發回去(http response), 就這么簡單。

唯一麻煩的實現, 我得請操作系統給我建立Http層下面的TCP連接通道,  因為所有的文本數據都得通過這些TCP通道接收和發送, 這個通道是用socket建立的。

弄明白了原理,我很快就搞出了第一版程序, 這個程序長這個樣子:

(碼農翻身注: 詳情參加文章《張大胖的socket》)

看看, 這些socket, bind, listen , accept... 都是操作系統老大提供的接口, 我能做的也就是把他們組裝起來: 先在80端口監聽, 然后進入無限循環,如果有連接請求來了,就接受(accept),創建新的socket,  最后才可以通過這個socket來接收,發送http數據。

老大給我的程序起了個名稱, Http Server, 版本1.0 。

這個名字聽起來挺高端的, 我喜歡。

我興沖沖的拿來實驗,  程序啟動了, 在80端口“蹲守”, 過了一會兒就有連接請求了, 趕緊Accept ,建立新的socket,     成功 !  接下來就需要從socket 中讀取Http Request了。

可是這個receive 調用好慢, 我足足等了100毫秒還沒有響應 !   我被阻塞(block)住了!

操作系統老大說: “別急啊, 我也在等著從網卡那里讀數據,讀完以后就會復制給你。 ”

我樂的清閑, 可以休息一下。

可是操作系統老大說:“別介啊, 后邊還有很多瀏覽器要發起連接, 你不能在這兒歇著啊?!?/p>

我說不歇著怎么辦?  receive調用在你這里阻塞著, 我除了加入阻塞隊列, 讓出CPU讓別人用還能干什么? 

老大說: “唉, 大學里沒聽說過多進程嗎?  你現在很明顯是單進程, 一旦阻塞就完蛋了, 想辦法用下多進程,  每個進程處理一個請求!  ”

老大教訓的是, 我忘了多進程并發編程了。

2

Http 2.0 :多進程

多進程的思路非常簡單,當accept連接以后,對于這個新的socket ,  不在主進程里處理, 而是新創建子進程來接管。 這樣主進程就不會阻塞在receive 上, 可以繼續接受新的連接了。

我改寫了代碼, 把Http server 升級為V2.0,   這次運行順暢了很多, 能并發的處理很多連接了。

這個時候Web 剛剛興起, 我這個Http Server 訪問的人還不多, 每分鐘也就那么幾十個連接發過來,我輕松應對。

由于是新鮮事物, 我還有資本給搞數據庫的小明和做編譯的小白吹吹牛, 告訴他們我可是網絡高手。

沒過幾年, Web迅速發展, 我所在的破舊機器也不行了, 換成了一個性能強悍的服務器, 也搬到了四季如春的機房里。

現在每秒中都有上百個連接請求了, 有些連接持續的時間還相當的長,所以我經常得創建成百上千的進程來處理他們,每個進程都得耗費大量的系統資源, 很明顯操作系統老大已經不堪重負了。

他說: “咱們不能這么干了, 這么多進程,光是做進程切換就把我累死了。”

“要不對每個Socket連接我不用進程了, 使用線程? ”

“可能好一點, 但我還是得切換線程啊, 你想想辦法限制一下數量吧?!?/p>

我怎么限制?  我只能說同一時刻,我只能支持x個連接, 其他的連接只能排隊等待了。

這肯定不是一個好的辦法。

3

Http Server 3.0 : Select模型

老大說: “我們仔細合計合計, 對我來說,一個Socket連接就是一個所謂的文件描述符(File Descriptor ,簡稱 fd , 是個整數) , 這個fd 背后是一個簡單的數據結構, 但是我們用了一個非常重量級的東西-- 進程 --來表示對它的讀寫操作,  有點浪費啊?!?/p>

我說: “要不咱們還切換回單進程模型?  但是又會回到老路上去, 一個receive 的阻塞就什么事都干不了了”

“單進程也不是不可以,  但是我們要改變一下工作方式。”

“改成什么?” 我想不透老大在賣什么關子。

“你想想你阻塞的本質原因,  還不是因為人家瀏覽器還沒有把數據發過來, 我自然也沒法給你, 而你又迫不及待的想去讀, 我只好把你阻塞。 在單進程情況下, 一阻塞,別的事兒都干不了?!?/p>

“對,就是這樣”

“所以你接受了客戶端連接以后, 不能那么著急的去讀,  咱們這么辦, 你的每個socket fd 都有編號, 你把這些編號告訴我,  就可以阻塞休息了 ”

我問道:“這不和以前一樣嗎? 原來是調用receive 時阻塞, 現在還是阻塞”

“聽我說完, 我會在后臺檢查這些編號的socket,  如果發現這些socket 可以讀寫, 我會把對應的socket 做個標記, 把你喚醒去處理這些socket 的數據, 你處理完了,再把你的那些socket fd 告訴我, 再次進入阻塞,如此循環往復。”

我有點明白了: “ 這是我們倆的一種通信方式, 我告訴你我要等待什么東西, 然后阻塞,  如果事件發生了, 你就把我喚醒, 讓我做事情?!?/p>

“對, 關鍵點是你等我的通知, 我把你從阻塞狀態喚醒后, 你一定要去遍歷一遍所有的socket fd,看看誰有標記, 有標記的做相應處理。   我把這種方式叫做 select  ”

我用select的方式改寫了Http server, 拋棄了一個socket請求對于一個進程的模式,  現在我用一個進程就可以處理所有的socket了。

4

Http Server4.0 : epoll

這種稱為select的方式運行了一段時間, 效果還不錯, 我只管把socket fd 告訴老大, 然后等著他通知我就行了。

有一次我無意中問老大:“我每次最多可以告訴你多少個socket fd?”

“1024個”

“那就是說我一個進程最多只能監控1024個socket了? ”

"是的, 你可以考慮多用幾個進程啊"

這倒是一個辦法, 不過"select"的方式用的多了, 我就發現了弊端, 最大的問題就是我從阻塞中恢復以后,需要遍歷這1000多個socket fd, 看看有沒有標志位需要處理。

實際的情況是,  很多socket 并不活躍,  在一段時間內瀏覽器并沒有數據發過來, 這1000多個socket 可能只有那么幾十個需要真正的處理,   但是我不得不查看所有的socket fd, 這挺煩人的。

難道老大不能把那些發生了變化的socket 告訴我嗎?

我把這個想法給老大說了下, 他說:“嗯, 現在訪問量越來越大, select 方式已經不滿足要求, 我們需要與時俱進了, 我想了一個新的方式,叫做epoll”

“看到沒有, 使用epoll和select 其實類似“  老大接著說 : ” 不同的地方是第3步和第4步, 我只會告訴你那些可以讀寫的socket , 你呢只需要處理這些'ready' 的socket 就可以了“

“看來老大想的很周全, 這種方式對我來說就簡單的多了。  ”

我用epoll 把Http Server 再次升級, 由于不需要遍歷全部集合,  只需要處理哪些有變化的, 活躍的socket 文件描述符,   系統的處理能力有了飛躍的提升。

我的Http Server 受到了廣泛的歡迎, 全世界有無數人在使用, 最后死黨數據庫小明也知道了, 他問我:“ 大家都說你能輕松的支持好幾萬的并發連接, 真是這樣嗎? ”

我謙虛的說: “過獎, 其實還得做系統的優化啦?!?/p>

他說:“厲害啊,你小子走了狗屎運了啊。” 

我回答: “畢業那會兒輔導員不是說過嗎, 每個人都有光明的前途?!?/p>

(完)

碼農翻身相關歷史文章推薦:


java EE

我是一個線程  

我是一個Java class

Java:一個帝國的誕生

JDBC誕生記

JDBC后傳

一個不安分的JDBC驅動

jsp:一個裝配工的沒落

Javascript: 一個屌絲的逆襲

SPRing本質系列(1) -- 依賴注入

Spring本質系列(2) -- AOP

Http 歷險記(上)

Http 歷險記(下)—Struts的秘密

三層架構和MVC那點事兒

Java帝國之 Java Bean(上)

Java帝國之 Java Bean(下)

Java帝國之 函數式編程 (上)

Java帝國之 函數式編程 (下)

計算機網絡

我是一個路由器

我是一個網卡

TCP/IP之大明郵差

TCP/IP之大明內閣

TCP/IP之薊遼督師

張大胖的socket

IE為什么把Chrome和火狐打傷了?

對瀏覽器村的第二次采訪

節約標兵IE的自述

EMail誕生記

EMail誕生記(下)

操作系統

我是一個進程

CPU阿甘

CPU阿甘之煩惱  

我是一個鍵盤

我是一塊硬盤(上)  

我是一塊硬盤(下)

那些煩人的同步和互斥問題  

馮·諾伊曼計算機的誕生

數據庫

小李的數據庫之旅(上)

小李的數據庫之旅(下)

張大胖學數據庫

數據庫村的旺財和小王

你看到的只是冰山一角, 更多精彩文章,盡在“碼農翻身” 微信公眾號, 回復消息"m"或"目錄" 查看更多文章

from: http://chuansong.me/n/1392417151737
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品一区| 黑丝美女久久久| 欧美久久精品午夜青青大伊人| 91av国产在线| 亚洲视频在线观看网站| 欧美激情在线视频二区| 欧美高清videos高潮hd| 国产91亚洲精品| 国产精品久久久久久久av大片| 国产在线视频2019最新视频| 久久久久久91香蕉国产| 亚洲欧美日韩中文在线| 在线色欧美三级视频| 欧美精品www| 91国产美女在线观看| 欧美影院在线播放| 韩国19禁主播vip福利视频| 久久久视频免费观看| 在线精品国产成人综合| 国产精品免费小视频| 日本伊人精品一区二区三区介绍| 成人日韩在线电影| 亚洲视频电影图片偷拍一区| 深夜福利91大全| 久久久久久久网站| 欧美尺度大的性做爰视频| 欧美孕妇性xx| 一区二区在线免费视频| 久久99视频精品| 2019国产精品自在线拍国产不卡| 国产精品美女999| 亚洲变态欧美另类捆绑| 亚洲成年人在线播放| www欧美日韩| 欧美日韩亚洲国产一区| 欧洲成人性视频| 久久这里只有精品视频首页| 久久精品成人欧美大片古装| 国产精品吹潮在线观看| 欧美高清视频一区二区| 久久伊人91精品综合网站| 国产福利精品视频| 91在线观看免费网站| 亚洲xxxx视频| 中文字幕无线精品亚洲乱码一区| 久久精品99国产精品酒店日本| 91成人免费观看网站| 亚洲自拍在线观看| 97视频在线观看成人| 欧洲亚洲妇女av| 日韩av免费在线| 欧美一级在线亚洲天堂| 亚洲第一偷拍网| 亚洲成人精品av| 中文字幕精品在线| 亚洲精品中文字幕有码专区| 性金发美女69hd大尺寸| 久久久精品国产一区二区| 国产一区二区免费| 97激碰免费视频| 亚洲欧洲自拍偷拍| 综合久久五月天| 欧美午夜www高清视频| 亚洲国产日韩欧美综合久久| 色综合91久久精品中文字幕| 国产精品露脸自拍| 色偷偷av亚洲男人的天堂| 热久久美女精品天天吊色| 中文字幕日韩有码| 成人天堂噜噜噜| 亚洲国产精品成人va在线观看| 51视频国产精品一区二区| 96pao国产成视频永久免费| 久久香蕉精品香蕉| 日韩av快播网址| 欧美亚洲国产视频| 日韩欧美福利视频| 91免费国产视频| 久久久久久九九九| 日韩中文综合网| 日韩精品在线免费| 色诱女教师一区二区三区| 视频在线观看99| 55夜色66夜色国产精品视频| 亚洲成人a**站| 日韩激情第一页| 日本一本a高清免费不卡| 欧美日韩中文字幕日韩欧美| 国产精品第一第二| 欧美精品videosex性欧美| 久久亚洲精品网站| 日韩成人中文电影| 欧美日韩国产精品一区| 国产一区二区三区四区福利| 亚洲性视频网站| 欧美性少妇18aaaa视频| www高清在线视频日韩欧美| 欧美国产日韩一区二区| 国产亚洲免费的视频看| 在线亚洲午夜片av大片| 成人激情视频免费在线| 欧美日韩亚洲一区二区| 国产精品99久久久久久久久| 中文字幕在线亚洲| 97视频在线观看视频免费视频| 日韩小视频网址| 亚洲国产私拍精品国模在线观看| 久久久久亚洲精品| 青草热久免费精品视频| 亚洲电影免费观看高清完整版| 日韩精品极品在线观看播放免费视频| 欧美日韩中文在线| 亚洲人成欧美中文字幕| 国产日韩在线一区| 精品国产户外野外| 欧美人与物videos| 亚洲自拍偷拍区| 精品亚洲一区二区三区在线观看| 日韩精品欧美激情| 久久影视电视剧免费网站清宫辞电视| 日韩国产高清污视频在线观看| 成人网在线视频| 午夜美女久久久久爽久久| 日本久久久a级免费| 欧美体内谢she精2性欧美| 久久久国产视频91| 欧美日韩中国免费专区在线看| 成人国产亚洲精品a区天堂华泰| 亚洲天堂免费在线| 亚洲精品日韩欧美| 伊人久久男人天堂| 国产精品爽黄69| 国产免费亚洲高清| 中文字幕国产日韩| 91高潮精品免费porn| 久久99青青精品免费观看| 亚洲精品国产精品国自产观看浪潮| 欧美成年人视频网站欧美| 久久久久亚洲精品国产| 欧美电影在线观看网站| 欧美激情视频网址| 国产午夜精品免费一区二区三区| 韩国精品美女www爽爽爽视频| 欧美国产视频一区二区| 久久精彩免费视频| 亚洲电影中文字幕| 在线日韩欧美视频| 国产日韩欧美日韩大片| 久久亚洲欧美日韩精品专区| 欧美一区二区三区免费视| 久久久久久久香蕉网| 久久久免费精品| 欧美激情va永久在线播放| 日韩在线观看免费高清完整版| 国产精品一区二区在线| 欧美另类老女人| 国产精品一区二区三区毛片淫片| 国产成人精品免费久久久久| 国产精品99久久久久久久久久久久| 日本久久久久久久久久久| 国产一区二区三区在线看| 日韩经典第一页| 国产成人精品久久二区二区| 国产日韩欧美视频|