网络编程实战
盛延敏
前大众点评云平台首席架构师
立即订阅
6034 人已学习
课程目录
已完结 39 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 学好网络编程,需要掌握哪些核心问题?
免费
第一模块:基础篇 (9讲)
01 | 追古溯源:TCP/IP和Linux是如何改变世界的?
02 | 网络编程模型:认识客户端-服务器网络模型的基本概念
03丨套接字和地址:像电话和电话号码一样理解它们
04 | TCP三次握手:怎么使用套接字格式建立连接?
05 | 使用套接字进行读写:开始交流吧
06 | 嗨,别忘了UDP这个小兄弟
07 | What? 还有本地套接字?
08 | 工欲善其事必先利其器:学会使用各种工具
09丨答疑篇:学习网络编程前,需要准备哪些东西?
第二模块:提高篇 (10讲)
10 | TIME_WAIT:隐藏在细节下的魔鬼
11 | 优雅地关闭还是粗暴地关闭 ?
12 | 连接无效:使用Keep-Alive还是应用心跳来检测?
13 | 小数据包应对之策:理解TCP协议中的动态数据传输
14丨UDP也可以是“已连接”?
15 | 怎么老是出现“地址已经被使用”?
16 | 如何理解TCP的“流”?
17 | TCP并不总是“可靠”的?
18 | 防人之心不可无:检查数据的有效性
19丨提高篇答疑:如何理解TCP四次挥手?
期中复习周 (2讲)
期中大作业丨动手编写一个自己的程序吧!
免费
期中大作业丨题目以及解答剖析
免费
第三模块:性能篇 (12讲)
20 | 大名⿍⿍的select:看我如何同时感知多个I/O事件
21 | poll:另一种I/O多路复用
22 | 非阻塞I/O:提升性能的加速器
23 | Linux利器:epoll的前世今生
24 | C10K问题:高并发模型设计
25 | 使用阻塞I/O和进程模型:最传统的方式
26 | 使用阻塞I/O和线程模型:换一种轻量的方式
27 | I/O多路复用遇上线程:使用poll单线程处理所有I/O事件
28 | I/O多路复用进阶:子线程使用poll处理连接I/O事件
29 | 渐入佳境:使用epoll和多线程模型
30 | 真正的大杀器:异步I/O探索
31丨性能篇答疑:epoll源码深度剖析
第四模块:实战篇 (4讲)
32 | 自己动手写高性能HTTP服务器(一):设计和思路
33 | 自己动手写高性能HTTP服务器(二):I/O模型和多线程模型实现
34 | 自己动手写高性能HTTP服务器(三):TCP字节流处理和HTTP协议实现
35 | 答疑:编写高性能网络编程框架时,都需要注意哪些问题?
结束语 (1讲)
结束语丨我相信这不是结束,让我们江湖再见
网络编程实战
登录|注册

25 | 使用阻塞I/O和进程模型:最传统的方式

盛延敏 2019-10-04
你好,我是盛延敏,这里是网络编程实战第 25 讲,欢迎回来。
上一讲中,我们讲到了 C10K 问题,并引入了解决 C10K 问题的各种解法。其中,最简单也是最有效的一种解决方法就是为每个连接创建一个独立的进程去服务。那么,到底如何为每个连接客户创建一个进程来服务呢?在这其中,又需要特别注意什么呢?今天我们就围绕这部分内容展开,期望经过今天的学习,你对父子进程、僵尸进程、使用进程处理连接等有一个比较直观的理解。

父进程和子进程

我们知道,进程是程序执行的最小单位,一个进程有完整的地址空间、程序计数器等,如果想创建一个新的进程,使用函数 fork 就可以。
pid_t fork(void)
返回:在子进程中为0,在父进程中为子进程ID,若出错则为-1
如果你是第一次使用这个函数,你会觉得难以理解的地方在于,虽然我们的程序调用 fork 一次,它却在父、子进程里各返回一次。在调用该函数的进程(即为父进程)中返回的是新派生的进程 ID 号,在子进程中返回的值为 0。想要知道当前执行的进程到底是父进程,还是子进程,只能通过返回值来进行判断。
fork 函数实现的时候,实际上会把当前父进程的所有相关值都克隆一份,包括地址空间、打开的文件描述符、程序计数器等,就连执行代码也会拷贝一份,新派生的进程的表现行为和父进程近乎一样,就好像是派生进程调用过 fork 函数一样。为了区别两个不同的进程,实现者可以通过改变 fork 函数的栈空间值来判断,对应到程序中就是返回值的不同。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《网络编程实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • 刘丹
    请问主进程结束的时候没有关闭listener_fd,子进程结束的时候没有关闭fd,是让操作系统在关闭进程时自动回收资源吗?

    作者回复: 是我疏忽了,不过系统内核确实可以回收,最好还是自己close一下。

    2019-10-04
    4
  • rong
    文章开头部分,应该是线程是程序执行的最小单位吧。进程是cpu分配资源的最小单位。还有,每个线程有一个程序计数器,不是每个进程。

    作者回复: 在Linux里面,线程其实就是轻量级进程(light-weighted process),它们都使用同样的task_struct结构,无论用户进程(process), 用户线程(thread),就只是在task_struct的填法不一样而已。

    所以,从内核角度来说,确实是线程(task_struct)是最小的,但是从用户角度来说,确实是进程是最小执行的单元,因为不可能没有进程,凭空产生出线程来。

    线程和进程都有各自的PC计数器,实际上,无论是这里的fork,还是后面讲到的线程pthread_create,最终到内核中都是调用do_fork来产生task_struct结构的。

    2019-11-08
    3
  • Kepler
    这种古老的多进程方式来处理io应该是apache服务器了吧,新型的redis, nginx都是事件驱动epoll来实现的;
    采用while循环是为了回收所有已退出子进程的状态。

    作者回复: 我知道有apache服务器,其他的大家可以补充。

    2019-10-11
    3
  • 传说中的成大大
    读书少的人只能直接回答第二问 第一问回答不了哈哈哈
    是因为如果有多个子进程同时结束的话内核只会产生一次SIGCHLD信号至少信号处理函数只会唤醒一次,如果不循环就无法取得所有已终止的子进程数据
    2019-10-10
    2
  • Geek_sky
    一个发出而没有被接收的信号叫做待处理信号(pending signal)。在任何时刻,一种类型至多只会有一个待处理信号。如果一个进程有一个类型为k的待处理信号,那么任何接下来发送到这个进程的类型为k的信号都不会排队等待;它们只是被简单地丢弃。一个进程可以有选择性地阻塞接收某种信号。当一种信号被阻塞时,它仍可以被发送,但是产生的待处理信号不会被接收,直到进程取消对这种信号的阻塞。
    一个待处理信号最多只能被接收一次。内核为每个进程在pending位向量中维护着待处理信号的集合,而在blocked位向量中维护着被阻塞的信号集合。只要传送了一个类型为k的信号,内核就会设置pending中的第k位,而只要接收了一个类型为k的信号,内核就会清除pending中的第k位。——深入理解计算机系统
    2019-12-06
    1
  • Hale
    Nginx采用了进城池的模式来处理连接。使用循环是为了回收所有的子进程资源,一直到退出,否则接收完一个就直接退出了。
    2019-10-08
    1
    1
  • godtrue
    我理解的进程和线程
    进程:OS的最小执行单位
    线程:OS的最小调度单位
    线程又称轻量级进程,他们的本质都是一段代码指令,被放到内存中等待执行,不过区别在于,进程间完全是隔离的互不影响,但是一个进程内的线程间是共享内存空间的,当然线程也有自己私有的一下资源,比如栈空间和PC寄存器等。

    阻塞IO+多进程的实现已知有apache服务器
    2019-11-24
  • 传说中的成大大
    上面说错了 信号会产生多次 信号处理函数只会调用一次
    2019-10-10
  • 星辰
    1. 按老师说的去搜了一下,也看到评论区其他同学的留言,发现redis的bgsave使用了fork创建子进程来保存数据。

    2. 不使用while循环 在子进程退出时,会错过在子进程的资源回收叭
    2019-10-08
  • 我知道的使用多进程模型有Nginx,Redis,不过Redis是用Reactor事件驱动模型来实现的
    2019-10-04
    3
  • 张立华
    避免僵尸进程,两种方法:1 忽略SIGCHLD, 2 调用wait或waitpid

    应该说 忽略SIGCHLD,最省事吧
    2019-10-04
    1
  • 搞怪者😘 😒 😏 👿
    Nginx和php–fpm就是这样的架构。

    一个wait不足够阻止僵尸进程,如果n个子进程同时停止,那么会同时发出n个SIGCHILD信号给父进程,但是信号处理函数执行一次,因为信号一般是不排队的,多个SIGCHILD只会发送一次给父进程。所以需要用循环waitpid处理,获取所有终止子进程状态。
    2019-10-04
    3
收起评论
12
返回
顶部