《TCP/IP 网络编程》第 10 章——多进程服务器端(学习笔记)

代码链接

第 10 章 多进程服务器端

现在开始学习构建实际网络服务所需的内容

10.1 进程概念及应用

10.1.1 两种类型的服务器端

10.1.2 并发服务端的实现方法

下面列出的是具有代表性的并发服务器端实现模型和方法

  • 多进程服务器:通过创建多个进程提供服务
  • 多路复用服务器:通过捆绑并统一管理 I/O 对象提供服务
  • 多线程服务器:通过生成与客户端等量的线程提供服务

先讲解第一种方法:多进程服务器。这种方法不适合在 Windows 平台下。

10.1.3 理解进程

进程的定义:占用内存空间的正在运行的程序

10.1.4 进程 ID

讲解创建进程方法前,先简要说明进程 ID。无论进程是如何创建的,所有进程都会从操作系统分配到 ID。此 ID 被称为『进程ID』,其值为大于 2 的整数。1 要分配给操作系统启动后的(用于协助操作系统)首个进程,因此用户进程无法得到 ID 值 1 。接下来观察 Linux 中正在运行的进程。

ps au

通过 ps 指令可以查看当前运行的所有进程。特别需要注意的是,该命令同时列出了 PID(进程ID)。另外,上述示例通过指定 a 和 u 参数列出了所有进程详细信息。

10.1.5 通过调用 fork 函数创建进程

创建进程的方法很多,此处只介绍用于创建多进程服务器端的 fork 函数。

#include <unistd.h>
pid_t fork(void);
// 成功时返回进程 ID,失败时返回-1

fork 函数将创建调用的进程副本。也就是说,并非根据完全不同的程序创建进程,而是复制正在运行的、调用 fork 函数的进程。另外,两个进程都将执行 fork 函数调用后的语句(准确地说是在 fork 函数返回后)。但因为是通过同一个进程、复制相同的内存空间,之后的程序流要根据 fork 函数的返回值加以区分。即利用 fork 函数的如下特点区分程序执行流程。

  • 父进程:fork 函数返回子进程 ID
  • 子进程:fork 函数返回 0

此处『父进程』(Parent Process)指原进程,即调用 fork 函数的主体,而『子进程』(Child Process)是通过父进程调用 fork 函数复制出的进程。接下来讲解调用 fork 函数后的程序运行流程。

下面给一个示例,代码参考 fork.c 文件

父进程调用 fork 函数的同时复制出子进程,并分别得到 fork 函数的返回值。但复制前,父进程将全局变量 gval 增加到 11,将局部变量 lval 的值增加到 25,因此在这种状态下完成进程复制。复制完成后根据 fork 函数的返回类型区分父子进程。父进程的 lval 的值增加 1 ,但这不会影响子进程的 lval 值。同样子进程将 gval 的值增加 1 也不会影响到父进程的 gval 。因为 fork 函数调用后分成了完全不同的进程,只是二者共享同一段代码而已。接下来给出一个例子:

运行结果

wzy@wzypc:~/TCP-IP-NetworkNote/chapter-10$ gcc fork.c -o fork.exe
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-10$ ./fork.exe
Parent Proc: [9,23] 
Child Proc: [13,27]

10.2 进程和僵尸进程

10.2.1 僵尸(Zombie)进程

进程完成工作后应被销毁,但有时这些进程将变成僵尸进程,占用系统中的重要资源。这种状态下的进程称作『僵尸进程』。

10.2.2 产生僵尸进程的原因

为了防止僵尸进程的产生,先解释产生僵尸进程的原因。利用如下两个示例展示调用 fork 函数产生子进程的终止方式。

  • 传递参数并调用 exit 函数
  • main 函数中执行 return 语句并返回值

向 exit 函数传递的参数值和 main 函数的 return 语句返回的值都会传递给操作系统。而操作系统不会销毁子进程,直到把这些值传递给产生该子进程的父进程。处在这种状态下的进程就是僵尸进程。也就是说,将子进程变成僵尸进程的正是操作系统。

Q:此僵尸进程何时被销毁呢?

A:应该向创建子进程的父进程传递子进程的 exit 参数值或 return 语句的返回值。

如何向父进程传递这些值呢?操作系统不会主动把这些值传递给父进程。只有父进程主动发起请求(函数调用)时,操作系统才会传递该值。换言之,如果父进程未主动要求获得子进程的结束状态值,操作系统将一直保存,并让子进程长时间处于僵尸进程状态。也就是说,父母要负责收回自己生的孩子。接下来的示例将创建僵尸进程。

代码参考 zombie.c 文件

运行结果

wzy@wzypc:~/TCP-IP-NetworkNote/chapter-10$ gcc zombie.c -o zombie.exe
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-10$ ./zombie.exe
Child Process ID: 69045 
Hi, I am a child process
End child process
End parent process

wzy@wzypc:~$ ps au
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
wzy       69021  0.0  0.1  29964  4824 pts/2    Ss   22:17   0:00 bash
wzy       69044  0.0  0.0   4508   720 pts/1    S+   22:18   0:00 ./zombie.exe
wzy  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值