基础知识
1. 文件描述符 fd
Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(简称:fd,文件描述符);描述符就是一个数字,指向内核中一个结构体(文件路径,数据区,等一些属性) ; 那么应用程序对文件的读写就通过对描述符的读写完成。
2. 系统调用是如何完成一个I/O操作的呢?
linux将内存分为内核区,用户区; linux内核给我们管理所有的硬件资源,应用程序通过调用系统调用和内核交互,达到使用硬件资源的目的; 应用程序通过系统调用read发起一个读操作;这时候内核创建一个文件描述符,并通过驱动程序向硬件发送读指令,并将读的的数据放在这个描述符对应结构体的缓存区。但这个结构体是在内核内存区的。需要将这个数据读到用户区。这样完成了一次读操作;
3. IO设备和内存之间的数据传输方式:直接内存访问 DMA
CPU向DMA控制器下达指令,让DMA控制器来处理数据的传送,DMA控制器通过系统总线来传输数据,传送完毕再通知CPU。
4.什么是IO?
根据操作设备不同分为:内存IO 网络IO 磁盘IO 等等。内存IO相比后两种足够的快,一般我们只关注后两种IO。
IO的操作需要由内核系统调用来完成,同时系统调用显然需要由CPU来调度,CPU速度非常快,这就导致CPU不得不浪费时间来等待慢速的IO操作。
通过多进程等方式来充分利用空闲的CPU资源,但是还是希望能够让CPU花费足够少的时间在IO操作调度上,这样就可以有更多的CPU时间来完成更多的IO操作。
解决IO的问题,简单总结下就是 如何让高速的CPU和慢速的IO设备更好地协调工作 的问题。
I/O模型
1. 同步阻塞I/O
线程阻塞,知道IO就绪才调用IO
2. 同步非阻塞I/O
进行调用时,如果IO没有就绪,返回错误而非阻塞线程,应用程序循环调用知道IO操作完成
3. 多路复用 (多路I/O就绪通知)
内核提供系统调用,检查有哪些fd已经就绪,已就绪的fd进行数据复制。
为了解决阻塞IO的问题,出现了IO多路复用模型。多路复用就是用单独的线程(内核级的)来统一等待所有的的socket上的数据,一当某个socket上有数据后,就启用用户线程来copy数据。
- select
优势:支持各个平台
缺点:单进程能只能监控fd限制1024;随着fd的增大复制的开销大;对非活跃状态的TCP,一样会被扫描。
- poll
和select本质一样,只是fd限制没有了
- epoll
epoll基于时间的就绪通知方式。epoll时间通过epoll_ctl()来注册每个文件描述符,一旦某个fd就绪时,内核会回调,激活。
使用mmap机制。
4. I/O信号驱动
当fd变成就绪状态时,SIGIO会发信号通知用户进程。(只通知一次)
SIGIO是linux2.4下最好的多路IO就绪通知方法。
缺点: 代表事件的信号由内核的事件队列来维护,按照顺序通知,可能会过期,队列长度有限制。
5. 异步I/O (AIO)
用户进程直接系统调用(aio_read等),有内核进程去处理数据IO,如果数据准备好,内核进程还要把数据拷贝到用户进程,然后通知用户进程,用户进程按照设定的入口函数,去处理异步调用结果,它的异步请求已完成。
所以异步IO其实不需要关注IO的,都是系统内核来解决的。
分享到:
相关推荐
1) 掌握Winsock I/O模型工作原理; 2) 熟悉I/O模型中使用的Winsock接口函数; 3) 掌握使用I/O模型进行网络程序设计的编程步骤; 实验要求: 在上述I/O模型中自选一个I/O模型,构建一个TCP服务器,该服务器能: 能显示...
在本文中,我们将深入探讨异步Socket I/O模型的几种常见实现方式,包括选择(select)、异步选择(asynchronous select)、事件选择(poll)、重叠I/O(overlapped I/O)以及完成端口(completion ports)。...
### Windows Socket五种I/O模型详解 在计算机网络编程中,Windows Socket(Winsock)是实现网络通信的重要机制之一。为了高效地处理网络数据传输,Winsock提供了多种输入/输出(I/O)模型来满足不同场景下的需求。...
`select` I/O模型是一种在多路复用I/O中广泛使用的机制,它允许一个进程监控多个文件描述符(如套接字)的状态,以确定何时进行读写操作。在本篇中,我们将深入探讨`select` I/O模型在客户端应用中的运用,以及与...
在本文中,我们将深入探讨如何使用C++编程语言来实现基于WSAEventSelect的I/O模型。WSAEventSelect是Windows Socket API(Winsock)提供的一种异步I/O机制,它允许应用程序通过等待网络事件来处理多个套接字。这个...
完成端口(IOCP,Input/Output Completion Port)是Windows操作系统提供的一种高效的多线程并发I/O模型,尤其适用于网络编程中的高并发场景。在IOCPDemo中,我们将会探讨如何利用这种模型来构建高性能的UDP多播...
常见的I/O模型有阻塞I/O、非阻塞I/O、I/O多路复用、信号驱动I/O以及异步I/O。在WINSOCK中,这些模型都被支持,并且可以根据应用场景选择合适的模型。 1. **阻塞I/O**:这是最基本的模型,当一个套接字进行读写操作...
在Windows操作系统中,进行网络编程时,我们常常会遇到多种Socket I/O模型。这些模型决定了如何处理输入/输出操作,从而影响程序的性能和效率。本文将深入探讨六种主要的Socket I/O模型,并通过实例解析它们的工作...
在各种I/O模型中,`select`模型是一种广泛使用的机制,尤其在处理多路复用I/O时。本文将深入探讨`select`模型的工作原理、优缺点以及如何在实际代码中应用。 `select`模型是一种I/O多路复用技术,允许程序同时监控...
这里我们将详细探讨这两个概念以及I/O模型。 首先,同步与异步是客户端(C端)调用服务端(S端)时的行为模式。同步模式下,客户端在调用一个功能后,必须等待该功能执行完毕并返回结果,才能进行下一步操作。这就...
在Windows操作系统中,Socket I/O模型是网络编程的重要组成部分,它允许应用程序进行网络通信。本资源包含一本关于“Windows Socket I/O模型”的电子书以及配套的源代码,旨在帮助开发者深入理解并掌握在Windows环境...
本文将深入探讨五种主要的套接字I/O模型:阻塞I/O、非阻塞I/O、I/O复用(select/poll/epoll)、信号驱动I/O以及异步I/O,同时通过提供的源代码文件,我们可以更直观地理解这些模型的工作原理。 1. **阻塞I/O模型**...
### 当前Windows支持的各种Socket I/O模型 在现代操作系统中,网络编程是不可或缺的一部分,而Socket I/O模型则是实现高效网络通信的关键技术之一。本文将详细介绍当前Windows系统中支持的各种Socket I/O模型,包括...
利用Visual C++ 6.0实现的一套Winsock I/O模型,包括了所有的Winsock I/O模型:Select模型、AsyncSelect(异步选择模型)、EventSelect(事件选择模型)、Overlapped(重叠模型)、CompletionRoutine(完成例程)、...
本实验“IO 模型网络程序实验”旨在帮助你深入理解Winsock I/O模型的工作原理,以及如何在实际编程中应用这些模型。Winsock是Windows操作系统中的一个应用程序接口(API),它为开发者提供了实现TCP/IP协议栈的功能...
在计算机网络编程中,I/O模型是至关重要的概念,它决定了如何处理数据的读写操作。Windows套接字API提供了一种称为“select”选择模型的机制,用于管理多个网络连接并有效地处理I/O事件。本文将深入探讨select选择...
源码及实验报告 采用select模型设计一个支持UDP和TCP的多协议回射服务器。