Python下的Linux异步非阻塞IO

Linux根文件系统

Unix中有“一切皆文件”的抽象设计。例如串口、socket、tty终端、内存等资源都对应了文件(fs),用户可读写这些文件,能方便的用统一的“文件操作”来操作资源与其IO,这就是根文件系统rootFS(类似RESTful)

内存文件:Linux中有些目录是“内存文件系统”,其把内存中的数据以“目录/文件”的形式整理出来,并且挂载到文件系统上,对其读写意味着某些特定的操作。如/proc(进程文件系统)是内核中进程相关数据整理成的文件系统、/dev/mem是全物理内存的景象、/dev/shm是临时文件系统(tmpfs)可把文件直接放进内存

tty文件:即字符设备文件(通常在/dev/ttyXXX),是不同的串口/USB设备、运行时终端的对应文件。其历史上是串口打字机的设备文件,等到出现了微型计算机/键盘/GUI后,终端替换了打字机的等价位置,但是Linux仍保留了“打字机”文件(可简单理解为终端命令被翻译成打字机的串行输入,试试cat/echo它们)

socket文件:在内核外进行网络编程时,最底层也只能调用一些系统提供的库/函数。协议与数据实际大部分由OS完成,其把TCP/IP连接抽象为关于一组(IP,端口)的,这就是一个socket。另外OS和语言封装了一些数据处理相关API。Linux中的socket可通过内核封装的所谓文件描述符fd来把socket作为文件读写,另外Linux封装了本地进程间通讯的unix本地域socket。

*一些tcp/ip抓包调试工具:netcat(bash)、tcpdump(bash)、wireshark(GUI)

“用文件描述符(fd)打开socket”的实现:

 

Linux的文件IO:

阻塞IO:文件描述符fd可设为阻塞的,例如当read的数据未就绪时,进程把自己挂起(放弃时间片),待内核接收数据并把数据拷给程序后才解除阻塞(或是等待超时抛出异常),阻塞期间不会执行后续的“代码”

非阻塞IO:文件描述符fd也可设为非阻塞的,例如read时无论数据是否就绪,进程都直接返回。若此时没有结果则抛异常或返回-1,直接执行后续代码。然后可以通过编写代码轮询数据是否就绪

多路复用IO:即select/poll/epoll

异步IO(aio):例如Linux的aio_read,其定义了“收到数据后的动作”,不等程序接收到数据直接返回,当内核处理好数据后直接返回给程序,调用“收到数据后的动作”

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部