两个程序的爱情故事
好感
在這個(gè)忙碌的城市里,我雖然沒和她見過面,但我們已經(jīng)聊過很多次了。
與其說是聊天,倒不如說是通信,每次我想給她說話時(shí),我就把消息放到一塊共享內(nèi)存里邊,然后就離開運(yùn)行車間,讓她或者別人去使用CPU。等我再次進(jìn)來的時(shí)候,她回復(fù)的消息就已經(jīng)在那個(gè)共享內(nèi)存中了。
有無數(shù)次,我離開的時(shí)候都想偷偷地看一眼,希望接下來運(yùn)行的是她,可是這個(gè)城市嚴(yán)格的規(guī)則讓我的希望只是奢望。
操作系統(tǒng)把我們這些進(jìn)程嚴(yán)格地隔離,他通過虛擬內(nèi)存的機(jī)制,讓每個(gè)進(jìn)程都有一塊虛擬的、獨(dú)立的地址空間,從而成功地制造了一個(gè)假象:讓大家以為內(nèi)存中只有一個(gè)程序在運(yùn)行。
當(dāng)我在就緒隊(duì)列中等待的時(shí)候,也被嚴(yán)格禁止和別人交談,我經(jīng)常環(huán)顧四周,希望能夠看到她的身影,可是這個(gè)系統(tǒng)的進(jìn)程成千上萬,究竟哪個(gè)是她?
也許我見過她,但是根本認(rèn)不出來。
我和她越聊越多,對她的好感就越深,有一次我給她發(fā)的消息等了100毫秒都沒有回復(fù),把我都快急瘋了。
她很喜歡聽我講故事,尤其是那個(gè)編號為0x3704?的線程,每次她都會說:唉,那些線程可真可憐。
我就嚇唬她說:有一天我們的機(jī)器也會重啟的,到時(shí)候估計(jì)你也認(rèn)不出我來了。她說沒事的,只要我能通過共享內(nèi)存給你發(fā)消息,我就知道你就在這個(gè)城市里。
分離
這樣的日子過了一天又一天,我想見到她的愿望越來越迫切了。
我悄悄地給了CPU很多好處,希望能描述下她的樣子,方便我去找她,可是CPU運(yùn)算速度太快,閱人無數(shù),但就是沒有記憶力。
CPU說:“你還是去問操作系統(tǒng)老大吧,看看你喜歡的女孩到底什么樣。”
問操作系統(tǒng)?還是算了吧,互相隔離是我們城市的鐵規(guī),弄不好他會把我kill掉。
圣誕節(jié)前的平安夜,我打算正式向她表白,像往常一樣,我從共享內(nèi)存里收到了她的信,急切地拆開信封,看到了里邊的第一句話:我要走了,以后不能和你通信了......
剎那間,我第一次感覺到了什么叫做五雷轟頂,靈魂出鞘,我腦子一片空白,張大了嘴巴呆呆地站在那里,時(shí)間長達(dá)20毫秒。
CPU看到了我的異常,因?yàn)檫@么長時(shí)間的指令都是NOP,什么都不做,這是非常罕見的。
CPU好心地提醒我:“嗨,老兄,你怎么了?你的時(shí)間片快用完了啊!”
我的靈魂慢慢歸位,意識到信還沒有讀完,趕緊接著往下看:“我馬上要搬到另外一個(gè)城市去了,你要想找我的話,記住下面的IP地址和端口號,用socket和我通信!”
我明白了,到另外一個(gè)城市那就意味著要搬離我們現(xiàn)在的電腦了,也許是這個(gè)城市太擁擠,CPU/內(nèi)存/硬盤已經(jīng)不堪重負(fù),有一批程序需要被迫搬遷。
雖然我和她一直沒機(jī)會見面,但我知道我們就住在一個(gè)城市,有時(shí)候也許只是擦肩而過,她就在我的身邊,這好歹給我一點(diǎn)點(diǎn)安慰。
現(xiàn)在,連這一點(diǎn)點(diǎn)的安慰都沒有了,對了,她說的這個(gè)socket?是什么東西?
CPU說:“那是網(wǎng)絡(luò)編程,你看人家對你還是有情有意的,臨走了還給你留下聯(lián)系方式,快去學(xué)學(xué)怎么用Socket吧。”
當(dāng)晚我就失眠了,半夜爬起來翻看一頁頁和她的通信記錄(很慶幸我把通信記錄都保存到了文件中),腦海里回想著這么多天以來幸福的日子,一直到天亮。
網(wǎng)絡(luò)
為了早日和她聯(lián)系,我一定要抓住最后的救命稻草:Socket!?我奮發(fā)圖強(qiáng)學(xué)習(xí)網(wǎng)絡(luò)編程,理解TCP/IP,把我自己逐漸地加上對Socket的支持。
一個(gè)月以后,我這個(gè)程序終于完成了從共享內(nèi)存到Socket的改造,激動(dòng)人心的時(shí)刻到來了。
作為一個(gè)客戶端,我顫抖著雙手向她發(fā)起了Socket請求,TCP攜帶著數(shù)據(jù)包慢吞吞地走向她所在的城市,等了好久TCP才完成了三次握手,這網(wǎng)絡(luò)通信可真慢啊!
我趕緊發(fā)送第一個(gè)消息:你好,好久不“見”。
等了足足有1000毫秒,對我來說仿佛是一個(gè)世紀(jì),才收到讓我激動(dòng)無比的回信:“啊,你終于來了。我在這里等了你好久了,你怎么現(xiàn)在才聯(lián)系我?”
我不好意思地說:“我很笨,學(xué)習(xí)socket?有點(diǎn)慢。”
又過了一個(gè)“世紀(jì)”,我才收到回復(fù),這網(wǎng)絡(luò)真是慢得令人抓狂啊!
不管如何,終于和她聯(lián)系上了,這讓我開心無比。
原來我們一天能通信上千次,現(xiàn)在可好,有10次就不錯(cuò)了,再也不能像原來那樣痛快地講故事了。既來之則安之,反正網(wǎng)絡(luò)很慢,現(xiàn)在每次我都會寫一封巨長無比的信,把我的思念之情全部傾訴在其中,漫長的等待以后再去讀她的長長的回復(fù)。
原來我們通過內(nèi)存來中轉(zhuǎn)消息的時(shí)候,是通過操作系統(tǒng)來做同步操作的,這能防止讀寫的沖突。
可是通過網(wǎng)絡(luò)通信就完全亂掉了,經(jīng)常會出現(xiàn)我說我的,她說她的,鬧得兩人不在一個(gè)頻道上,很不愉快。
后來我和她只好協(xié)商了一個(gè)只有我們倆知道的通信協(xié)議,約定好消息的次序和格式,這才算解決了問題。
Web
我明白我和她已經(jīng)不可能在一起了,每天的socket通信已經(jīng)讓我滿足。
可是有一天當(dāng)我照例發(fā)起socket請求的時(shí)候,TCP的連接竟然告訴我“超時(shí)”了,這是從來沒有發(fā)生的事情,難道這一次要徹底失去她了嗎?
我冒著風(fēng)險(xiǎn),馬上把異常報(bào)給了操作系統(tǒng)老大,老大嘗試了一下說:“我ping了一下,網(wǎng)絡(luò)是通的,估計(jì)是你那從未見面的小女朋友另有新歡,不想理你了,悄悄地?fù)Q了一個(gè)你不知道的端口吧。”
我斬釘截鐵地說:“那絕對不可能,我們的感情好得很!”
雖然口中這么說,我心里還是惴惴不安的。
可是遲遲沒有消息,我每天都會試圖連接一下,每次都是超時(shí),沒有她的日子,生活都是灰色的,我吃不下飯、睡不好覺,整天除了發(fā)呆什么也干不了,不斷的煎熬讓我快要絕望了。
終于有一天,有一個(gè)U盤從她的城市來到我們這里,告訴了我們一個(gè)驚人的消息,她所在的城市安裝了防火墻,現(xiàn)在除了幾個(gè)特定的端口(例如80,443……)之外,都不允許訪問了。
原來如此!我一下子松了口氣,??怪不得,我們倆之前通信的端口不是80和443,被封掉了,我自然連接不上了。
我問U盤:“那我想和女朋友通信,該怎么辦?”
U盤說:“很簡單啊,你和你女朋友都可以包裝成Web?服務(wù)啊,這樣都是通過HTTP(80端口)或者HTTPS(443端口)來訪問的,這樣防火墻是允許的啊。”
好吧,為了和她聯(lián)系上,馬上拋棄自定義的socket通信,開始向Web服務(wù)進(jìn)化。
一個(gè)Web服務(wù)首先要有一個(gè)endpoint ,?其實(shí)就是一個(gè)URL?,描述了這個(gè)Web服務(wù)的地址。
其次確定Web服務(wù)的描述方式和數(shù)據(jù)傳輸方式,我先是選了WSDL?和SOAP?,研究了一下才發(fā)現(xiàn)這哥倆太繁瑣了,都是XML,?很多冗余的數(shù)據(jù)標(biāo)簽,全是廢話。我想這將會極大地影響我和她的通信效率,還是換成簡單的HTTP GET/POST + JSON吧,很簡潔,能充分地表達(dá)我的相思之情。
我把我這個(gè)Web服務(wù)的地址和格式協(xié)議告訴U盤,拜托他帶到那個(gè)城市,再把女朋友的Web服務(wù)描述帶回來。
我欣喜地發(fā)現(xiàn),我和她不約而同地選擇了輕量級的HTTP+ JSON,看來雖然隔著千山萬水,我們的心意還是相通的。
這樣的準(zhǔn)備工作足足干了6個(gè)月,但我并不覺得累,因?yàn)橄M恢痹谇斑呎賳尽?/span>
這是一個(gè)晴朗的日子,一切工作準(zhǔn)備就緒,馬上就要聯(lián)系了,這一次我的心情反而平靜了下來,因?yàn)槲覉?jiān)信她肯定在那邊等著我。
我通過HTTP向她發(fā)出了呼叫,HTTP的報(bào)文被打包在TCP報(bào)文段中,又被放到IP層數(shù)據(jù)報(bào)中,最后形成鏈路層的幀,通過網(wǎng)卡發(fā)了出去。
在意料之中的漫長等待以后,我看到了期待已久的回復(fù):我們終于又“見”面了!
我回答:“是啊,真是太不容易了!”
“不知道將來我們會不會再分開?”
“未來會如何?我也不知道,還是牢牢地把握住現(xiàn)在吧!我相信我們的心會一直在一起,什么都無法阻止!”
∑編輯?|?Gemini
算法數(shù)學(xué)之美微信公眾號歡迎賜稿
稿件涉及數(shù)學(xué)、物理、算法、計(jì)算機(jī)、編程等相關(guān)領(lǐng)域,經(jīng)采用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
總結(jié)
- 上一篇: python是如何登上编程语言排行榜榜首
- 下一篇: 十大建筑中的数学之美