前情回顾

NextStep帝国推出的web服务,迅速风靡比特宇宙,各星系帝国均蠢蠢欲动,想在这一波浪潮中掘一桶金。

详情参见:万维网的诞生

初出茅庐

小马哥和他的小伙伴小黑、大黄来到陌生的Linux帝国,准备在这里闯出一片天地。

不久,他们成立了一家Web服务器公司,小黑负责网络接待,进来的客户交给大黄,大黄负责处理请求,读取HTML文件交给客户,小马哥当总管,开始了他们的创业之旅。
虽然人少,但大家分工合作,齐心协力,小公司也还是慢慢走上正轨。

fork分身术

公司的发展出乎他们的意料,浏览网页的请求越来越多,小黑开始抱怨大黄处理太慢。大黄也很无奈,明明自己已经很努力了。小黑催的紧,一着急数据处理错误,把整个进程都搞崩溃了。

晚上的总结会上,小黑表达了不满:大黄你还得加把劲啊,你看我这队列里都接待了这么多客户进来,他们都等着你办业务,你也太慢了。而且忙起来也不能乱啊,把进程搞崩溃,这不是连累大家嘛!

大黄心里委屈,可是今天确实因为自己把进程搞崩溃了,连累大家。面对小黑的数落,只好默不作声。

小马哥看在眼里,打破沉默:这事不能怪大黄,业务量大了,他一个人忙不过来。我听说Linux帝国有一个fork大法,大黄你从小黑那里拿到请求后就使用fork大法,去一个单独的进程的处理这个请求吧。

大黄抬起头来:fork不是叉子的意思吗,fork大法是什么?

小马哥:我也了解不太多,听说这叫分身术,执行fork可以把当前进程复制一份。

大黄听得迷迷糊糊:这么神奇?

小马哥:听行业巨头Apache公司的人说的,他们就是用的fork大法,你去研究下。

第三天,大家按照新的办法来运行,果然见效,小黑接进来的客户,大黄马上就拿过来执行fork,产生一个分身,在新的进程中处理。仿佛长了三头六臂,效率高了不少,即便偶尔还会处理出错,也只是把那个独立进程弄崩溃,主进程还是稳稳当当运转,不影响业务。

惊群效应

就这样过了一段时间,小马哥注意到大黄每次都要去磁盘读取网页文件,费时费力,于是召开公司会议,宣布了两项决定:

1、调小黑去成立新的缓存管理部门,原来小黑负责的网络接待工作交给大黄一起做。

2、提前执行fork,分身出几个进程准备着,而不在客户来临时才执行分身。

很快,大黄接过原来小黑的活,开始独挑大梁。

不过新的麻烦又来了!刚工作半天,大黄又来到小马哥办公室。

大黄:马哥,这网络接待这活不好干啊,以前是小黑一个人处理,接待完我来服务,没啥问题。但现在换我来接待,我有多个分身,每个分身都在执行accept函数等客户来,结果就是每来一个客户,所有分身都来接待,实际只有一个接待成功,其他几个分身白跑一趟,浪费表情!

小马哥:唉,你看我这脑袋,忘了叮嘱你了。前几天去Apache公司技术交流时提到过这事,这是Linux帝国的缺陷,叫惊群效应,已经有好几家公司联名向帝国反映了。目前没有什么好的办法,你在执行accept前加一把锁来同步你的多个分身进程吧!

大黄:嗯,也只好这样了,帝国要是出了新政修复这个问题,记得告诉我声哈!

多路复用

随着公司业务的快速发展,大黄的工作压力也越来越大,虽然fork多进程可以多派人手,但这一招也不是包治百病,毕竟帝国资源有限,进程多了以后频繁的线程切换,大量的时间花在线程调度上,大黄真正处理业务的时间反而变少了。

小马哥看到了大黄的窘迫,找到大黄说:你看,现在业务很多,你分身出来的这些进程,却有好多都是闲着的,这不浪费资源吗?

大黄:这没办法啊,这些进程接待上一个客户还没接待完呢,客户没有断开连接,只能继续等着,等他下一步的请求。

小马哥:这就是明显的人力浪费嘛,新的客户来了没办法接待,而你却还在干等着,这不行。

大黄:额,这个······

小马哥:我听隔壁Apache的员工说他们用一个叫select的多路复用技术,不用干等着,有消息会自动通知你们来处理,你们就可以腾出手来处理其他客户的请求了。

大黄:好的,我去研究下。

又过了几天后。。。

大黄:马哥,我研究了下那个select多路复用,确实不错,但是有个缺点,当我添加了多个需要关注的客户后,有消息来了的时候,select它不告诉我到底是哪个客户来请求了,我还得一个个检查,客户多了,浪费太多时间。

小马哥:那还是比你干等着不能接待其他客户强吧,先用起来,别挑了。

大黄:马哥别急,我还从Apache公司打听到,他们还在用一个叫epoll的多路复用技术,这个比select好多了,它不仅告诉我有消息来了,还告诉我哪些客户有消息,不用我去一个个检查,省事!

小马哥:你小子还给我藏一手,既然这么好,赶紧用起来。

很快,大黄用上了新的技术,处理起网络请求效率成倍提高,工作越发的得心应手。

公司的业务也是发展迅速,公司规模不断扩张,招了不少新人,连隔壁Apache公司都眼红了起来。

这天,小马哥召集大家开会,宣布了一项决定:公司发展迅猛,为了公司的品牌形象,决定起一个响亮的名字,我已经想好了,就叫nginx

未完待续·······

彩蛋

一天,小马哥的办公司来了一位美女。

“马总你好,我叫小雪,是tomcat公司市场部的,现在动态网页技术这么火,贵司不考虑拓展下业务吗?”

“动态网页技术?这是什么东西”

欲知后事如何,请关注后续精彩......

精彩回顾

我是一个explorer的线程

我是一个杀毒软件线程

我是一个IE浏览器线程

比特宇宙-TCP/IP的诞生

产品vs程序员:你知道www是怎么来的吗?

我是一个流氓软件线程

远去的传说:安全软件群雄混战史

一个HTTP数据包的奇幻之旅

闯荡Linux帝国:nginx的创业故事的更多相关文章

  1. python 全栈开发,Day126(创业故事,软件部需求,内容采集,显示内容图文列表,MongoDB数据导入导出JSON)

    作业讲解 下载代码: HBuilder APP和flask后端登录 链接:https://pan.baidu.com/s/1eBwd1sVXTNLdHwKRM2-ytg 密码:4pcw 如何打开APP ...

  2. 【转】Linux下nginx配置https协议访问的方法

    一.配置nginx支持https协议访问,需要在编译安装nginx的时候添加相应的模块--with-http_ssl_module 查看nginx编译参数:/usr/local/nginx/sbin/ ...

  3. VMware Linux 下 Nginx

    负载   VMware Linux 下 Nginx 安装配置 - nginx.conf 配置 [负载两个 Tomcat] (三) Weiseditor 2014-11-26 23:42 阅读:1 评论 ...

  4. [Linux] PHP程序员玩转Linux系列-Nginx中的HTTPS

    1.PHP程序员玩转Linux系列-怎么安装使用CentOS 2.PHP程序员玩转Linux系列-lnmp环境的搭建 3.PHP程序员玩转Linux系列-搭建FTP代码开发环境 4.PHP程序员玩转L ...

  5. Linux+.NetCore+Nginx搭建集群

    本篇和大家分享的是Linux+NetCore+Nginx搭建负载集群,对于netcore2.0发布后,我一直在看官网的文档并学习,关注有哪些新增的东西,我,一个从1.0到2.0的跟随者这里只总结一句话 ...

  6. linux下Nginx配置文件(nginx.conf)配置设置详解(windows用phpstudy集成)

    linux备份nginx.conf文件举例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在进程列表 ...

  7. 阿里云Linux服务器安装 nginx+mysql+php

    阿里云Linux服务器安装 nginx+mysql+php步骤1.登录服务器2.下载安装包3.将安装包上传到服务器的/home目录下 注:使用rz sz命令进行本地和服务器间的上传.下载,安装命令yu ...

  8. VMware Linux 下 Nginx 安装配置 - nginx.conf 配置 [负载两个 Tomcat] (三)

    首先启动Nginx 1. 相关浏览 两个 Tomcat 配置:  VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二) Nginx 安装配置启动: VMware Linu ...

  9. VMware Linux 下 Nginx 安装配置 - Tomcat 配置 (二)

    准备工作 相关浏览: VMware Linux 下 Nginx 安装配置 (一) 1. 选在 /usr/local/ 下创建 softs 文件夹,通过 ftp 命令 把 apache-tomcat-7 ...

随机推荐

  1. python 数据的读取

  2. HDU-1114_Piggy-Bank

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...

  3. Redis 5.0新功能介绍

    Redis 5.0 Redis5.0版是Redis产品的重大版本发布,我们先看一下它的最新特点: 新的流数据类型(Stream data type) https://redis.io/topics/s ...

  4. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  5. Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf

    文章目录基本介绍BertForTokenClassificationpytorch-crf实验项目参考基本介绍命名实体识别:命名实体识别任务是NLP中的一个基础任务.主要是从一句话中识别出命名实体.比 ...

  6. UTF-8与UTF-8 BOM

    在我们通常使用的windows系统中,我发现了一个有趣的现象.我新建一个空的文本文档,点击文件-另存为-编码选择UTF-8,然后保存.此时这个文件明明是空的,却占了3字节大小.原因在于:此时保存的编码 ...

  7. PyCharm indexing goes into infinite loop pycharm 不同的indexing

    https://stackoverflow.com/questions/24955896/pycharm-indexing-goes-into-infinite-loop 5 1 I opened u ...

  8. SuperSocket获取所有连接上的 Session

    你也可以从 AppServer 实例获取所有连接上的 session 然后推送数据到所有客户端: foreach(var session in appServer.GetAllSessions()) ...

  9. ES6学习笔记第一天

    ## 三.const和let **3.1 const** const用来定义常量,所谓的常量就是值一旦给定后就不变,一次定义终身不变的量 const a = 10; a = 20; 上面的a就是一个常 ...

  10. 通过PdfiumViewer.dll实现pdf直接从流显示(效果不好)

    开源的PdfiumViewer.dll并不完整 需要不开源的pdfium.dll配合使用 引用只需添加PdfiumViewer.dll,但pdfium.dll必须跟它放在一个路径下 界面中添加控件: ...