- 大话编程
- 一个故事讲完 https
- C 老头和 Java 小子的硬盘夜话
- 我是一个函数
- 操作系统是个大骗子?
- 90 后 老头儿 和 00 后 Go 小子的硬盘夜话
- 爱炫耀的数据库老头儿
- 浏览器:一个家族的奋斗
- 浏览器家族的安全反击战
- 黑客三兄弟
- 从读写分离到 CQRS,张大胖是如何解决性能问题的?
- 两个程序的爱情故事
- 两个程序的爱情故事(续)
- 烂代码传奇
- 机房夜话
- 干掉状态:从 session 到 token
- 张大胖的 docker 之路
- 从 SOA 到微服务
- XML 的传奇人生
- 从密码到 token, 一个授权的故事
- 编程世界的那把锁
- 加锁还是不加锁,这是一个问题
- 这个动物园, 两年也逛不完
- 张大胖和 CAP 定理
- 一个翻译家族的发家史
- 张大胖和单元测试
- Java 帝国
- 一个著名的日志系统是怎么设计出来的?
- Java 帝国之泛型
- Java 帝国之动态代理
- 从兄弟到父子:动态代理在民间是怎么玩的?
- Java 注解是怎么成功上位的?
- Java EE 要死掉了?
- Java 帝国之宫廷内斗
- Java 帝国之宫廷内斗(2)
- 当世界上只剩下一个 Java 程序员
- 持久化:Java 帝国反击战
- 什么是框架?
- 学习 Java 虚拟机没用? 听听当事人是怎么说的!
- 聊聊 Java 平台上的非 Java 语言
- Java 帝国之消息队列
- Java 帝国之 JMS 的诞生
- Java 帝国之单例设计模式
- 对 Java Inputstream 的一次采访
- ASM: 一个低调成功者的自述
- 序列化: 一个老家伙的咸鱼翻身
- Java IO 的自述
- JDK 先生最近有点烦
- 什么是框架(续)?
- 说 空话,做实事: 谈谈多态
- Kotlin 初体验
- 小白科普
- 小白科普:分布式和集群
- 什么是 Zookeeper?
- 小白科普:悲观锁和乐观锁
- 小白科普:LDAP 有什么用?
- 小白科普:服务那点事儿
- 小白科普:Netty 有什么用?
- 老司机经验
- 后端程序员都做些什么?
- 为什么要学习 HashMap 的底层原理?
- 小心,别被今日头条给困住了!
- 对自己狠一点,开始写作吧
- 开源代码啃不动,不如先定个小目标
- Python 这么简单还用学吗?
- 作为一个有追求的程序员,你应该掌握的七种武器
- 给设计模式说句公道话
- 时间是这么被浪费掉的
- 你真正付出了全部努力了吗?
- 写给初学者:编程的本质
- 在大学期间更应该学习什么?
- 看看 悲催 的码农得学多少东西?
- 学习编程的四兄弟
- 那些年,我后悔没做好的事情
- 我为什么对后端编程情有独钟?
- 当我们在学习编程语言时,我们在学习什么?
- 编程需要多少数学知识?
- 想成为编程高手,一定要学汇编吗?
- 你必须理解的计算机核心概念
- 你的需求是怎么描述的?
- 白话敏捷软件开发
- 人在职场
- 凡事必先骑上虎背,给性格内向的程序员聊几句
- 为什么能力优秀的人当了主管以后反而不行了呢?
- 不想做技术了,还有一条路
- 纪念我最有效率的一次加班
- 书写「简历」时,需要规避的错误。
- 上天还是入地?
- 工作 6 年,半路出家到 CTO
- 只是 Work 还不够,更重要的是 Think
- 我所尊敬的三位女程序员
- 我们向印度人学习什么?
- 你去下家面试,怎么评价你在这家公司做的工作?
两个程序的爱情故事
好感
在这个忙碌的城市里, 我虽然没和她见过面, 但我们已经聊过很多次了。
与其说是聊天,倒不如说是通信, 每次我想给她说话时, 我就把消息放到一块共享内存里边, 然后就离开运行车间, 让她或者别人去使用 CPU。 等我再次进来的时候,她回复的消息就已经在那个共享内存中了。
有无数次,我离开的时候都想偷偷的看一眼, 希望接下来运行的是她,可是这个城市严格的规则让我的希望只是奢望。
操作系统把我们这些进程严格的隔离, 他通过虚拟内存的机制,让每个进程都有一块虚拟的、独立的地址空间, 从而成功的制造了一个假象 : 让大家以为内存中只有一个程序在运行。
当我在就绪队列中等待的时候,也被严格禁止和别人交谈, 我经常环顾四周,希望能够看到她的身影, 可是这个系统的进程成千上万, 究竟哪个是她?
也许我见过她,但是根本认不出来。
我和她越聊越多, 对她的好感就越深, 有一次我给她发的消息等了 100 毫秒都没有回复,把我都快急疯了。
她很喜欢听我讲故事,尤其是那个编号为 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 层数据报中, 最后形成链路层的帧, 通过网卡发了出去。
在意料之中的漫长等待以后, 我看到了期待已久地回复: 我们终于又“见”面了 !
我回答:“是啊, 真是太不容易了”
“不知道将来我们会不会再分开?” 她担忧的说。
“未来会如何? 我也不知道,还是牢牢地把握住现在吧! 我相信我们的心会一直在一起,什么都无法阻止! ”
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论