网络应用程序设计 - unit 07 I/O 模型. 2 主要内容  I/O 模型  阻塞式 I/O 模型  非阻塞式 I/O 模型  输入输出多路复用 I/O 模型  信号驱动 I/O 模型.

Slides:



Advertisements
Similar presentations
面向侧面的程序设计 方林博士 本文下载地址:
Advertisements

第九课 高级文件 IO 编程. 本章的主要内容 高级文件 IO 概述 Select 模型 Poll 模型 实验.
高级服务器设计和实现 1 —— 基础与进阶 余锋
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
Linux 进程间通信 利用管道进行通讯. 2 主要内容 传统进程通信 信号通信 管道通信 System V IPC 进程通信 消息队列 共享主存 信号量 Socket 网络进程通信.
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
1 实验二、 TCP 、 UDP 通信程序设计实验 ——TCP 通信实验 注意 bind 和 listen socket() bind() listen() accept() write() read() TCP Server read() socket() TCP Client connect()
性平三法及兒少相關保護法令之介紹與宣導 華誠聯合律師事務所 蔡其龍律師.
计算机网络课程总结 一、计算机网络基础 计算机网络定义和功能、基本组成 OSI/RM参考模型(各层的功能,相关概念, 模型中数据传输 等)
第二章 项目一:企业厂区与车间平面设计 1.
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
第8章 机床操作 主讲:臧红彬 博士.
Oracle数据库 Oracle 子程序.
Socket.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
TCP报文格式.
SOCKET编程原理.
管理信息结构SMI.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
Phase 4: Network For ACM05, By Mu LI.
走进编程 程序的顺序结构(二).
网络常用常用命令 课件制作人:谢希仁.
临界区软件互斥软件实现算法.
PostgreSQL 8.3 安装要点 四川大学计算机学院 段 磊
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Windows网络操作系统管理 ——Windows Server 2008 R2.
第2章 套接字网络编程基础 2.1 UNIX套接字网络编程接口的 产生与发展 2.2 套接字编程的基本概念 2.3 面向连接的套接字编程
Online job scheduling in Distributed Machine Learning Clusters
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
如何生成设备节点 广州创龙电子科技有限公司
临界区软件互斥软件实现算法 主讲教师:夏莹杰
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
Westmont College 网络应用软件 第一讲 (客户-服务器 概念, 协议端口的使用, 套接字API)
Advister: Quincy Wu Speaker: Chenglin Tsai Date:3/26
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
内容摘要 ■ 课程概述 ■ 教学安排 ■ 什么是操作系统? ■ 为什么学习操作系统? ■ 如何学习操作系统? ■ 操作系统实例
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
微机系统的组成.
$9 泛型基础.
第四章 团队音乐会序幕: 团队协作平台的快速创建
DQMClientDim.cxx及双光子练习
Cassandra应用及高性能客户端 董亚军 来自Newegg-NESC.
姚金宇 MIT SCHEME 使用说明 姚金宇
实验七 安全FTP服务器实验 2019/4/28.
工业机器人知识要点解析 (ABB机器人) 主讲人:王老师
计算机网络与网页制作 Chapter 07:Dreamweaver CS5入门
面向非连接的 SOCKET编程 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
SOCKET( ).
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
信号量(Semaphore).
2019/5/3 JAVA Socket(UDP).
数据报分片.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Chapter 18 使用GRASP的对象设计示例.
临界区问题的硬件指令解决方案 (Synchronization Hardware)
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
_07多连接之select模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
Chinese Virtual Observatory
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
阻塞式模型并发 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
Presentation transcript:

网络应用程序设计 - unit 07 I/O 模型

2 主要内容  I/O 模型  阻塞式 I/O 模型  非阻塞式 I/O 模型  输入输出多路复用 I/O 模型  信号驱动 I/O 模型

3 I/O 模型  Linux 系统 I/O 模型 阻塞式 I/O 模型-默认 I/O 模型 非阻塞式 I/O 模型 多路复用 I/O 模型 信号驱动 I/O 模型

4 阻塞式 I/O 模型  产生阻塞的原因 linux 进程调度算法-时间片调度算法  每个进程占用 CPU 一个时间片后被挂起  当前运行进程如果需要等待其他系统资源,且 不是非阻塞方式运行,将进入等待状态

5 阻塞式 I/O 模型  产生阻塞的函数-读操作 read 、 readv 、 recv 、 recvfrom 和 recvmsg 接收缓冲区无数据 拷贝数据 用户态核心态 read 数据到达 拷贝数据结束 read 返回 阻塞等待数据 状态 切换 状态 切换 TCP 协议以字节为单位, 只要接收缓冲区中出现数据, 进程被唤醒 UDP 协议以数据报为单位, 当完整的数据报到达时,进 程被唤醒 阻塞过程中,对方主机崩 溃,将永远阻塞

6 阻塞式 I/O 模型  产生阻塞的函数-写操作 write 、 writev 、 send 、 sendto 和 sendmsg 阻塞等待回 收数据缓冲区 发送缓冲区空间不足 拷贝数据 用户态核心态 write 得到数据确认, 空间足够 拷贝数据结束 write 返回 状态 切换 状态 切换 写操作发生阻塞的几率 低于读操作 TCP 协议写操作在对方 主机崩溃不会永远阻塞, 但需要等待较长时间 UDP 协议写操作永远不 会阻塞

7 阻塞式 I/O 模型  产生阻塞的函数-建立连接 connect 启动 3 次握手操作 用户态核心态 connect 连接建立完成 connect 返回 等待握手 操作完成 状态 切换 状态 切换 客户机 TCP 协议接收到服务器 TCP 协议返回的对 SYN 数据段 的确认时,函数 connect 成功 返回 TCP 协议的连接操作至少需要 一个往返时间 UDP 的 connect 操作不产生 连接,因此不阻塞

8 阻塞式 I/O 模型  产生阻塞的函数- TCP 协议接受连接 accept 没有已完成连接 创建连接 socket 用户态 核心态 accept 连接建立完成 连接 socket 建立成功 accept 返回 阻塞等待连接 状态 切换 状态 切换

9 阻塞式 I/O 模型  阻塞式 I/O 模型的特点 结构简单容易同步 进程可能永远阻塞或 阻塞时间过长 阻塞时进程效率低  示例: server.cpp client.cpp 数据到达 socket1 读阻塞 读数据 socket2 读阻塞 数据到达 读数据

10 阻塞式 I/O 模型  阻塞式 I/O 模型的超时控制 调用 alarm 函数设置超时  超时到达时产生 SIGALARM 信号中断 I/O 函数阻塞,对于 4 种产生阻塞的函数 均有效  多次调用 alarm 时,产生的 SIGALARM 信号无法区分是哪一次超时引发的,无 法实现超时控制  示例: alarmio.cpp

11 阻塞式 I/O 模型  阻塞式 I/O 模型的超时控制 设置 socket 选项  设置 SO_RCVTIMEO 和 SO_SNDTIMEO 选项 设置了这两个选项之后,所有的读写操作 可以保证在超时范围内返回 只需设置一次选项,对以后的读写操作均 有效 不适用于 accept 和 connect 示例: timeoutio.cpp

12 用户态 read read 返 回错误 read read 返回 接收缓冲 区无数据 数据到达 接收缓冲 区有数据 拷贝数 据完成 拷贝数据 核心态 状态 切换 状态 切换 状态 切换 状态 切换 非阻塞式 I/O 模型  非阻塞式 I/O 模型概述 可以设置 socket 为非阻 塞模式 在非阻塞模式 socket 上 进行 I/O 操作时,如果操 作不能完成,将以错误 返回 4 种 I/O 操作在非阻塞式 socket 下均不会阻塞

13 非阻塞式 I/O 模型  设置 socket 为非阻塞方式 函数 fcntl int flags; flag=fcntl(sockfd,F_GETFL,0); fcntl(sockfd,F_SETFL,flag|O_NONBLOCK); 函数 ioctl int on=1; ioctl(sockfd,FIONBIO,&on);

14 非阻塞式 I/O 模型  非阻塞式 I/O 模型对 4 种 I/O 操作返回的错误 读操作  接收缓冲区无数据时返回 EWOULDBLOCK 写操作  发送缓冲区无空间时返回 EWOULDBLOCK  空间不够时部分拷贝,返回实际拷贝字节数 建立连接  启动 3 次握手,立刻返回错误 EINPROGRESS  服务器客户端在同一主机上 connect 立即返回 成功 接受连接  没有新连接返回 EWOULDBLOCK

15 非阻塞式 I/O 模型  检查操作是否可以完成的方式 轮询式 for(;;){ if(read(sockfd,buf,nbytes)<0){ if(errno==EWOULDBLOCK)continue; else{ printf(“read error\n”); break; } else break; }

16 非阻塞式 I/O 模型  检查操作是否可以完成的方式 select 函数检查 I/O 是否就绪 // 设置监测的描述符集合 … // 阻塞等待描述符就绪 select( rdset, wrset, exset, …); // 对就绪描述符进行相应操作(读,写, … ) …

17 非阻塞式 I/O 模型  非阻塞式 I/O 模型特点 优点  不会产生阻塞  输入方式效率比较 高 缺点  长时间占用 CPU 示例:  server.cpp  client_n.cpp 数据到达 socket1 读失败 读数据 socket2 读失败 读数据 数据到达

18 输入输出多路复用 I/O 模型  多路复用模型 用户态 select select 返回 没有 socket 满足条件 阻塞等待任何一个 socket 就绪 一个或几个 socket 就绪 设置 socket 描述符集合完毕 设置就绪 socket 描述符 核心态 状态 切换 状态 切换

19 输入输出多路复用 I/O 模型  socket 描述符就绪条件 读就绪条件  接收缓冲区中的数据量 ≥ 接收下限。  读通道被关闭,收到 FIN 字段  侦听 socket 的完成连接队列不为空  非阻塞式 socket 的 connect 操作过程中 出现错误 默认接收下限为 1 ( TCP 为 1 字节, UDP 为 1 个数据报), 可以用 SO_RCVLOWAT 修改默认值

20 输入输出多路复用 I/O 模型  socket 描述符就绪条件 写就绪条件  发送缓冲区中可用空间 ≥ 发送下限。  写通道被关闭。  非阻塞式 socket 的 connect 操作成功 TCP 默认接收下限为 2048 字节,可以用 SO_SNDLOWAT 修改默认值 UDP 协议没有实际的发送缓冲区,其发送缓冲区空间总 是大于发送下限,所以 UDP socket 总是写就绪

21 输入输出多路复用 I/O 模型  socket 描述符就绪条件 异常就绪条件(用于带外数据)

22 输入输出多路复用 I/O 模型  多路复用 I/O 模型特点 只检查一个 socket 描 述符时和阻塞式 I/O 模 型类似,只是阻塞的 位置不同,但效率低 于阻塞式 I/O 模型 在多个 socket 描述符 上进行 I/O 操作时效率 高于阻塞式 I/O 示例 :client_m.cpp socket1 读第一个 socket 数据 socket2 读第二个 socket 数据 阻塞等待 socket 就绪

23 信号驱动 I/O 模型  信号驱动通信过程 用户态 设置 SIGIO 处理函数 read 返回 没有数据 到达 拷贝数据 核心态 状态 切换 状态 切换 信号处理函数 read 数据到达发送信号 SIGIO 执行其 他任务 SIGIO

24 信号驱动 I/O 模型  信号驱动 I/O 模型 的主要步骤 1. 设置 SIGIO 信号 处理函数 2. 设置 socket 描述 符所有者 3. 允许这个 socket 进行信号驱动 I/O void sigio_handler(int signo){ … } int main(){ int sockfd; int on=1; … signal(SIGIO,sigio_handler); fcntl(sockfd,F_SETOWN,getpid()); ioctl(sockfd,FIOASYNC,&on); … }

25 信号驱动 I/O 模型  信号驱动 I/O 模型特点 等待 I/O 操作可以进行的过程中不用阻塞, 可以执行其他操作 程序结构简单 更适用于 UDP 协议  TCP 协议在很多环节上会产生 SIGIO 信号,难 以区分产生信号的原因  UDP 只在收到数据包或错误时产生 SIGIO 信号 示例: sig_server.cpp,udpclient.cpp