两副图让你彻底明白同步IO和异步IO的区别

本文探讨了Node.js采用单线程异步IO架构的原因。通过对比同步与异步IO处理方式,在面对IO密集型任务时,异步单线程模型能够更高效地利用资源,实现高并发。

众所周知,NodeJs采用的事单线程异步式IO的架构,并且是事件驱动的。

假设我们有一项工作,有两个计算部分,一个IO部分,IO部分占用的时间比计算时间多得多,如果我们使用同步式IO,那我们想要实现高并发必须开多个线程。

而使用异步,单线程即可胜任。

在串口通信中,**同步IO****异步IO**是两种不同的数据传输机制,它们在数据处理方式、资源利用效率以及程序响应能力上存在显著差异。 ### 同步IO 同步IO操作是指在数据传输过程中,调用者必须等待操作完成才能继续执行。这意味着在IO操作进行期间,程序会处于阻塞状态,直到数据读取或写入完成。在串口通信中,同步IO通常适用于数据量较小且对实时性要求不高的场景。例如,使用`ReadFile``WriteFile`函数进行串口通信时,若未设置`FILE_FLAG_OVERLAPPED`标志,则为同步IO操作,程序会等待数据传输完成后再继续执行后续操作[^5]。 示例代码如下: ```c #include <windows.h> #include <stdio.h> void SyncSerialRead(LPCTSTR portName) { HANDLE hSerial = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hSerial == INVALID_HANDLE_VALUE) { printf("Error opening serial port.\n"); return; } char buffer[256]; DWORD bytesRead; if (ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)) { printf("Received data: %.*s\n", bytesRead, buffer); } else { printf("Error reading from serial port.\n"); } CloseHandle(hSerial); } ``` ### 异步IO 异步IO操作则允许程序在数据传输过程中继续执行其他任务,而不需要等待IO操作完成。操作系统会在IO操作完成后通知程序,从而提高了程序的响应能力资源利用率。在Windows平台,通过设置`FILE_FLAG_OVERLAPPED`标志并使用`ReadFile``WriteFile`函数,可以实现串口通信的异步IO操作。异步IO特别适用于需要处理大量数据或对实时性要求较高的应用场景。 示例代码如下: ```c #include <windows.h> #include <stdio.h> void AsyncSerialRead(LPCTSTR portName) { HANDLE hSerial = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if (hSerial == INVALID_HANDLE_VALUE) { printf("Error opening serial port.\n"); return; } char buffer[256]; DWORD bytesRead; OVERLAPPED overlapped = {0}; overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, &overlapped)) { if (GetLastError() == ERROR_IO_PENDING) { WaitForSingleObject(overlapped.hEvent, INFINITE); if (GetOverlappedResult(hSerial, &overlapped, &bytesRead, FALSE)) { printf("Received data: %.*s\n", bytesRead, buffer); } else { printf("Error getting overlapped result.\n"); } } else { printf("Error initiating read operation.\n"); } } CloseHandle(overlapped.hEvent); CloseHandle(hSerial); } ``` ### 区别总结 - **数据处理方式**:同步IO在数据传输过程中阻塞程序执行,而异步IO允许程序在数据传输过程中继续执行其他任务。 - **资源利用率**:同步IO在数据传输期间占用资源较多,而异步IO通过非阻塞方式提高了资源利用率。 - **程序响应能力**:同步IO可能导致程序响应延迟,而异步IO提高了程序的响应能力实时性。 - **实现复杂度**:同步IO实现简单,而异步IO需要额外的机制(如事件对象)来管理IO操作的完成通知,实现相对复杂。 ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值