内容正文:
®干锋教育
第9章服务器模型
·/O模型
·TCP文件服务器
·TCP服务器模型
·UDP网络聊天室
四目录
9.1
I/O模型
口点击查看本)小节知识架构
9.2
TCP服务器模型
口点击查看本小节知把构
93
TCP文件服务器
口点击查看本小节知识架构
9.4
UDP网络聊天室
口点击查看本小节知识架构
学习目标
理解/O模型的
掌握1/O多路复用的
2
概会
使用方法
理解
掌
握
理解
掌握服务器模型的实
理解服务器模型的
3
现方法
思想
·本章介绍两个独立的模块,一个是/O模型的思想,另一个是TCP服务器模型。前
半部分是对/O的进一步讨论,前面的章节中已经介绍了/O的各种接口及使用,
本章继续深入讨论/O的几种访问文件的方式,通常称为/O模型。后半部分是针
对TCP编程的进一步讨论,使用TCP编程结合其他技术实现循环或并发服务器模型。
网络编程在实际应用层开发中使用率较高,因此本章在最后结合服务器模型介绍
TCP、UDP的经典编程案例。望读者在理解基础概,念的前提下,熟练编程并加以
应用。
◆知识架构
9.1/O模型
返回目录
9.1.1
阻塞I/O
9.1.2
非阻塞/O
9.1.3
/O多路复用
9.1.4
信号驱动/O
9.1/O模型
9.1.1阻塞1/0
·第2章介绍了文件/O这种采用系统调用的方式对文件进行读写操作,这其中涉及
到CPU状态的切换、空间进程的切换以及数据的传递。对于一次/O访问(如
read(函数、write(0函数等)来说,数据会先被复制到操作系统内核的存储区域
中,然后再从操作系统内核的存储区域中复制到应用程序的地址空间。因此,当
一个read(函数操作发生时,通常会经历两个阶段:第一阶段是等待数据准备;第
二阶段是将数据从内核空间中复制给进程。
。
综上所述,阻塞/O就是当用户进程发起一个/O请求操作(以读取为例),内核
将会查看读取的数据是否准备就绪,如果没有准备好,则当前进程被挂起(睡
眠),阻塞等待结果返回。
·例如,本教材的例9-1,则是一个典型的阻塞/O。
9.1/O模型
9.1.1阻塞1/0
·如果fgets0函数读取终端输入时,没有输入,则printf(0函数将不会执行。程序将
会在fgets(0函数处一直等待,直到有终端输入为止。
while(1)(
fgets(buf,N,stdin);
printf("********
"):
I/O根据操作对象的不同可以分为内存/O、网络/O和磁盘/O三种,通常情况下,
所指的/O为后两者。例9-1属于磁盘1/O的范畴。在网络1/O(如UDP编程)中,
当用户进程调用recvfrom(O这个系统调用,内核就开始了l/O的第一阶段:准备数
据。对于网络/O来说,很多时候数据在一开始并没有到达,这个时候内核就要等
待足够的数据到来。磁盘/○的情况则是等待磁盘数据从磁盘上读取到内核所访问
的内存区域中。
9.1/O模型
9.1.1阻塞1/0
·这个过程需要等待,也就是说数据被复制到操作系统内的存储区域是需要一个过
程的。而在用户进程这边,整个进程会被阻塞。当内核等到数据准备就绪,它就
会将数据从内核访问区域中复制到用户进程使用的内存中,之后内核返回结果。
用户进程解除阻塞状态,重新运行。
。
进程调用recvfrom(O阻塞等待的过程如图所示。
位司进洞
内性无粒搭报性备好
reevfroa
系统调用
数摆
航指表准名好
进程处塞于reevfroe
诞制数提根
的调用
特数把从为愤
复制到同户空何
处进数据提
返民成功指示
复制先
9.1/O模型
9.1.2非阻塞1/0
非阻塞/O与阻塞I/O不同的是,当用户进程执行读操作时,如果内核中的数据没
有准备就绪,那么它并不会阻塞用户进程,而是立刻返回一个错误码。从用户进
程角度讲,它发起一个读操作后,并不需要等待,而是马上得到一个结果。用户
进程判断结果是一个错误码时,它就知道数据还没有准备就绪,于是它可以再次
发送读操作。一旦内核中的数据准备好了,并且再次收到用户进程的系统调用请
求,则它会立刻将数据复制到用户进程使用的内存。
·/O操作函数将不断地测试数据是否已经准备就绪,如果没有准备就绪则继续,
直到数据准备就绪为止。整个/O请求的过程中,虽然用户程序每次发起/O请
求后可以立即返回,但是为了得到数据,仍需要不断地轮询、重复请求,这消耗
了大量的CPU的资源。所以,非阻塞/O的特点是用户进程需要不断的主动询问
内核数据是否准备就绪。在数据复制阶段,用户进程还是阻塞的。
9.1/O模型
9.1.2非阻塞1/0
在套接字编程中,如果设置参数为NONBLOCK(非阻塞,准确为
SOCK NONBLOCK)就是告诉内核,当所请求的/O操作无法完成时,不要将进
程睡眠,「
而是返回一个错