两个程序的爱情故事

好感

在这个忙碌的城市里, 我虽然没和她见过面, 但我们已经聊过很多次了。

与其说是聊天,倒不如说是通信, 每次我想给她说话时, 我就把消息放到一块共享内存里边, 然后就离开运行车间, 让她或者别人去使用CPU。 等我再次进来的时候,她回复的消息就已经在那个共享内存中了。

有无数次,我离开的时候都想偷偷的看一眼, 希望接下来运行的是她,可是这个城市严格的规则让我的希望只是奢望。

操作系统把我们这些进程严格的隔离, 他通过虚拟内存的机制,让每个进程都有一块虚拟的、独立的地址空间, 从而成功的制造了一个假象 : 让大家以为内存中只有一个程序在运行。

当我在就绪队列中等待的时候,也被严格禁止和别人交谈, 我经常环顾四周,希望能够看到她的身影, 可是这个系统的进程成千上万, 究竟哪个是她?

也许我见过她,但是根本认不出来。

我和她越聊越多, 对她的好感就越深, 有一次我给她发的消息等了100毫秒都没有回复,把我都快急疯了。

她很喜欢听我讲故事,尤其是那个编号为0x3704 的线程,每次她都会说: 唉,那些线程可真可怜。 我就吓唬她说: 有一天我们的机器也会重启的, 到时候估计你也认不出我来了。 她说没事的, 只要我能通过共享内存给你发消息,我就知道你就在这个城市里。

(码农翻身注: 0x3704的故事在《我是一个线程》里)

分离

这样的日子过了一天又一天, 我想见到她的愿望越来越迫切了。

我悄悄给了CPU很多好处, 希望CPU能描述下她的样子,方便我去找她, 可是CPU运算速度太快, 阅人无数,但就是没有记忆力。

CPU说: 你还是去问操作系统老大吧, 看看你喜欢的女孩到底什么样。

问操作系统? 还是算了吧, 互相隔离是我们城市的铁规, 弄不好他会把我kill掉。

圣诞节前的平安夜, 我打算正式向她表白, 像往常一样 , 我从共享内存里收到了她的信, 急切的拆开信封, 看到了里边的第一句话: 我要走了,以后不能和你通信了……

刹那间,我第一次感觉到了什么叫做五雷轰顶,灵魂出鞘, 我脑子一片空白, 张大了嘴巴呆呆站在那里, 时间长达20毫秒。

CPU看到了我的异常, 因为这么长时间的指令都是NOP, 什么都不做, 这是非常罕见的。

CPU好心的提醒我: 嗨,老兄,你怎么了? 你的时间片快用完了啊!

我的灵魂慢慢归位,意识到信还没有读完, 赶紧接着往下看: “ 我马上要搬到另外一个城市去了,你要想找我的话,切记下面的IP地址和端口号,用socket和我通信”

我明白了,到另外一个城市那就意味者要搬离我们现在的电脑了, 也许是这个城市太拥挤, CPU/内存/硬盘已经不堪重负, 有一批程序需要被搬离到另外一个电脑中。

虽然我和她一直没机会见面, 但我知道我们就住在一个城市, 有时候也许只是擦肩而过, 她就在我的身边, 这好歹给我一点点安慰。

现在,连这一点点的安慰都没有了, 对了,她说的这个socket 是什么东西。

CPU说: “那是网络编程, 你看人家对你还是有情意的, 临走了还给你留下联系方式, 快去学学怎么用Socket吧”

当晚我就失眠了,半夜爬起来翻看一页页和她的通信记录 (很庆幸我把通信记录都保存到了文件中),脑海里回想着这么多天以来幸福的日子,一直到天亮。

网络

为了早日和她联系, 我奋发图强学习网络编程, 理解TCP/IP, 把我自己逐渐的加上对Socket的支持。

一个CPU月以后, 我这个程序终于完成了从共享内存到Socket的改造,激动人心的时刻到来了。

作为一个客户端, 我颤抖着双手向她发起了Socket请求, TCP携带着数据包慢吞吞的走向她所在的城市, 等了好久TCP才完成了三次握手, 这网络可是真慢啊。

我赶紧发送第一个消息: 你好,好久不“见”。

等了足足有1000毫秒, 对我来说仿佛是一个世纪, 才收到让我激动无比的回信 : “啊, 你终于来了 。我在这里等了你好久了,你怎么现在才联系我 ?”

我不好意思的说: “我很笨, 学习socket 太慢了”

又过了一个世纪,我才收到回复, 这网络真是慢的令人抓狂啊。

不管如何, 终于和她联系上了, 这让我开心无比。

原来我们一天能通信上千次, 现在可好, 有10次就不错了, 再也不能像原来那样痛快的讲故事了, 既来之则安之, 反正网络很慢, 现在每次我都会写一封巨长无比的信, 把我的思念之情全部倾诉在其中, 漫长的等待以后再去读她的长长的回复。

原来我们通过内存来中转消息的时候, 是通过操作系统来做同步操作的, 这能防止读写的冲突。

可是通过网络通信就完全乱掉了, 经常会出现我说我的, 她说她的, 闹的很不愉快。

后来我和她只好协商了一个协议, 约定好消息的次序和格式, 这才算解决了问题。

(码农翻身注: 这其实就是基于socket的应用层协议)

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盘, 恳请U盘带到那个城市,再把女朋友的Web服务描述带回来。

我欣喜的发现,我和她不约而同的选择了轻量级的HTTP+ JSON, 看来虽然隔着千山万水,我们的心意还是相通的。

这样的准备工作足足干了6个CPU月, 但我并不觉得累, 因为希望一直在前边召唤。

这是一个晴朗的日子,一切工作准备就绪,马上就要联系了, 这一次我的心情反而平静了下来, 因为我坚信她肯定在那边等着我。

我通过HTTP向她发出了呼叫, HTTP的报文被打包在TCP报文段中, 又被放到IP层数据报中, 最后形成链路层的帧, 通过网卡发了出去。

在意料之中的漫长等待以后, 我看到了期待已久地回复: 我们终于又“见”面了 !

我回答:“是啊, 真是太不容易了”

“不知道将来我们会不会再分开?” 她担忧的说。

“未来会如何? 我也不知道,还是牢牢地把握住现在吧! 我相信我们的心会一直在一起,什么都无法阻止! ”

2017032903

(完) 刘欣 码农翻身

相关推荐

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址