文件描述符

select模型的原理、优点、缺点

时光怂恿深爱的人放手 提交于 2020-02-25 00:34:53
关于I/O多路复用: I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一 个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不 做纯返回-1和EAGAIN的无用功。写操作类似。操作系统的这个功能通过select/poll/epoll之类的系统调用来实现,这些函数都可以同时 监视多个描述符的读写就绪状况,这样,**多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“复用”指的是复用 同一个线程。 I/O复用之select 1、介绍: select系统调用的目的是:在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常事件。poll和select应该被归类为这样的系统 调用,它们可以阻塞地同时探测一组支持非阻塞的IO设备,直至某一个设备触发了事件或者超过了指定的等待时间——也就是说它们的职责不是做IO,而是帮助 调用者寻找当前就绪的设备。 下面是select的原理图: 2 、select系统调用API如下: #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int

I/O多路复用模型之select(一)

淺唱寂寞╮ 提交于 2020-02-23 15:18:45
原理: select函数会等待,直到描述符句柄中有可用资源(可读、可写、异常)时返回,返回值是可用资源(可读/可写/异常等)描述符的个数(>0),0代表超时,-1代表错误。具体到内核大致是:当应用程序调用select() 函数, 内核就会相应调用 poll_wait(), 把当前进程添加到相应设备的等待队列上,然后将该应用程序进程设置为睡眠状态。直到该设备上的数据可以获取,然后调用wake_up()唤醒该应用程序进程。select每次轮训都会遍历所有描述符句柄。 函数接口: int select(int max_fd,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout); max_fd :fd+1 readfds :可读描述符句柄 writefds :可写描述符句柄 exceptfds:异常描述符句柄 timeout :超时时间 select函数的参数将告诉内核: (1)我们所关心的对应描述符句柄 (2)对于每个描述符我们所关心的条件,是否可读,是否可写或是否异常 (3)希望等待多长时间,struct timeval * timeout struct timeval{ long tv_sec; /*秒 */ long tv_usec; /*微秒 */ } timeout ==

python中的select模块

本秂侑毒 提交于 2020-02-22 15:26:25
介绍: Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统) select方法: 进程指定内核监听哪些文件描述符(最多监听1024个fd)的哪些事件,当没有文件描述符事件发生时,进程被阻塞;当一个或者多个文件描述符事件发生时,进程被唤醒。 当我们调用select()时:   1 上下文切换转换为内核态   2 将fd从用户空间复制到内核空间   3 内核遍历所有fd,查看其对应事件是否发生   4 如果没发生,将进程阻塞,当设备驱动产生中断或者timeout时间后,将进程唤醒,再次进行遍历   5 返回遍历后的fd   6 将fd从内核空间复制到用户空间 fd:file descriptor 文件描述符 fd_r_list, fd_w_list, fd_e_list = select.select(rlist, wlist, xlist, [timeout]) 参数: 可接受四个参数(前三个必须)rlist: wait until ready for readingwlist: wait until ready for writingxlist: wait for an “exceptional condition

python中os模块中文帮助

佐手、 提交于 2020-02-22 02:22:24
python中os模块中文帮助文档 文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8,个人博客: http://butlandblog.appspot.com/ 注此模块中关于unix中的函数大部分都被略过,翻译主要针对WINDOWS,翻译速度很快,其中很多不足之处请多多包涵。 这个模块提供了一个轻便的方法使用要依赖操作系统的功能。 如何你只是想读或写文件,请使用open() ,如果你想操作文件路径,请使用os.path模块,如果你想在命令行中,读入所有文件的所有行,请使用 fileinput模块。使用tempfile模块创建临时文件和文件夹,更高级的文件和文件夹处理,请使用shutil模块。 os.error 内建OSError exception的别名。 os.name 导入依赖操作系统模块的名字。下面是目前被注册的名字:'posix', 'nt', 'mac', 'os2', 'ce', 'java', 'riscos'. 下面的function和data项是和当前的进程和用户有关 os.environ 一个mapping对象表示环境。例如,environ['HOME'] ,表示的你自己home文件夹的路径(某些平台支持,windows不支持) ,它与C中的getenv("HOME")一致。

文件IO之多路复用-poll

回眸只為那壹抹淺笑 提交于 2020-02-21 06:55:47
1.函数原型 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout) 参数1:多个文件描述符的集合,为一个数组指针 struct pollfd{ int fd; // 文件描述符 short events; // 期望监控的文件描述符事件:PLLIN,PLLOUT,PLLERR short revents; // 事件结果:PLLIN,PLLOUT,PLLERR }; 参数2:被监控的文件描述符的个数 参数3:监控的时间,单位为ms,负数表示-无限监控 返回值:负-出错,正-监控到有效事件,0-监控时间到。 2.用法-应用程序中怎么调用poll a.打开要监控的文件,并保存文件描述符到struct follfd fds[]数组中。并将要监控的文件描述符信息填到 fds[]数组中。 struct follfd fds[2]; // 建立要监控的文件描述符数组 // 初始化数组,将要监控的文件描述符信息填入数组。 fds[0].fd = STDIN //打开的文件描述符 fds[0].event = POLLIN //监听的事件 fds[1].fd = STDERR //打开的文件描述符 fds[1].event = POLLIN //监听的事件 b.调用poll函数 int ret = poll

I/O多路复用

半城伤御伤魂 提交于 2020-02-21 05:44:51
I/O多路复用是这样一种机制:通过一个进程去监视多个文件描述符,一旦其中某个描述符就绪(通常是读就绪或者写就绪),就去通知程序进行相应的读或写操作,如果始终没有描述符就绪,则一直阻塞直到超时。 目前支持I/O多路复用的常见系统调用有select、poll和epoll。注意,这三者本质上还是属于同步I/O。 一、select select函数监视的文件描述符有三类,分别是readset、writeset和exceptset。调用该函数后,函数就处于阻塞状态,直到有描述符就绪(有数据可读、可写、异常),或者超时,这时函数返回后,就可以通过遍历数据结构fd_set来找到已就绪的文件描述符。函数原型如下: //若有就绪描述符则返回其数目,若超时则返回0,若出错则返回-1 int select( int maxfdpl, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout); 在连接的文件描述符数量不大时,select函数性能是可以的,但是一旦描述符数量过大,而实际活跃的描述符数量又极少时,性能就有问题了。所以select函数一般有以下几个缺点: 每次调用select都需要把所有的fd从用户态拷贝到内核态,当fd很多时开销比较大;

IO 多路转接 epoll

☆樱花仙子☆ 提交于 2020-02-20 01:15:28
read 函数返回值 >0 :实际读到的字节数 =0 :socket中,表示对端关闭 close() -1 : 如果errno = EINTR 被异常中断。需要重启。 如果errno =EAGIN 或 EWOULDBLOCK 以非阻塞的方式读数据,但是没有数据。需要再次读 如果errno = ECONNRESET 说明连接被重置。需要close()。 移除监听队列 错误 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 * soft nofile 65536 -->设置默认值 可以直接借助命令修改【注销用户 使其生效】 * hard nofile 100000 --》命令修改上限 命令修改: ulimit -n 21000 突破 1024 文件描述符限制 cat /proc/sys/fs/file-max 当前计算机能打开的最大文件个数。受硬件影响 ulimit -a -->当前用户下的进程。默认打开文件件描述符个数 缺省 为 1024 修改: 打开 sudo vi /etc/security/limits.conf 写入 *

IO 多路转接 select

痴心易碎 提交于 2020-02-19 00:52:40
TCP状态时序图: 1.主动发起连接请求端: CLOSE --发送SYN--SEND_SYN --接受 ACK、SYN --SEND_SYN--发送 ACK --ESTABLISHED(数据通信状态) 2.主动关闭连接请求端; ESTABLISHED(数据通信状态) --发送FIN --FIN_WAIT_1 --接受 ACK --FIN_WAIT_2(半关闭) --接受对端发送 FIN --FIN_WAIT_2(半关闭) --回发 ACK --TIME_WAIT(只有主动关闭连接方会经历该状态) -- 等 2MLS时长(大约40s) --CLOSE 3.被动接受连接请求端: CLOSE -- LISTEN --接收 SYN -- LISTEN --发送 ACK SYN --SYN_RCVD --接收ACK --ESTABLISHED 4.被动关闭连接请求端: ESTABLISHED -- 接收 FIN --ESTABLISHED --发送ACK --CLOSE_WAIT (说明对端【主动关闭连接请求端】处于半关闭状态) --发送 FIN--LASK_ACK --接收ACK--CLOSE 重点记忆: ESTABLISHED 、FIN_WAIT_2 <->CLOSE_WAIT 、TIME_WAIT(2MLS) 2MLS时长: 一定出现在 主动关闭连接请求端 ---TIME_WAIT

linux网络编程IO模型

为君一笑 提交于 2020-02-18 22:25:37
同步与异步 : 同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成。 异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了,异步一般使用状态、通知和回调。 阻塞与非阻塞 阻塞是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。 非阻塞是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 五种IO模型 对于一次IO访问,数据会先被拷贝到内核的缓冲区中,然后才会从内核的缓冲区拷贝到应用程序的地址空间。需要经历两个阶段: 1. 准备数据 2. 将数据从内核缓冲区拷贝到进程地址空间 由于存在这两个阶段,Linux产生了下面五种IO模型。 阻塞IO 当用户进程调用了recvfrom调用时,内核进入IO的第一个阶段:准备数据(内核需要等待足够的数据再拷贝),这个过程需要等待,用户进程会被阻塞,等内核将数据准备好,然后拷贝到用户地址空间,内核返回结果,用户进程才从阻塞态进入就绪态。 Linux中,默认情况下所有的socket都是阻塞的。 非阻塞IO 当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会block用户进程,而是立刻返回一个error。用户进程判断结果是一个error时,它就知道数据还没有准备好

Linux网络编程-IO复用技术

爷,独闯天下 提交于 2020-02-18 22:25:16
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了。Linux中,提供了select、poll、epoll三种接口函数来实现IO复用。 1、select函数 #include <sys/select.h> #include <sys/time.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); // 返回:若有就绪描述符则为其个数,超时为0,出错-1 nfds参数指定了被监听文件描述符的个数,通常设置为监听的所有描述符最大值加1,因为文件描述符是从0开始的。readfs、writefds和exceptfds分别对应可读、可写和异常等事件文件描述符集合,当调用select时,通过这3个参数传入自己感兴趣的文件描述符,select函数返回后,内核通过修改他们来通知应用程序那些文件描述符已经就绪。 fd_set结构体包含一个整形数组,该数组中每一个元素的每一位标记一个文件描述符,fd_set容纳的文件描述符数量由FD_SETSIZE指定,这就限制了select能同时处理的文件描述符最大个数