多进程服务器

一、多进程服务器

  • read()阻塞的话就是【单客户端】响应的服务器
  • 多进程服务器是【多客户端响应的服务器】

之所以需要多客户端响应的原因是——

三次握手的时候是阻塞在accept()那里,然后accept()返回成功后,到read()那里阻塞

这时候如果来一个新连接,因为还是阻塞在read()中(一直在等待),而不在accept()中(所以三次握手不能及时的响应),所以【新连接请求】会缓存在accept队列中

- 如果将readaccept都设置成非阻塞的,那么就是【非阻塞】轮询模型,这样的坏处:每来一个客户端链接,都有一个read(),这样后面会有越来越多的read()(也会有越来越多的【套接字】)。而且如果没数据读,会导致CPU空转(CPU使用率很高)

一、多进程服务器

多进程模型,在accept()和read()中间打断,加一个fork(),fork()出来的子进程来读数据,再关闭子进程的fd

父进程则是回到accept()那里继续监听,最后关闭父进程的fd

父进程阻塞在accept()那里,子进程会阻塞在read()那里,二者互相不影响,从而实现多进程并发

  • fork()之后,套接字的引用计数会加1,但是file结构体没有复制过来,只是【复制过来的指针】也指向了file结构体,文件描述符表复制了过来

  • 子进程的clntfd和父进程的clntfd指向的是同一个套接字,套接字的引用计数加1

exit(-1)退出进程的函数
父进程则是continue回到accept()继续阻塞

  • pid为-1意味着创建进程失败

如果在连接过程中,如果客户端先关闭,那么客户端的进程就会变成僵尸进程,所以要处理僵尸进程

  • 如何回收进程——wait()【阻塞等待】,waitpid()【非阻塞接收】
  • 多进程服务器模型中的accept()read()是【阻塞的】,所以不能使用wait()阻塞等待

二、使用信号回收进程

使用信号的方式回收,因为父进程一直阻塞在accept()那里等待连接,所以均不能设置成阻塞等待和非阻塞轮询,因此使用信号

  • SIGCHID(子进程退出的时候,会给父进程发送一个信号SIGCHID)
  • sig_handler()使用waitpid()来非阻塞的处理信号

因为可能有多个子进程同时退出,所以while()来保证可以接收到所有子进程退出的信号

三、关闭多余的fd

因为fork()是在accept()后面,所以fork()之前就已经有2个fd了——lstnfd和clntfd,但是子进程又用不到lstnfd,所以子进程中需要关闭lstnfd

如果子进程这里不关闭的话,那么因为lstnfd对应套接字的引用计数是2,所以父进程要关闭2次fd

父进程也要关闭clntfd,不然子进程的close(clntfd)并没有真正的关掉,只是引用计数-1(不关闭就意味着不释放资源,会导致内存泄露

  • 如果服务器要把数据写回去,那么就是在子进程中读完数据(read)后通过write(clntfd, buf)将数据写回去

  • 因为write()是在子进程中,如果写的时候读端关闭了,就会有一个信号SIGPIPE(管道破裂)发送给子进程,可以默认不处理,也可以处理

ulimit -a 可以查看总共可以创建的进程数量

  • 可以去系统改这个数量,也要考虑物理内存的大小,如果物理内存不够,那么就会将一部分的进程交换到交换分区中(比较慢),再需要使用的话则是从交换分区中恢复

  • 如果不想去交换分区,则需要设置一下【粘住位】

fork()后子进程和父进程【接收到的数据】不一样,所以会重新申请物理内存(内存页)比如buf就是不一样的,原则是【读时共享,写时复制】`

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

推荐阅读更多精彩内容