《UNIX 网络编程-卷1》 服务类型
📅 2026/7/2 13:32:07
👁️ 阅读次数
📝 编程学习
“服务类型”在网络编程语境下,通常指服务器程序处理客户端请求的方式或架构。《UNIX网络编程-卷1》(UNPv1)深入探讨了各种常见的服务实现模型,以下是一些核心服务类型及相关要点总结:
基本 TCP/UDP 客户端-服务端模型
- TCP服务:如
daytimetcp,通常遵循socket->bind->listen->accept->read/write->close的流程。listen设定等待队列大小 ()。 - UDP服务:如
daytimeudp,流程为socket->bind->recvfrom/sendto->close。无连接,处理每个客户请求独立。 - 服务器是持续运行并处理请求的进程(
daemon),常以守护进程形式出现(如inetd,xinetd管理那些非始终运行的服务)。
- TCP服务:如
进程并发模型
fork并发模型:这是UNIX经典模型。当服务进程(父进程)在accept返回一个新客户连接套接字后,立即调用fork创建子进程 ()。子进程处理该客户的所有请求。父进程继续回到accept等待下一个客户连接。- 特点:开销较大(每个新客户创建一个新进程),编程模型相对清晰(每个子进程独立处理单个客户)。
- 常需处理僵尸进程(
SIGCHLD信号与wait/waitpid)。
线程并发模型
- Pthread(指POSIX线程)在UNP之后变得流行。出现替代
fork的更轻量级方案。 - 基于线程的实现可以在一个进程内创建多个线程,每个线程处理一个客户连接 。
- 特点:大幅降低服务新客户的资源开销(相比进程),提升性能。但引入了共享资源(如全局变量)的同步问题(互斥锁、条件变量等)。
- Pthread(指POSIX线程)在UNP之后变得流行。出现替代
I/O 多路复用(IO Multiplexing)模型
- 使用
select/poll/epoll等系统调用实现。 - 服务进程通过在单进程(或线程)中维护多个描述符集合,轮询或感知哪些描述符(套接字)就绪(有数据可读、可写或有异常)。当检测到有新客户连接请求或现有客户发送了数据时,逐个处理 。
- 特点:避免进程/线程切换开销,通常需要结合非阻塞I/O以达到高效。适合处理大量连接但活跃连接较少的场景(如聊天室服务器)。编码复杂度相对较高(需要管理描述符集和处理状态)。
- 使用
信号驱动 I/O(SIGIO)模型
- 系统在描述符就绪时(如数据到达)发送信号(
SIGIO)通知服务进程。 - 服务进程可以异步处理I/O事件 ()。
- 特点:高级/复杂模型,需处理异步信号带来的程序逻辑复杂度。
- 系统在描述符就绪时(如数据到达)发送信号(
超级守护进程:
inetd/xinetd- 早期UNIX常用的一种管理模式。因许多服务是偶尔被访问的小型进程,启动系统时仅为一些很少被访问的服务启动几十个进程过于浪费。
inetd(或其增强版xinetd)周期性地运行(通常是启动时就开始运行),监听它所配置管理的所有TCP/UDP端口 。- 当
inetd收到对它所监听的服务端口请求时,它会fork一个真正的服务器进程(比如telnetd,ftpd),并exec该进程处理该客户请求。请求处理结束后该服务进程退出。 - 特点:系统资源开销小(服务进程在需要时才临时创建),简化了小型服务的实现和管理 。
编程学习
技术分享
实战经验