Please enable JavaScript.
Coggle requires JavaScript to display documents.
IO (:three:IO复用(select和poll) (:one:select (:moneybag:套接字超时设置 (:one:alarm (…
IO
:three:IO复用(select和poll)
:bread:select管理多个文件描述符,只要一个文件描述符检测到有数据到来就返回,这时候调用recv就不会阻塞了.实际阻塞在select
:one:select
:moneybag:参数
:one:nfds
:explode:最大描述符+1,因为select要在[0,nfds)范围内轮询
-
:moneybag:套接字超时设置
:one:alarm
:explode:在调用read之前调用alarm,比如说过5秒后如果read没有结果就取消掉,否则就处理,在处理函数中必须关掉之前的闹钟
:sweat_drops:闹钟可能有其他用途,会混乱
-
:two:设置套接字选项
:pencil2:setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,5);
=>错误码是EWOULLBLOCK
-
:three:select
:bread:read,write,connect,accept都是针对1个文件描述符而言的.所以我们在调用他们之前,先将这1个文件描述符放到select对应的读集合等中,使用select的超时时间参数来判断是否可读/可写,从而再调用前面四个函数
:explode:先用select判断超时时间内是否可读/可写,然后决定调用/不调用read,write,accept,connect
-
:sweat_drops:问题
-
:two:select中的fd_set集合容量的限制为FD_SETSIZE=1024,而这个需要重新编译内核才能实现
-
-
:two:poll
-
:fire:和select一样,要遍历所有文件描述符
-
:two:非阻塞IO
:pencil2:fcntl(fd,F_SETFL,flag|0_NONBLOCK)
:tornado:如果recv为非阻塞IO并且没有数据,那么会返回错误;我们必须循环回去recv直到有数据
-
-
:five:异步IO
-
-
:bread:aio_read系统调用并且生成用户态的buf.如果没有数据到来,aio_read就马上返回处理其他事情;一旦数据到来,内核就会将数据马上从内核空间(套接口缓冲区)拷贝到用户态的buf里面,然后发送信号(aio_read定义的信号)说可以处理数据了
:bulb:信号驱动IO相比,套接口缓冲区开始有数据时,异步IO已经往用户态的buffer里写(推)了,而信号驱动IO却还要等待信号出来,然后调用处理函数,然后用recv函数去拉来内核空间的数据=>异步IO效率更快
:question:questions
-
Which kind of swap space is fastest?A.
A raw partitionB.
A swap file on ext3C.
A partition with sophisticated file system functionsD.
A swap file on FAT
___ present a uniform device-access interface to the I/O subsystem, much as system calls provide a standard interface between the application and the operating system.A.
Device driversB.
BusC.
Operating systemD.
Kernel
The I/O control of disk devices mainly adopt following method.A.
interruptB.
DMAC.
channelD.
polled
:dagger_knife:methods
:three:DMA
:cherry_blossom:theory
-
:bread:我要DMA transfer了 -> driver -> disk controller -> DMA controller, 然后data -> disk controller -> DMA controller -> memory at X
-
-
:two:Interrupts中断
-
设备有自己的控制器,通过interrupt-request line来给CPU处理信息
:four:信号驱动IO
:bread:安装信号处理程序,先处理其他事情,一旦有数据到来,就发送信号通知我们,然后我们调用信号处理函数,在信号函数里可以调用recv
-
:one:阻塞IO
:!:套接口缓冲区为内核空间,而我们定义的buf字符数组是用户空间