好感
在这个忙碌的城市里,我虽然没和她见过面,但我们已经聊过很多次了。
与其说是聊天,倒不如说是通信,每次我想给她说话时,我就把消息放到一块共享内存里边,然后就离开运行车间,让她或者别人去使用CPU。等我再次进来的时候,她回复的消息就已经在那个共享内存中了。
有无数次,我离开的时候都想偷偷地看一眼,希望接下来运行的是她,可是这个城市严格的规则让我的希望只是奢望。
操作系统把我们这些进程严格地隔离,他通过虚拟内存的机制,让每个进程都有一块虚拟的、独立的地址空间,从而成功地制造了一个假象:让大家以为内存中只有一个程序在运行。
当我在就绪队列中等待的时候,也被严格禁止和别人交谈,我经常环顾四周,希望能够看到她的身影,可是这个系统的进程成千上万,究竟哪个是她?
也许我见过她,但是根本认不出来。
我和她越聊越多,对她的好感就越深,有一次我给她发的消息等了100毫秒都没有回复,把我都快急疯了。
她很喜欢听我讲故事,尤其是那个编号为0x3704 的线程,每次她都会说:唉,那些线程可真可怜。
我就吓唬她说:有一天我们的机器也会重启的,到时候估计你也认不出我来了。她说没事的,只要我能通过共享内存给你发消息,我就知道你就在这个城市里。
分离
这样的日子过了一天又一天,我想见到她的愿望越来越迫切了。
我悄悄地给了CPU很多好处,希望能描述下她的样子,方便我去找她,可是CPU运算速度太快,阅人无数,但就是没有记忆力。
CPU说:“你还是去问操作系统老大吧,看看你喜欢的女孩到底什么样。”
问操作系统?还是算了吧,互相隔离是我们城市的铁规,弄不好他会把我kill掉。
圣诞节前的平安夜,我打算正式向她表白,像往常一样,我从共享内存里收到了她的信,急切地拆开信封,看到了里边的第一句话:我要走了,以后不能和你通信了......
刹那间,我第一次感觉到了什么叫做五雷轰顶,灵魂出鞘,我脑子一片空白,张大了嘴巴呆呆地站在那里,时间长达20毫秒。
CPU看到了我的异常,因为这么长时间的指令都是NOP,什么都不做,这是非常罕见的。
CPU好心地提醒我:“嗨,老兄,你怎么了?你的时间片快用完了啊!”
我的灵魂慢慢归位,意识到信还没有读完,赶紧接着往下看:“我马上要搬到另外一个城市去了,你要想找我的话,记住下面的IP地址和端口号,用socket和我通信!”
我明白了,到另外一个城市那就意味着要搬离我们现在的电脑了,也许是这个城市太拥挤,CPU/内存/硬盘已经不堪重负,有一批程序需要被迫搬迁。
虽然我和她一直没机会见面,但我知道我们就住在一个城市,有时候也许只是擦肩而过,她就在我的身边,这好歹给我一点点安慰。
现在,连这一点点的安慰都没有了,对了,她说的这个socket 是什么东西?
CPU说:“那是网络编程,你看人家对你还是有情有意的,临走了还给你留下联系方式,快去学学怎么用Socket吧。”
当晚我就失眠了,半夜爬起来翻看一页页和她的通信记录(很庆幸我把通信记录都保存到了文件中),脑海里回想着这么多天以来幸福的日子,一直到天亮。
网络
为了早日和她联系,我一定要抓住最后的救命稻草:Socket! 我奋发图强学习网络编程,理解TCP/IP,把我自己逐渐地加上对Socket的支持。
一个月以后,我这个程序终于完成了从共享内存到Socket的改造,激动人心的时刻到来了。
作为一个客户端,我颤抖着双手向她发起了Socket请求,TCP携带着数据包慢吞吞地走向她所在的城市,等了好久TCP才完成了三次握手,这网络通信可真慢啊!
我赶紧发送第一个消息:你好,好久不“见”。
等了足足有1000毫秒,对我来说仿佛是一个世纪,才收到让我激动无比的回信:“啊,你终于来了。我在这里等了你好久了,你怎么现在才联系我?”
我不好意思地说:“我很笨,学习socket 有点慢。”
又过了一个“世纪”,我才收到回复,这网络真是慢得令人抓狂啊!
不管如何,终于和她联系上了,这让我开心无比。
原来我们一天能通信上千次,现在可好,有10次就不错了,再也不能像原来那样痛快地讲故事了。既来之则安之,反正网络很慢,现在每次我都会写一封巨长无比的信,把我的思念之情全部倾诉在其中,漫长的等待以后再去读她的长长的回复。
原来我们通过内存来中转消息的时候,是通过操作系统来做同步操作的,这能防止读写的冲突。
可是通过网络通信就完全乱掉了,经常会出现我说我的,她说她的,闹得两人不在一个频道上,很不愉快。
后来我和她只好协商了一个只有我们俩知道的通信协议,约定好消息的次序和格式,这才算解决了问题。
Web
我明白我和她已经不可能在一起了,每天的socket通信已经让我满足。
可是有一天当我照例发起socket请求的时候,TCP的连接竟然告诉我“超时”了,这是从来没有发生的事情,难道这一次要彻底失去她了吗?
我冒着风险,马上把异常报给了操作系统老大,老大尝试了一下说:“我ping了一下,网络是通的,估计是你那从未见面的小女朋友另有新欢,不想理你了,悄悄地换了一个你不知道的端口吧。”
我斩钉截铁地说:“那绝对不可能,我们的感情好得很!”
虽然口中这么说,我心里还是惴惴不安的。
可是迟迟没有消息,我每天都会试图连接一下,每次都是超时,没有她的日子,生活都是灰色的,我吃不下饭、睡不好觉,整天除了发呆什么也干不了,不断的煎熬让我快要绝望了。
终于有一天,有一个U盘从她的城市来到我们这里,告诉了我们一个惊人的消息,她所在的城市安装了防火墙,现在除了几个特定的端口(例如80,443……)之外,都不允许访问了。
原来如此!我一下子松了口气, 怪不得,我们俩之前通信的端口不是80和443,被封掉了,我自然连接不上了。
我问U盘:“那我想和女朋友通信,该怎么办?”
U盘说:“很简单啊,你和你女朋友都可以包装成Web 服务啊,这样都是通过HTTP(80端口)或者HTTPS(443端口)来访问的,这样防火墙是允许的啊。”
好吧,为了和她联系上,马上抛弃自定义的socket通信,开始向Web服务进化。
一个Web服务首先要有一个endpoint , 其实就是一个URL ,描述了这个Web服务的地址。
其次确定Web服务的描述方式和数据传输方式,我先是选了WSDL 和SOAP ,研究了一下才发现这哥俩太繁琐了,都是XML, 很多冗余的数据标签,全是废话。我想这将会极大地影响我和她的通信效率,还是换成简单的HTTP GET/POST + JSON吧,很简洁,能充分地表达我的相思之情。
我把我这个Web服务的地址和格式协议告诉U盘,拜托他带到那个城市,再把女朋友的Web服务描述带回来。
我欣喜地发现,我和她不约而同地选择了轻量级的HTTP+ JSON,看来虽然隔着千山万水,我们的心意还是相通的。
这样的准备工作足足干了6个月,但我并不觉得累,因为希望一直在前边召唤。
这是一个晴朗的日子,一切工作准备就绪,马上就要联系了,这一次我的心情反而平静了下来,因为我坚信她肯定在那边等着我。
我通过HTTP向她发出了呼叫,HTTP的报文被打包在TCP报文段中,又被放到IP层数据报中,最后形成链路层的帧,通过网卡发了出去。
在意料之中的漫长等待以后,我看到了期待已久的回复:我们终于又“见”面了!
我回答:“是啊,真是太不容易了!”
“不知道将来我们会不会再分开?”
“未来会如何?我也不知道,还是牢牢地把握住现在吧!我相信我们的心会一直在一起,什么都无法阻止!”
∑编辑 | Gemini
算法数学之美微信公众号欢迎赐稿
稿件涉及数学、物理、算法、计算机、编程等相关领域,经采用我们将奉上稿酬。
投稿邮箱:math_alg@163.com