阻塞、非阻塞、同步、异步
IO读取数据分为两个阶段,第一个阶段是内核准备好数据,第二个阶段是内核把数据从内核态拷贝到用户态。 阻塞IO是当用户调用 read 后,用户线程会被阻塞,等内核数据准备好并且数据从内核缓冲区拷贝到用户态缓存区后, read 才会返回。阻塞IO是两个阶段都会阻塞,没有数据时也会阻塞。 非阻塞IO是调用read后,如果没有数据就立马返回,通过不断轮询的方式去调用read,直到数据被拷贝到用户态的应用程序缓冲区,read请求才获取到结果。非阻塞IO阻塞的是第二个阶段,第一阶段没有数据时不会阻塞,第二阶段等待内核把数据从内核态拷贝到用户态的过程中才会阻塞。 同步 IO是应用程序发起一个 IO 操作后,必须等待内核把 IO 操作处理完成后才返回。无论 read 是阻塞 I/O,还是非阻塞 I/O, 都是同步调用,因为在 read 调用时,第二阶段内核将数据从内核空间拷贝到用户空间的过程都是需要等待的。 异步 IO应用程序发起一个 IO 操作后,调用者不能立刻得到结果,而是在内核完成 IO 操作后,通过信号或回调来通知调用者。异步 I/O 是内核数据准备好和数据从内核态拷贝到用户态这两个过程都不用等待。 总结一下,只有同步才有阻塞和非阻塞之分,异步必定是非阻塞的。
select、poll、epoll
select, poll和epoll都是I/O多路复用技术,它们用于同时处理多个I/O操作,特别是在高并发网络编程中。
select
select是最早的I/O多路复用技术,它可以同时监视多个文件描述符(file descriptor, FD)的I/O状态(如可读、可写、异常等)。select函数使用一个文件描述符集合(通常是一个位图)来表示要监视的文件描述符,当有I/O事件发生时,select会返回对应的文件描述符集合。
select的主要限制如下:
- 文件描述符数量限制:
select使用一个位图来表示文件描述符集合,这限制了它能够处理的文件描述符数量(通常是1024个)。 - 效率问题:当文件描述符数量较大时,
select需要遍历整个文件描述符集合来查找就绪的文件描述符,这会导致较低的效率。 - 非实时性:每次调用
select时,需要重新设置文件描述符集合,这会增加函数调用的开销。
poll
poll是为了克服select的限制而引入的一种I/O多路复用技术。poll使用一个文件描述符数组(通常是一个结构体数组)来表示要监视的文件描述符。与select类似,poll可以监视多个文件描述符的I/O状态。
poll的优点如下:
- 文件描述符数量不受限制:由于
poll使用一个动态数组来表示文件描述符,因此它可以处理任意数量的文件描述符。 - 效率相对较高:
poll在查找就绪的文件描述符时,只需要遍历实际使用的文件描述符数组,而不是整个文件描述符集合。
然而,poll仍然存在一些问题:
- 效率问题:尽管
poll相对于select具有较高的效率,但当文件描述符数量很大时,它仍然需要遍历整个文件描述符数组。 - 非实时性:与
select类似,每次调用poll时,需要重新设置文件描述符数组。
epoll
epoll是Linux特有的一种高效I/O多路复用技术,它克服了select和poll的主要限制。epoll使用一个事件驱动(event-driven)的方式来处理I/O操作,它只会返回就绪的文件描述符,而不是遍历整个文件描述符集合。
epoll的主要优点如下:
- 高效:
epoll使用事件驱动的方式来处理I/O操作,因此它在处理大量文件描述符时具有很高的效率。当有I/O事件发生时,epoll可以立即得到通知,而无需遍历整个文件描述符集合。这使得epoll在高并发场景中具有更好的性能。 - 可扩展性:与
poll类似,epoll可以处理任意数量的文件描述符,因为它使用一个动态数据结构来表示文件描述符。 - 实时性:
epoll使用一个内核事件表来记录要监视的文件描述符和事件,因此在每次调用epoll时无需重新设置文件描述符集合。这可以减少函数调用的开销,并提高实时性。
epoll具有诸多优点,但它目前仅在Linux平台上可用。对于其他平台,可能需要使用类似的I/O多路复用技术,如BSD中的kqueue。
总结:select是最早的I/O多路复用技术,但受到文件描述符数量和效率方面的限制。poll克服了文件描述符数量的限制,但仍然存在一定的效率问题。epoll是一种高效的I/O多路复用技术,尤其适用于高并发场景,但它仅在Linux平台上可用。一般来说,epoll的效率是要比select和poll高的,但是对于活动连接较多的时候,由于回调函数触发的很频繁,其效率不一定比select和poll高。所以epoll在连接数量很多,但活动连接较小的情况性能体现的比较明显。
进程同步互斥通信,线程同步互斥通信
进程的同步、互斥、通信的区别,进程与线程同步的区别-腾讯云开发者社区-腾讯云 (tencent.com)
硬链接和软链接有什么区别?
在 Linux/类 Unix 系统上,文件链接(File Link)是一种特殊的文件类型,可以在文件系统中指向另一个文件。常见的文件链接类型有两种:
1、硬链接(Hard Link)
- 在 Linux/类 Unix 文件系统中,每个文件和目录都有一个唯一的索引节点(inode)号,用来标识该文件或目录。硬链接通过 inode 节点号建立连接,硬链接和源文件的 inode 节点号相同,两者对文件系统来说是完全平等的(可以看作是互为硬链接,源头是同一份文件),删除其中任何一个对另外一个没有影响,可以通过给文件设置硬链接文件来防止重要文件被误删。
- 只有删除了源文件和所有对应的硬链接文件,该文件才会被真正删除。
- 硬链接具有一些限制,不能对目录以及不存在的文件创建硬链接,并且,硬链接也不能跨越文件系统。
- ln 命令用于创建硬链接。
2、软链接(Symbolic Link 或 Symlink)
- 软链接和源文件的 inode 节点号不同,而是指向一个文件路径。
- 源文件删除后,软链接依然存在,但是指向的是一个无效的文件路径。
- 软连接类似于 Windows 系统中的快捷方式。
- 不同于硬链接,可以对目录或者不存在的文件创建软链接,并且,软链接可以跨越文件系统。
- ln -s 命令用于创建软链接。