前情回顾

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. oracle函数 to_single_byte(c1)

    [功能]将字符串中的全角转化为半角 [参数]c1,字符型 [返回]字符串 [示例] SQL> select to_multi_byte('高A') text from dual; test -- ...

  2. UVa-10986_Sending email (向前星+Dijkstra)

    题意:给你点.边,求起点到终点的最短距离. 题解:由于题目的数据量特别大,所以需要用邻接表来存边,之后对Dijkstra算法稍微魔改一下就可以了,本来以为会超时,做好了打堆优化的准备,结果卡时间过了, ...

  3. oracle函数 LPAD(c1,n[,c2])

    [功能]在字符串c1的左边用字符串c2填充,直到长度为n时为止 [参数]C1 字符串 n 追加后字符总长度 c2 追加字符串,默认为空格 [返回]字符型 [说明]如果c1长度大于n,则返回c1左边n个 ...

  4. Libev源码分析08:Libev中的信号监视器

    Libev中的信号监视器,用于监控信号的发生,因信号是异步的,所以Libev的处理方式是尽量的将异步信号同步化.异步信号的同步化方法主要有:signalfd.eventfd.pipe.sigwaiti ...

  5. 检查进程启动情况,开始时间、启动时间、启动进程数、进程数是否正确、PID

    #!/bin/sh bin=$(cd ``;pwd) cd ${bin} ### 定义检查函数 chk(){ programName=$ correctNum=$ programSubName=$ # ...

  6. Android Listview中Button按钮点击事件冲突解决办法

    今天做项目时,ListView中含有了Button组件,心里一早就知道肯定会有冲突,因为以前就遇到过,并解决过,可惜当时没有记录下来. 今天在做的时候,继续被这个问题郁闷了一把,后来解决后,赶紧来记录 ...

  7. Android Studio(八):Android Studio设置教程

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  8. Wood Processing牛客第十场 斜率优化DP

    卧槽我感觉写的是对的,但是就是样例都过不了...留坑 #include<iostream> #include<stdio.h> #include<string.h> ...

  9. H3C 分组交换连接模型

  10. artTemplate模版引擎的使用

    artTemplate: template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不 ...