传统IO
传统的 I/O 数据传输是指在计算机系统中,使用输入/输出(I/O)操作进行数据传输的一种方式。这种方式通常涉及将数据从内存传输到外部设备(如磁盘、网络等)或从外部设备传输到内存。传统的 I/O 数据传输通常采用阻塞式的方式,即在进行数据传输时会阻塞当前的线程或进程,直到数据传输完成或发生错误。
在传统的 I/O 数据传输中,通常会涉及以下几个关键概念:
-
文件 I/O: 文件 I/O 是指通过文件操作进行数据传输,包括读取和写入文件。传统的文件 I/O 操作通常是阻塞的,读写操作会等待数据从文件中读取或写入完成。
-
网络 I/O: 网络 I/O 是指通过网络进行数据传输,包括从网络中读取数据或将数据写入网络。在传统的网络编程中,通常也会使用阻塞的方式进行数据传输,例如使用传统的 Socket 编程。
-
阻塞式 I/O: 阻塞式 I/O 是指在进行数据传输时,调用线程会被阻塞,直到数据传输操作完成或发生错误。这意味着在数据传输期间,线程无法执行其他任务。
-
同步 I/O: 同步 I/O 是指数据传输的操作需要调用线程等待数据传输完成,然后再继续执行后续操作。
传统的 I/O 数据传输方式在一些场景下可能会存在性能问题,特别是在高并发的情况下,阻塞式的方式可能导致线程阻塞,影响系统的吞吐量和响应性能。为了解决这些问题,后来引入了非阻塞 I/O、多线程、异步编程等技术,以提升系统的性能和并发能力。
传统的数据传输
CPU拷贝/ DMA拷贝
CPU 拷贝和 DMA 拷贝是在计算机系统中用于数据传输的两种不同方式:
-
CPU 拷贝(CPU Copy): 在 CPU 拷贝中,数据的传输是由中央处理器(CPU)直接进行的。当数据需要从一个内存区域拷贝到另一个内存区域时,CPU 首先将数据从源内存区域读取到 CPU 寄存器,然后再将数据从寄存器写入到目标内存区域。这个过程需要 CPU 的直接参与,因此称为 CPU 拷贝。CPU 拷贝的过程涉及多次读取和写入操作,较为耗时,特别是在大数据量传输时。
-
DMA 拷贝(Direct Memory Access Copy): 在 DMA 拷贝中,数据的传输是通过 DMA 控制器进行的,而不需要 CPU 的直接参与。DMA 控制器是一种硬件设备,它能够在 CPU 不直接参与的情况下,将数据从一个内存区域传输到另一个内存区域。在 DMA 拷贝中,CPU 将传输的任务交给 DMA 控制器,然后 DMA 控制器直接控制数据在内存之间的传输,减少了 CPU 的负担和参与,提高了数据传输的效率。DMA 拷贝通常用于大数据量的传输,可以有效减少 CPU 的拷贝操作,提高传输速度。
总结起来,CPU 拷贝是指数据传输需要通过 CPU 进行读取和写入操作,而 DMA 拷贝是指数据传输通过 DMA 控制器直接进行,减少了 CPU 的介入。在性能敏感的场景中,DMA 拷贝通常比 CPU 拷贝更高效。
上下文切换 用户态与内核态切换
在操作系统中,从用户态切换到内核态(核心态)以及从内核态切换回用户态是操作系统进行上下文切换的过程,涉及到处理器的特权级变更和寄存器保存与恢复。这些切换是为了保护操作系统和应用程序的稳定性和安全性,同时允许内核执行特权指令。
-
从用户态切换到内核态:
当应用程序执行特权级操作(例如系统调用、硬件中断处理、异常处理等)时,需要从用户态切换到内核态。以下是从用户态切换到内核态的基本步骤:-
触发切换请求: 应用程序通过系统调用或其他方式触发特权级操作的请求。
-
硬件响应: 处理器检测到特权级操作的请求,触发硬件中断或异常。
-
保存用户态上下文: 处理器将应用程序的用户态上下文(寄存器值、程序计数器等)保存到内核态的堆栈或内存区域。
-
切换到内核态: 处理器切换到内核态,将特权级提升为内核态,并跳转到内核态的处理程序(例如中断处理程序)。
-
执行内核态操作: 内核态的处理程序执行相应的操作,可能包括对资源的访问、状态更新等。
-
恢复用户态上下文: 处理器从内核态返回时,将之前保存的用户态上下文从堆栈或内存中恢复,使应用程序继续执行。
-
-
从内核态切换回用户态:
当内核态的操作完成后,需要将处理器从内核态切换回用户态,使应用程序继续执行。以下是从内核态切换回用户态的基本步骤:-
保存内核态上下文: 内核态处理程序将内核态的上下文(寄存器值、状态等)保存到内核堆栈或内存中。
-
切换到用户态: 处理器切换回用户态,将特权级降低为用户态,并跳转到之前用户态的执行位置。
-
恢复用户态上下文: 处理器从用户态返回时,将之前保存的用户态上下文从堆栈或内存中恢复,使应用程序继续执行。
-
需要注意的是,上下文切换是一种开销较大的操作,因为涉及到寄存器值的保存和恢复,以及特权级的变更。在多任务操作系统中,频繁的上下文切换可能会影响系统性能。
零拷贝机制
零拷贝(Zero-Copy)是一种数据传输和处理的优化技术,旨在减少数据在系统内部的复制次数,从而提高数据传输的效率和性能。在传统的数据传输过程中,数据需要在不同的内存区域之间进行多次复制,这会消耗CPU和内存带宽,降低系统性能。零拷贝技术通过最小化或消除这些复制操作来提升性能。
在零拷贝技术中,主要有以下几种关键思想和机制:
-
用户空间和内核空间共享内存: 零拷贝技术允许用户空间和内核空间共享同一块内存区域,这样数据可以直接在内核和用户空间之间传递,避免了复制的开销。
-
直接内存访问(DMA): 零拷贝技术使用DMA来实现数据传输,DMA允许外设(如网络适配器、磁盘控制器等)直接访问系统内存,而不需要CPU的干预。这样数据可以在内存和外设之间直接传递,减少CPU拷贝的步骤。
-
文件描述符传递: 零拷贝技术允许在不同的进程之间传递文件描述符,而不是传递实际的数据。这样可以避免数据的多次复制,同时在不同进程间共享同一块内存区域。
-
内核空间的数据复制: 零拷贝技术允许内核空间进行一些数据的复制操作,但这些复制操作是在内核空间内进行的,不会涉及到用户空间,从而减少了用户空间到内核空间的切换。
零拷贝技术在各种场景中都有应用,特别是在高性能网络传输、文件系统操作和数据库访问等方面。它可以显著提升数据传输的效率,降低系统的资源消耗,从而改善系统的性能。一些常见的应用包括网络数据传输、文件的读写和数据库查询等。
零拷贝技术的目标是尽可能减少数据在系统内部的复制次数,从而提高数据传输的效率和性能。虽然零拷贝可以减少或避免某些复制操作,但并不是绝对不需要拷贝过程。
欢迎关注个人公众号: 程序员路同学,分享架构师全栈技术栈