Linux-计算机网络-探索epoll是同步阻塞的还是异步非阻塞的
一.同步与非同步
1.同步与非同步介绍
在计算机网络中,同步通信是收发双方按照同一时钟节拍工作,数据传输有严格的时序;非同步通信则没有统一时钟,发送方可以随时发送数据,接收方要根据起始位等信息来接收并处理数据。
2.优劣势分析
(1)异步式同步(简称异步)。异步数据传输不需要在收发两端间传输时钟信号,所以实现起来比较简单;但是传输效率较低(适用于低速数据传输系统)
(2)同步式同步(简称同步)。同步数据传输的传输效率高(适合于高速数据传输系统)收发双方需要建立同步时钟,实现和控制比较复杂。
二.阻塞与非阻塞
1.阻塞与非阻塞介绍
在计算机网络中,阻塞是指调用的进程或线程在等待某个操作(如数据接收或发送)完成期间被挂起,不能执行其他操作。非阻塞是指进程或线程在执行网络操作时,不管操作是否完成,都不会被挂起,可以去执行其他任务。
2.优劣势分析
阻塞的优点
(1) 易于编程 — 阻塞 socket 很易于编程。所有的用户代码都在一个地方,并且顺序排列。
(2) 跨平台 — 由于 Unix 使用阻塞 socket,便携式代码很好写。Indy 依靠这个事实来实现 它的单源代码跨平台能力。其他跨平台的 socket 组件通过内部使用阻塞调用来模拟非 阻塞行为。
(3) 多线程工作良好 — 由于阻塞 socket 的使用按照自然顺序,他们是可继承的封装,因 此很适合多线程。
(4) 不依赖消息 — 非阻塞 socket 依赖于 window 信息系统。当在多线程中使用时,分别的 信息序列要被创建。当不在多线程中使用时,处理多链接时很容易发生瓶颈情况。
阻塞的缺点
客户端用户界面"冻结" — 阻塞 socket 调用后直到完成任务才会返回。当这调用发生在应用 的主线程中时,主线程无法处理用户界面消息。这导致用户界面的"冻结"。冻结的发生是由 于直到阻塞 socket 调用返回控制应用程序的句柄前,更新,重绘和其他消息都无法被处理。
非阻塞的优点
(1) 客户端无用户界面"冻结" — 因为用户代码响应事件,Windows 在 socket 事件间拥有 控制权。因此,Windows 也可以答复其他 Windows 消息。
(2) 可以不用多线程的多任务 — 单线程可以处理许多 socket。
(3) 许多 socket 是轻量级的 — 因为许多 socket 可以被处理而不需要多线程,内存和 CPU 的占用通常很少。
非阻塞的缺点
编程更难 — 非阻塞要求使用轮询或者事件。由于轮询很没效率,事件更常用。使用事件要 求用户代码分成许多子过程因此需要状态追踪。这导致代码易于出 bug 并且难以维护。
三.分析epoll是同步阻塞的还是异步非阻塞的
- epoll采用事件驱动的方式。当有事件(如可读、可写事件)发生在被监控的文件描述符上时,内核会通过事件通知机制告知应用程序。应用程序在收到通知之前可以做其他事情,而不是像同步方式那样一直等待I/O操作完成。例如,一个服务器程序使用epoll监听多个客户端套接字,当某个客户端有数据可读时,内核会通知服务器程序,而服务器程序在没有收到通知时可以处理其他事务,比如进行数据的缓存清理或者其他客户端的请求预处理等。
- epoll可以和非阻塞I/O一起使用。在非阻塞模式下,当对文件描述符进行操作(如读取或写入)时,如果操作不能立即完成(例如没有数据可读或者缓冲区已满无法写入),函数不会阻塞等待,而是返回一个错误码(如EAGAIN或EWOULDBLOCK)。结合epoll,程序可以根据这个返回值决定是等待下一次事件通知还是进行其他操作。例如,在一个网络应用中,当使用epoll检测到一个套接字可写,但在实际写入时发现缓冲区已满,由于套接字是非阻塞的,写入操作不会阻塞,程序可以等待下一次可写事件通知,在此期间可以处理其他事件。
所以epoll是异步非阻塞的