名词解释IOCP简介四-Read
简介几种系统调用函数:write、read、open、close、ioctl

简介⼏种系统调⽤函数:write、read、open、close、ioctl 在 Linux 中,⼀切(或⼏乎⼀切)都是⽂件,因此,⽂件操作在 Linux 中是⼗分重要的,为此,Linux 系统直接提供了⼀些函数⽤于对⽂件和设备进⾏访问和控制,这些函数被称为系统调⽤(syscall),它们也是通向操作系统本⾝的接⼝。
⼀、系统调⽤ 系统调⽤就是 Linux 内核提供的⼀组⽤户进程与内核进⾏交互的接⼝。
这些接⼝让应⽤程序受限的访问硬件设备,提供了创建新进程并与已有进程进⾏通信的机制,也提供了申请操作系统其他资源的能⼒。
系统调⽤⼯作在内核态,实际上,系统调⽤是⽤户空间访问内核空间的唯⼀⼿段(除异常和陷⼊外,它们是内核唯⼀的合法⼊⼝)。
系统调⽤的主要作⽤如下:1)系统调⽤为⽤户空间提供了⼀种硬件的抽象接⼝,这样,当需要读写⽂件时,应⽤程序就可以不⽤管磁盘类型和介质,甚⾄不⽤去管⽂件所在的⽂件系统到底是哪种类型;2)系统调⽤保证了系统的稳定和安全。
作为硬件设备和应⽤程序之间的中间⼈,内核可以基于权限、⽤户类型和其他⼀些规则对需要进⾏的访问进⾏判断;3)系统调⽤是实现多任务和虚拟内存的前提。
要访问系统调⽤,通常通过 C 库中定义的函数调⽤来进⾏。
它们通常都需要定义零个、⼀个或⼏个参数(输⼊),⽽且可能产⽣⼀些副作⽤(会使系统的状态发⽣某种变化)。
系统调⽤还会通过⼀个 long 类型的返回值来表⽰成功或者错误。
通常,⽤⼀个负的值来表明错误,0表⽰成功。
系统调⽤出现错误时,C 库会把错误码写⼊ errno 全局变量,通过调⽤ perror() 库函数,可以把该变量翻译成⽤户可理解的错误字符串。
⼆、⼏种常⽤的系统调⽤函数2.1 write 系统调⽤ 系统调⽤ write 的作⽤是把缓冲区 buf 的前 nbytes 个字节写⼊与⽂件描述符 fildes 关联的⽂件中。
它返回实际写⼊的字节数。
如果⽂件描述符有错或者底层的设备驱动程序对数据块长度⽐较敏感,该返回值可能会⼩于 nbytes。
名词解释IOCP简介四-Read

hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
该语句的作用是返回一个句柄,在为完成端口分配了一个套接字句柄后,用来对那个 端口进行标定(引用)。
函数功能:注意该函数实际用于两个明显有别的目的: 1. 用于创建一个完成端口对象。 2. 将一个句柄同完成端口关联到一起。
IOCP简介
IOCP的开发
1、CreateIoCompletionPort
最开始创建一个完成端口时,唯一感兴趣的参数便是 NumberOfConcurrentThreads(并发线程的数量);前面三个参数都会被忽略。 NumberOfConcurrentThreads参数的特殊之处在于,它定义了在一个完成端口上, 同时允许执行的线程数量。理想情况下,我们希望每个处理器各自负责一个线程的运 行,为完成端口提供服务,避免过于频繁的线程“场景”切换。若将该参数设为0Байду номын сангаас 表明系统内安装了多少个处理器,便允许同时运行多少个线程!可用下述代码创建一 个I/O完成端口:
IOCP简介
IOCP的应用
可以看出完成端口是到目前为止最为复杂的输入输出模式。然而,当一个 应用不得不同时处理大量的socket时,它也提供了使系统性能达到最佳的可 能性。只有在被迫面对几百甚至几千个并发的socket、你又希望在添加CPU 后可以获得更好的scale时,才被派上战场。关于完成端口,最重要的是记住 这一点:如果你为winnt/2000开发处理大量socket I/O 请求的高性能服 务,它是你的最佳选择 IOCP不仅仅在通信socket上,同时也可以用于其他方面,例如读写文件, 比如把文件句柄关联到完成端口上,产生一定量的工作器线程,读取文件不同 的部分实际读取数据是系统内部处理,只是读取完了通知一下,并且把相关I O数据填充到结构体中
iocp 编程

IOCP编程什么是IOCPIOCP(Input/Output Completion Ports)是一种高效的异步I/O模型,它在Windows操作系统中提供了对网络编程的支持。
通过使用IOCP,我们可以实现高性能、可伸缩性强的网络应用程序。
在传统的同步I/O模型中,当一个线程在等待数据时,它会被阻塞,直到数据到达。
而在异步I/O模型中,线程不会被阻塞,它可以继续执行其他任务。
IOCP就是基于这种异步I/O模型实现的。
IOCP的工作原理使用IOCP进行编程主要涉及以下几个核心概念:端口(Port)、完成包(Completion Packet)、套接字(Socket)和重叠操作(Overlapped Operation)。
•端口:一个端口代表一个I/O设备或者一个文件。
每个端口都有一个关联的完成端口。
•完成包:完成包是指一个I/O操作完成时所生成的信息块。
它包含了完成的状态、相关参数和返回值等信息。
•套接字:套接字是网络编程中用于进行通信的抽象概念。
•重叠操作:重叠操作是指一次I/O操作请求,在请求发出之后,线程就可以继续执行其他任务了。
IOCP主要通过以下几个步骤来实现异步I/O:1.创建一个完成端口(Completion Port)。
2.创建一个或多个工作者线程(Worker Thread),这些线程用于处理I/O操作。
3.将套接字关联到完成端口上,使得该套接字上的I/O操作能够被异步处理。
4.当有I/O操作完成时,系统会将相关的完成包放入完成队列中。
5.工作者线程从完成队列中获取完成包,并进行相应的处理。
IOCP的优势和适用场景相比于传统的同步阻塞模型,IOCP具有以下几个优势:1.高性能:IOCP能够充分利用CPU资源,提高程序的并发处理能力。
它通过异步I/O模型,使得线程在等待数据时不被阻塞,可以继续执行其他任务,从而充分利用了CPU资源。
2.可伸缩性:IOCP可以轻松地扩展到支持大量的并发连接。
完成端口详细解析

关于完成端口(IOCP)的文章汇总- [C/C++]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/32007489.html首先讨论一下I/O Completion Ports试图解决什么样的问题。
写一个IO Intensive服务器程序,对每一个客户请求生成一个新的child process/worker thread来处理,每个process/thread使用同步IO,这是最经典古老的解法了。
在这之上的改进是prefork 多个process 或者使用线程池。
(使用process或thread,原理都差不多,thread的context switch花销要比process switch要小。
为了论述简单,下面只讨论线程。
)这种结构的并发性并不高,哪怕你用C++, C甚至汇编来写,效率都不会很高,究其原因,在于两点:一.同步IO,每个线程大多数时间在等IO request的结束。
IO相对于CPU,那是极极慢的。
我翻了翻手里的Computer Architecture, A Quantitative Approach第二版,1996年出的,里面对CPU Register, CPU Cache, RAM, Disk,列的access time如下:Java代码1.Registers: 2-5 nano seconds2.CPU Cache: 3-10 nano seconds3.RAM: 80-400 nano seconds4.Disk: 5000000 nano seconds (5 milli seconds)如今CPU又按照摩尔定律发展了十年后,这个硬盘还是机械式的磁头移来移去读写,尽管如今disk controller都有cache,也在发展,但和CPU相比,差距越来越大。
(谁有最新数据可以贴上来。
)二.生成数量大大超过CPU总数的线程。
这样做有两个弊端,第一是每个线程要占用内存,Windows底下每个thread自己stack的省缺大小为1M,32位程序下一个用户程序最大能利用的内存也就3G,生成3000个线程,内存就没了。
简述iocp模型的原理和工作过程

简述iocp模型的原理和工作过程IOCP模型的原理和工作过程如下:原理:IOCP模型的核心原理是利用操作系统提供的异步I/O和内核级事件通知机制。
异步I/O使得应用程序可以在等待I/O完成时继续处理其他任务,而内核级事件通知机制可以使得操作系统在I/O完成后主动通知应用程序。
通过将I/O操作的处理放在操作系统层面,IOCP模型能够实现高并发、高吞吐量的网络通信。
工作过程:1.创建IOCP对象:应用程序首先创建一个IOCP对象,用于和操作系统进行通信。
2.绑定套接字:应用程序将要进行异步I/O操作的套接字与IOCP对象进行关联。
3.接受连接:应用程序使用套接字进行监听,并且接受到客户端连接请求后,将连接套接字与IOCP对象进行关联,从而使得这个连接套接字能够参与IOCP模型的异步I/O操作。
4.发送和接收数据:应用程序通过调用操作系统提供的异步I/O操作函数,发起网络数据的发送和接收操作。
在发送和接收操作完成之前,应用程序可以继续处理其他任务。
5.等待通知:在发送和接收操作完成之后,应用程序会调用一个等待通知的函数,将自己挂起,等待操作系统的通知。
6.I/O完成通知:当操作系统中发生I/O操作完成的事件时,IOCP对象会通知应用程序,并将I/O操作的结果返回给应用程序。
7.处理完成的I/O操作:应用程序在收到I/O完成的通知后,可以根据返回的结果进行相应的处理。
通常会将I/O操作的结果放入一个队列中,以便后续的处理。
8.处理队列中的完成操作:应用程序会不断地从队列中取出已完成的I/O操作,并进行相应的处理。
处理完成的操作后,应用程序可以继续发起新的I/O操作,从而实现不断地进行网络通信。
总结:IOCP模型利用操作系统提供的异步I/O和内核级事件通知机制,将网络通信的I/O操作交给操作系统来处理,从而实现了高并发、高吞吐量的网络通信。
应用程序通过调用操作系统提供的异步I/O函数来发起发送和接收数据的操作,在操作完成前可以继续处理其他任务。
IOCP完全解析

DWORD Flags = 0; // 单 I/O 操作数据 LPPER_IO_DATA PerIoData = NULL; PerIoData = (LPPER_IO_DATA)GlobalAlloc(GPTR, sizeof(PER_IO_DATA)); ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED)); PerIoData->DataBuf.len = 1024; PerIoData->DataBuf.buf = PerIoData->buffer; PerIoData->OperationType = 0; // read WSARecv(PerHandleData->Socket, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags, &(PerIoData->Overlapped), NULL); } /**/////////////////////////////////////////////////////////////////////////// return nRetCode; } /**/////////////////////////////////////////////////////////////////////////// DWORD WINAPI ServerWorkerThread(LPVOID lpParam) { HANDLE CompletionPort = (HANDLE)lpParam; DWORD BytesTransferred; LPOVERLAPPED lpOverlapped; LPPER_HANDLE_DATA PerHandleData = NULL; LPPER_IO_DATA PerIoData = NULL; DWORD SendBytes; DWORD RecvBytes; DWORD Flags; BOOL bRet = FALSE; while (TRUE) { bRet = GetQueuedCompletionStatus(CompletionPort, &BytesTransferred, (PULONG_PTR) &PerHandleData,
C语言常见基本词汇及词汇解释

C语言常用基本词汇及其他提示语运算符与表达式:1.constant 常量2. variable 变量3. identify 标识符4. keywords 关键字5. sign 符号6. operator 运算符7. statement语句8. syntax 语法9. expression 表达式10. initialition 初始化11. number format 数据格式12 declaration 说明13. type conversion 类型转换14.define 、definition 定义条件语句:1.select 选择2. expression 表达式3. logical expression 逻辑表达式4. Relational expression 关系表达式5.priority优先6. operation运算7.structure 结构循环语句:1.circle 循环2. condition 条件3. variant 变量4. process过程5.priority优先6. operation运算数组:1. array 数组2. reference 引用3. element 元素4. address 地址5. sort 排序6. character 字符7. string 字符串8. application 应用函数:1.call 调用2.return value 返回值3.function 函数4. declare 声明5. `parameter 参数6.static 静态的7.extern 外部的指针:1. pointer 指针2. argument 参数3. array 数组4. declaration 声明5. represent 表示6. manipulate 处理结构体、共用体、链表:1 structure 结构2 member成员3 tag 标记4 function 函数5 enumerate 枚举6 union 联合(共用体)7 create 创建8 insert 插入9 delete 删除10 modify 修改文件:1、file 文件2、open 打开3、close 关闭4、read 读5、write 写6、error 错误序号主要章节常用英汉对照词汇备注1 运算符与表达式(operator and expression )汉语英语常量constant变量variable标识符identify关键字keywords符号sign运算符operator语句statement语法syntax表达式Expression初始化Initialization数据格式number format说明Declaration类型转换type conversion定义Define 、definition2 条件语句(conditionstatement) 选择select表达式expression逻辑表达式logical expression关系表达式Relational expression 优先priority运算operation结构structure3 循环语句(circle statement) 循环circle条件condition变量variant过程process优先priority运算operation4 函数(function) 调用call返回值return value函数function声明declare参数parameter静态的static外部的extern5 数组和指针(array and pointer) 数组array 引用reference元素element地址address排序sort字符character字符串string应用application指针pointer参数argument数组array声明declaration表示represent处理manipulate6 结构体、共用体(structures 、union )结构structure 成员member标记tag函数function枚举enumerate联合( 共用体) union创建create插入insert删除delete修改modify7 文件(file) 文件file打开open关闭close读read写write错误errorProgram Design 程序设计writing program 编写程序standardize vt.使标准化coding the program 编程simplify vt.单一化,简单化programming 程序revision n.校订,修正programmer n.程序员occupy vt.占领,住进logic n.逻辑,逻辑学BASIC 初学者通用符号指令代码machine code 机器代码teaching language 教学语言debug n.DOS命令,调试simplicity n.单纯,简朴compactness a.紧凑的,紧密的timesharing system 分时系统description n.描述,说明interactive language 交互式语言break n.中断manufacturer n.制造业者structure chart 结构图dialect n.方言,语调the program flow 程序流expense n.费用,代价manager module 管理模块uniformity n.同样,划一worder module 工作模块archaic a.己废的,古老的mainmodule 主模块sufficient a.充分的,足够的submodule 子模块data processing 数据处理modify v.修正,修改business application 商业应用outline n.轮廓,概要scientific application 科学应用compose分解lexical a.字典的,词汇的code 代码non-programmer n.非编程人员node vt改为密码notation n.记号法,表示法,注释pseudocode n.伪代码verbosity n.唠叨,冗长commas n.逗点逗号record n.记录documentation 文档subrecord n.子记录flowchart/flow 程表/流程data division 数据部visual a.视觉的procedure division 过程部represent vt.表现,表示,代表comprise vt.包含构成structured techniques结构化技术operator n.运算符,算子straightforward a.笔直的,率直的commercial package 商业软件包subroutine n.子程序generator n.产生器,生产者driver module 驱动模块mathematician n.专家line by line 逐行operator n.作符translate vt.翻译,解释forerunner n.先驱modular 摸块化ancestor n.祖宗cumbersome a.讨厌的,麻烦的teaching programming 编程教学lengthy a.冗长的,漫长的alter vi./vt.改变flaw n.缺点裂纹devclop vt.发达separate a.各别的recompile v.编译assist n.帮助cycle n.循环technician n.技师remove vt.移动,除去straight line 直线category n.种类,类项rectangle n.长方形,矩形P-code p代码virtrally ad.事实上symology n.象征学象征的使用register n.寄存器to summaries 总之,总而言之by convention 按照惯例cyptic n.含义模糊的,隐藏的diamond-shaped a,菱形的bracket n.括号decision n判断obviate 除去,排除terminal n. a终端机,终端的keyword n.关键字card reader 阅读器underline vt.下划线translator program 译程序monadic a. monad(单位)的Programming 程序设计dec/binary n.二进制source language 源语shift 变化,转移,移位machine language 机器overflow n.溢出machine instruction 机器指令arithmetic n.算术,算法computer language 计算机语composite symbol 复合型符号.assembly language 汇编语assignment n.赋值floating point number浮点数proliferation n.增服high-level language高级语pointer n.指针natural language 自然语言array n.数组矩阵,source text 源文本subscript n.下标intermediate language 中间语言type conversion 类型转换software development 软件开发address arithmetic 地址运算map vt.映射,计划denote vt.指示,表示maintenance cost 维护费用subprogram n.子程序legibility n.易读性,易识别separate compilation 分离式编泽amend vt.修正,改善alphabetic a.照字母次序的consumer n.消费者digit n.数字位数enormous a.巨大的,庞大的numeric expression 数值表达式reliability n.可信赖性,可信度tap n.轻打,轻敲,选择safety n.安全,安全设备print zone 打印区property n.财产,所有权column n.列correctness n.正确,functionality n.机能semicolon n.分号portable a.叮携带的,可搬运的survey n.概观.altoggle n.肘节开关task n.作,任务declaration n.宣告说明source program 源程序mufti-dimension array 多维数组object program 目标程序其他提示语:CPU(Center Processor Unit)中央处理单元mainboard主板RAM(random accessmemory)随机存储器(内存)ROM(Read Only Memory)只读存储器Floppy Disk软盘Hard Disk硬盘CD-ROM光盘驱动器(光驱)monitor监视器keyboard键盘mouse鼠标chip芯片CD-R光盘刻录机HUB集线器Modem= MOdulator-DEModulator,调制解调器P-P(Plug and Play)即插即用UPS(Uninterruptable Power Supply)不间断电源BIOS(Basic-input-OutputSystem)基本输入输出系统CMOS(Complementary Metal-Oxide-Semiconductor)互补金属氧化物半导体setup安装uninstall卸载wizzard向导OS(Operation Systrem)操作系统OA(Office AutoMation)办公自动化exit退出edit编辑copy复制cut剪切paste粘贴delete删除select选择find查找select all全选replace替换undo撤消redo重做program程序license许可(证)back前一步next下一步finish结束folder文件夹Destination Folder目的文件夹user用户click点击double click双击right click右击settings设置update更新release发布data数据data base数据库DBMS(Data Base Manege System)数据库管理系统view视图insert插入object对象configuration配置command命令document文档POST(power-on-self-test)电源自检程序cursor光标attribute属性icon图标service pack服务补丁option pack功能补丁Demo演示short cut快捷方式exception异常debug调试previous前一个column行row列restart重新启动text文本font字体size大小scale比例interface界面function函数access访问manual指南active激活computer language计算机语言menu菜单GUI(graphical user interfaces )图形用户界面template模版page setup页面设置password口令code密码print preview打印预览zoom in放大zoom out缩小pan漫游cruise漫游full screen全屏tool bar工具条status bar状态条ruler标尺table表paragraph段落symbol符号style风格execute执行graphics图形image图像Unix用于服务器的一种操作系统Mac OS苹果公司开发的操作系统OO(Object-Oriented)面向对象virus病毒file文件open打开colse关闭new新建save保存exit退出clear清除default默认LAN局域网WAN广域网Client/Server客户机/服务器ATM( AsynchronousTransfer Mode)异步传输模式Windows NT微软公司的网络操作系统Internet互联网WWW(World Wide Web)万维网protocol协议HTTP超文本传输协议FTP文件传输协议Browser浏览器homepage主页Webpage网页website网站URL在Internet的WWW服务程序上用于指定信息位置的表示方法Online在线Email电子邮件ICQ网上寻呼Firewall防火墙Gateway网关HTML超文本标识语言hypertext超文本hyperlink超级链接IP(Address)互联网协议(地址)SearchEngine搜索引擎TCP/IP用于网络的一组通讯协议Telnet远程登录IE(Internet Explorer)探索者(微软公司的网络浏览器) Navigator引航者(网景公司的浏览器)multimedia多媒体ISO国际标准化组织ANSI美国国家标准协会able 能activefile 活动文件addwatch 添加监视点allfiles 所有文件allrightsreserved 所有的权力保留altdirlst 切换目录格式andfixamuchwiderrangeofdiskproblems 并能够解决更大范围内的磁盘问题andotherinFORMation 以及其它的信息archivefileattribute 归档文件属性assignto 指定到autoanswer 自动应答autodetect 自动检测autoindent 自动缩进autosave 自动存储availableonvolume 该盘剩余空间badcommand 命令错badcommandorfilename 命令或文件名错batchparameters 批处理参数binaryfile 二进制文件binaryfiles 二进制文件borlandinternational borland国际公司bottommargin 页下空白bydate 按日期byextension 按扩展名byname 按名称bytesfree 字节空闲callstack 调用栈casesensitive 区分大小写causespromptingtoconfirmyouwanttooverwritean 要求出现确认提示,在你想覆盖一个centralpointsoftwareinc central point 软件股份公司changedirectory 更换目录changedrive 改变驱动器changename 更改名称characterset 字符集checkingfor 正在检查checksadiskanddisplaysastatusreport 检查磁盘并显示一个状态报告chgdrivepath 改变盘/路径node 节点npasswd UNIX的一种代理密码检查器,在提交给密码文件前,它将对潜在的密码进行筛选。
c语言中read的用法

C语言中read的用法1. 简介在C语言中,read是一个系统调用函数,用于从文件描述符中读取数据。
它可以读取任何类型的文件,包括普通文件、设备文件和管道等。
2. 函数原型#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);3. 参数说明•fd:文件描述符,用于指定要读取的文件。
•buf:缓冲区指针,用于存储读取到的数据。
•count:要读取的字节数。
4. 返回值read函数返回实际读取到的字节数。
如果返回值为0,则表示已经到达文件末尾;如果返回值为-1,则表示出现了错误。
5. 使用示例下面是一个简单的示例代码,展示了如何使用read函数从标准输入中读取数据并输出到标准输出:#include <unistd.h>#include <stdio.h>int main() {char buffer[1024];ssize_t bytesRead;printf("请输入一段文字:\n");bytesRead = read(STDIN_FILENO, buffer, sizeof(buffer));if (bytesRead == -1) {perror("读取错误");return 1;}printf("您输入了 %zd 字节的内容:\n", bytesRead);write(STDOUT_FILENO, buffer, bytesRead);return 0;}在上述示例代码中,首先定义了一个大小为1024的字符数组buffer作为读取数据的缓冲区。
然后使用read函数从标准输入中读取数据,将读取到的字节数保存在bytesRead变量中。
接着判断read函数的返回值,如果返回值为-1,则表示出现了错误,可以使用perror函数输出错误信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
IOCP简介
名词解释
四、重叠IO/OVERLAPPED I/O 简单来讲就是不管前一次读入/接收操作有没有完成,继续的发送读入/接收 请求。当某个请求完成后,它会通过某种方式如回调函数、内核对象等通知我们, 我们再进行处理。 1、事件通知的重叠IO:事件通知的重叠IO的好处就是写程序的时候可以先一 股脑投递n个IO的请求,然后将每个OVERLAPPED结构与一个event对象 相关联,再交给操作系统让它自己慢慢处理去。然后投递完所有的请求之后等 待WaitForMultipleObjects返回(WaitForMultipleObjects返回了代 表所有的IO操作都已经完成了),然后依次调用GetOverlappedResult来 获得IO操作的信息(其实GetOverlappedResult也会等待IO操作完成, 不过到这里已经完成了)。当然GetOverlappedResult之前在等待IO操作 完成的时候程序还可以做些其他的事情。
IOCP简介
IOCP的应用
可以看出完成端口是到目前为止最为复杂的输入输出模式。然而,当一个 应用不得不同时处理大量的socket时,它也提供了使系统性能达到最佳的可 能性。只有在被迫面对几百甚至几千个并发的socket、你又希望在添加CPU 后可以获得更好的scale时,才被派上战场。关于完成端口,最重要的是记住 这一点:如果你为winnt/2000开发处理大量socket I/O 请求的高性能服 务,它是你的最佳选择 IOCP不仅仅在通信socket上,同时也可以用于其他方面,例如读写文件, 比如把文件句柄关联到完成端口上,产生一定量的工作器线程,读取文件不同 的部分实际读取数据是系统内部处理,只是读取完了通知一下,并且把相关I O数据填充到结构体中
I/O完成端口 使用介绍
I/O Completion Port
产品研发部 郭磊
内容介绍
IOCP的简介 IOCP的应用 IOCP名词解释 IOC称I/O Completion Port,中文译为I/O完成端口。IOCP是一
iocp (I/O Completion Port ,I/O完成端口,简称iocp) 个异步I/O的API,它可以高效地将I/O事件通知给应用程序。 完成端口中所谓的[端口]并不是我们在TCP/IP中所提到的端口,可以说 是完全没有关系。IOCP只不过是用来进行读写操作,和文件I/O倒是有些类 似。既然是一个读写设备,我们所能要求它的只是在处理读与写上的高效。 一个完成端口其实就是一个FIFO的通知队列,由操作系统把已经完成的 重叠I/O请求的通知放入其中。当某项I/O操作一旦完成,某个可以对该操作 结果进行处理的工作者线程就会收到一则通知。例如一个套接字在被创建后, 可以在任何时候与某个完成端口进行关联。
内容介绍
IOCP的简介 IOCP的应用 IOCP名词解释 IOCP的开发
IOCP简介
名词解释
一、什么是完成包? 完成包,即IO Completion Packet,是指异步IO操作完毕后OS提交给应用层 的通知包。IOCP维护了一个IO操作结果队列,里面保存着各种完成包。应用层 调用GQCS(也就是GetQueueCompletionStatus)函数获取这些完成包。 二、最大并发线程数 在一个典型的IOCP程序里,会有一些线程调用GQCS去获取IO操作结果。最大 并发线程数指定在同一时刻处理完成包的线程数目。 该参数在调用CreateIoCompletionPort时由NumberOfConcurrentThreads 指定。 三、工作者线程 工作者线程一般指的就是调用GQCS函数的线程。要注意的是,工作者线程数 和最大并发线程数并不是同一回事。工作者线程由应用层显示创建 (_beginthreadex 之类)。工作者线程通常是一个循环,会不断地GQCS到完 成包,然后处理完成包。
IOCP简介
名词解释
四、重叠IO/OVERLAPPED I/O 2、而重叠IO的另外一种模式就是异步过程调用,异步过程调用有点类似于创 建线程函数createthread的做法,在读写操作的时候指定一个回调函数,读 取完毕之后程序自动从回调函数入口点来执行(支持重叠IO的读写操作函数如 readfile、WSARecv等都会有个参数指定回调函数入口点),这样把更多的 操作放到重叠IO的处理函数中,主函数就可以腾出更多的时间干正事。 不论是哪种模式,其实原理都是一样的,就是先把要读写的请求全部投递了, 然后主程序可以一边做该做的事情一边来等待IO的完成,IO完成以后 (WaitForMultipleObjects返回之后)再处理数据。
内容介绍
IOCP的简介 IOCP的应用 IOCP名词解释 IOCP的开发
IOCP简介
IOCP的应用
先让我们看看对IOCP的评价: 1、I/O完成端口可能是Win32提供的最复杂的内核对象。 2、这是实现高容量网络服务器的最佳方法。 3、完成端口模型提供了最好的伸缩性。这个模型非常适用来处理数百乃至上 千个套接字。 4、它是唯一适用于高负载服务器[必须同时维护许多连接线路]的一个技术。 Completion ports利用一些线程,帮助平衡由I/O请求所引起的负载。这 样的架构特别适合用在SMP系统中产生的”scalable”服务器。 看来我们完全有理由相信IOCP是大型网络架构的首选。
套用一段《Win32多线程程序设计》里的话结尾:重叠IO可以让你要求操 作系统为你传送数据,并且再传送完毕时通知你,它使你的程序在IO进行过程 中仍然能够继续处理事务。事实上操作系统内部正是以线程来完成重叠IO。你 可以获得线程的所有利益,而不需付出什么痛苦代价。
IOCP简介
名词解释
五、线程池 准确的说,是你创建了多个线程,因为是IOCP帮助你调度的,所以可以理 解为IOCP线程池 六、FIFO(first in first out) 队列的方式,是先进先出的方式 七、LIFO (last in first out) IOCP线程池的调度原理其实是后进先出的方式。是指线程被激活的这种方 式。或许说线程切换的方式。