一起来写web server 02 -- 多进程版本


UNP的第30章客户/服务器程序设计范式中提到了这种模型.

主要的思想

这种模型的思想非常简单,具体来说,就是,没当用户connect到来之后,立马fork一个子进程去处理连接,代码如下:

int main(int argc, char *argv[])
{
    int listenfd = Open_listenfd(8080); /* 8080号端口监听 */

    while (true) /* 无限循环 */
    {
        struct sockaddr_in clientaddr;
        socklen_t len = sizeof(clientaddr);
        int connfd = Accept(listenfd, (SA*)&clientaddr, &len);
        addsig(SIGCHLD, sig_chld); /* 添加信号处理函数 */
        int pid;
        if ((pid = Fork()) == 0) /* 子线程 */
        {
            printf("\nnew process:%d\n", getpid());
            close(listenfd);
            doit(connfd); /* 处理连接 */
            close(connfd); /* 关闭socket描述符 */
            printf("\nend of process:%d\n", getpid());
            exit(0);
        }
        close(connfd);
    }
    return 0;
}

借用stevens老爷子的一张图,应该是这么干的:
首先客户端通过conncect函数请求和服务器的连接.


接下来服务器调用Accept函数接收了对方的连接,connfd指代这个连接.

然后父进程调用fork函数生成了一个子进程.生成的子进程里面的数据和父进程是一模一样的,它也包含了这个connfd,所以现在客户和两个进程连接.

父进程关闭这个连接,然后由子进程来处理连接,这样一个交互就完成了.

需要注意的地方

僵死进程

子进程运行完毕之后,如果父进程不调用wait或者waitpid函数来处理处理的话,这些已经运行完成的子进程便成为了僵死进程,僵死进程会占用系统的资源,小部分的僵死进程还好,不过像我们这种需要长时间运行的服务器程序,点滴的僵死进程积累起来,这个量是非常恐怖的.所以对于僵死进程,我们是不能够忍受的.你可能会奇怪,为什么子进程运行完了还要父进程来收尸,直接释放资源不就好了吗?其实操作系统这么安排必定有它的道理,只是我们暂时用不到罢了.

设置僵死状态的目的是维护子进程的信息,以便父进程在以后某个时候获取,这些信息包括子进程的进程ID,终止状态以及资源利用信息(cpu时间,内存使用量等等).如果一个进程终止,而该进程有子进程处于僵死状态,那么它的所有僵死进程的父进程ID将会重置为1(init进程).继承这些子进程的init进程将清理他们(也就是说,init进程将wait它们,从而去除它们的僵死进程).

值得我们注意的是,当一个子进程运行完毕之后,系统会给父进程发送一个SIGCHLD信号,只要我们处理这个信号,就能够及时地回收子进程占用的一些资源.

所以在代码的第10行处addsig(SIGCHLD, sig_chld);,我们添加了SIGCHLD的信号处理函数.
函数如下:

void
sig_chld(int signo) /* 处理僵死进程 */
{
    pid_t pid;
    int stat;
    while ((pid = waitpid(-1, &stat, WNOHANG)) > 0)
        printf("child %d terminated\n", pid);
    return;
}

waitpid函数的第一个参数-1表示等待第一个终止的子进程,&stat可以获取终止进程的一些信息,而WNOHANG表示不用阻塞,不管有没有子进程终止,立即返回,没有子进程终止的话,会返回一个小于0的数,否则的话返回的是一个大于0的数.为什么要用while循环呢?很简单,因为系统是有子进程终止的时候才通知我们,不会因为僵死的子进程还未处理而同通知我们,所以我们要一次性将已经挂掉的子进程全部处理掉才行.

总结

这次的代码也非常简单,但是性能比之前的要强上不少.当然,这个能够同时处理的连接数目取决于系统可以生成的进程的数目.这次的代码是多进程版本的,下次的代码,我们就要编程多线程版本的啦.

代码可以在这里查看:https://github.com/lishuhuakai/Spweb

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,105评论 0 23
  • Linux 进程管理与程序开发 进程是Linux事务管理的基本单元,所有的进程均拥有自己独立的处理环境和系统资源,...
    JamesPeng阅读 2,451评论 1 14
  • 2016-02-02 进程控制 进程标识 每个进程都有一个非负整型的唯一的进程id,因为进程id表示服总是唯一的,...
    千里山南阅读 433评论 0 0
  • 带上五月的心情,携上五月的风,和家人驱车赶往乡间的桑园,当看到那片嫩绿的桑树,闻到泥土的气息,听到大自然的奏鸣曲,...
    时尚春天阅读 931评论 4 7
  • Nodejs适用场景: 高并发性 以服务方式海浪化数据 webapp 消息队列 Nodejs不适用场景 高cpu使...
    Lucas_Wong阅读 764评论 0 51