Linux io는 파일 작업을 의미합니다. Linux에서 파일은 일련의 바이너리 스트림입니다. 정보 교환 중에 우리는 모두 이러한 스트림에서 데이터 전송 및 수신 작업을 수행합니다. ; Linux는 가상 메모리 메커니즘을 사용하므로 IO 작업을 완료하려면 시스템 호출을 통해 커널을 요청해야 합니다.
이 튜토리얼의 운영 환경: linux5.9.8 시스템, Dell G3 컴퓨터.
리눅스 IO는 무엇을 의미하나요?
우리 모두는 Linux 세계에서는 모든 것이 파일이라는 것을 알고 있습니다.
그리고 파일은 소켓, FIFO, 파이프 또는 터미널에 관계없이 일련의 이진 스트림입니다. 우리에게는 모든 것이 스트림입니다.
정보 교환 과정에서 우리 모두는 이러한 스트림에서 데이터 전송 및 수신 작업을 수행하는데, 이를 I/O 작업이라고 합니다.
스트림에서 데이터를 읽고, 시스템이 데이터 읽기, 쓰기를 호출하고, 시스템이 쓰기를 호출합니다.
일반적으로 사용자 프로세스의 전체 IO는 두 단계로 나뉩니다.
디스크 IO:
네트워크 IO:
운영 체제와 드라이버는 커널 공간에서 실행됩니다. 사용자 공간에서 실행되는 애플리케이션은 포인터를 사용하여 데이터를 전송할 수 없습니다. Linux에서 사용하는 가상 메모리 메커니즘은 IO 작업을 완료하기 위해 시스템 호출을 통해 커널을 요청해야 하기 때문입니다.
IO에는 메모리 IO, 네트워크 IO, 디스크 IO의 세 가지 유형이 있습니다. 일반적으로 IO에 관해 이야기할 때는 후자의 두 가지를 언급합니다!
IO 모델이 필요한 이유
동기를 사용하여 통신하면 모든 작업이 스레드에서 순차적으로 실행됩니다. 이것의 단점은 다음과 같습니다.
IO 모델이 나타나야 합니다.
Linux IO 모델을 설명하기 전에 먼저 Linux 시스템 데이터를 읽는 프로세스를 이해해 보겠습니다.
index.html 파일을 요청하는 사용자를 예로 들어
사용자 공간 및 커널 공간
운영 체제의 핵심은 커널입니다. 커널은 일반 응용 프로그램과 독립적이며 보호된 메모리 공간에 액세스할 수 있고 기본 하드웨어 장치에 액세스할 수 있는 모든 권한도 갖습니다.
프로세스 전환
프로세스 실행을 제어하려면 커널에는 CPU에서 실행 중인 프로세스를 일시 중지하고 이전에 일시 중지된 프로세스의 실행을 재개할 수 있는 기능이 있어야 합니다.
이 동작을 프로세스 전환이라고 합니다.
그러므로 모든 프로세스는 운영 체제 커널의 지원을 받아 실행되며 커널과 밀접한 관련이 있다고 말할 수 있습니다.
프로세스 차단
시스템 리소스 요청 실패, 특정 작업 완료 대기, 새 데이터가 아직 도착하지 않았거나 수행할 새 작업 없음 등 특정 예상 이벤트가 발생하지 않아 실행 프로세스 ., 시스템에 의해 차단됩니다. 차단 프리미티브(Block)를 자동으로 실행하여 실행 상태에서 차단 상태로 변경됩니다.
프로세스 차단은 프로세스 자체의 활성 동작이므로 실행 상태(CPU 획득)에 있는 프로세스만 차단 상태로 전환할 수 있음을 알 수 있습니다.
프로세스가 차단 상태에 들어가면 CPU 리소스를 점유하지 않습니다.
파일 설명자
파일 설명자(File Descriptor)는 컴퓨터 과학의 용어로 파일에 대한 참조를 표현하는 데 사용되는 추상적인 개념입니다.
파일 설명자는 공식적으로 음수가 아닌 정수입니다. 실제로는 각 프로세스에 대해 커널이 유지 관리하는 프로세스에서 열린 파일의 레코드 테이블을 가리키는 인덱스 값입니다.
캐시된 IO
대부분의 파일 시스템에 대한 기본 IO 작업은 캐시된 IO입니다.
읽고 쓰기 과정은 다음과 같습니다.
읽기 작업: 운영 체제는 커널 버퍼에 필요한 데이터가 있는지 확인합니다. 캐시된 경우 캐시에서 직접 반환되며, 그렇지 않으면 디스크, 네트워크 카드 등에서 읽혀집니다. ., 운영 체제에 캐시됨 캐시에서
쓰기 작업: 데이터를 사용자 공간에서 커널 공간의 캐시로 복사합니다. 이때, 사용자 프로그램에 대한 쓰기 작업은 완료된 상태이며, 디스크, 네트워크 카드 등에 언제 쓸 것인지는 sync 동기화 명령이 명시적으로 호출되지 않는 한 운영체제에 의해 결정됩니다.
커널 공간 캐시에 필요한 데이터가 없다고 가정하면 사용자 프로세스는 두 단계로 디스크나 네트워크에서 데이터를 읽습니다.
1단계: 커널 프로그램은 디스크나 네트워크에서 데이터를 읽습니다. 카드 등을 커널 공간 캐시 영역으로 ;
2단계: 사용자 프로그램이 커널 공간 캐시의 데이터를 사용자 공간으로 복사합니다.
캐시된 IO의 단점:
데이터는 전송 프로세스 중에 애플리케이션 주소 공간과 커널 공간에 여러 번 복사되어야 합니다. 이러한 데이터 복사 작업으로 인해 발생하는 CPU 및 메모리 오버헤드가 매우 큽니다.
사용자 공간 응용 프로그램은 시스템 호출을 실행하여 데이터가 준비될 때까지 응용 프로그램을 차단하고 아무 작업도 하지 않게 하며, 데이터는 커널에서 사용자 프로세스로 복사되고 마지막으로 프로세스가 데이터를 처리합니다. 데이터를 기다리는 단계와 데이터를 처리하는 단계에서는 전체 프로세스가 차단되어 다른 네트워크 IO를 처리할 수 없습니다.
이것은 또한 가장 간단한 IO 모델이기도 하며 일반적으로 FD가 적고 준비가 빠른 경우 사용하는 데 문제가 없습니다.
비차단 시스템 호출이 호출된 후 프로세스는 차단되지 않으며, 데이터가 준비되지 않은 경우 커널은 즉시 프로세스로 복귀합니다. 시간.
프로세스가 반환된 후 시스템 호출을 하기 전에 다른 작업을 수행할 수 있습니다.
위 과정을 반복하면서 한 주기로 시스템 콜을 하게 됩니다. 이 프로세스를 흔히 폴링이라고 합니다.
폴링은 데이터가 준비될 때까지 커널 데이터를 확인한 다음 데이터 처리를 위해 프로세스에 데이터를 복사합니다.
데이터를 복사하는 전체 과정 동안 해당 프로세스가 여전히 차단된다는 점에 유의해야 합니다.
이런 식으로 프로그래밍에서 소켓에 O_NONBLOCK
을 설정할 수 있습니다. O_NONBLOCK
即可。
IO多路复用,这是一种进程预先告知内核的能力,让内核发现进程指定的一个或多个IO条件就绪了,就通知进程。
使得一个进程能在一连串的事件上等待。
IO复用的实现方式目前主要有Select、Poll和Epoll。
伪代码描述IO多路复用:
while(status == OK) { // 不断轮询 ready_fd_list = io_wait(fd_list); //内核缓冲区是否有准备好的数据 for(fd in ready_fd_list) { data = read(fd) // 有准备好的数据读取到用户缓冲区 process(data) }}
首先我们允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。
当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
流程如下:
开启套接字信号驱动IO功能
系统调用Sigaction执行信号处理函数(非阻塞,立刻返回)
数据就绪,生成Sigio信号,通过信号回调通知应用来读取数据
此种IO方式存在的一个很大的问题:Linux中信号队列是有限制的,如果超过这个数字问题就无法读取数据
异步IO流程如下所示:
当用户线程调用了aio_read
일련의 이벤트를 기다리는 프로세스를 활성화합니다.
의사 코드는 IO 다중화를 설명합니다.rrreee
신호 드라이버🎜먼저 소켓이 신호 기반 IO를 수행하고 신호 처리 기능을 설치하도록 허용합니다. 프로세스는 차단 없이 계속 실행됩니다. 🎜🎜데이터가 준비되면 프로세스는 SIGIO 신호를 수신하고 신호 처리 함수에서 I/O 작업 함수를 호출하여 데이터를 처리할 수 있습니다. 🎜🎜🎜프로세스는 다음과 같습니다. 🎜🎜🎜🎜🎜소켓 신호 드라이버 IO 기능 활성화 🎜🎜🎜🎜시스템은 Sigaction을 호출하여 신호 처리 기능(비차단, 즉시 반환)을 실행합니다. 🎜🎜🎜🎜데이터는 다음과 같습니다. 준비, Sigio 신호 생성 및 신호 전달 콜백 알림 애플리케이션은 데이터를 읽는 데 사용됩니다🎜🎜🎜🎜이 IO 방법에는 큰 문제가 있습니다. Linux의 신호 대기열이 이 숫자를 초과하면 데이터가 제한됩니다. 읽을 수 없습니다🎜🎜 h
비동기 비차단🎜🎜🎜비동기 IO 프로세스는 다음과 같습니다. 🎜🎜🎜🎜🎜사용자 스레드가
aio_read
시스템을 호출할 때 호출하면 즉시 다른 작업을 시작할 수 있으며 사용자 스레드는 차단되지 않습니다. 🎜🎜🎜🎜커널은 IO의 첫 번째 단계인 데이터 준비를 시작합니다. 커널은 데이터가 준비될 때까지 기다리면 커널 버퍼의 데이터를 사용자 버퍼로 복사합니다🎜🎜🎜🎜커널은 사용자 스레드에 신호를 보내거나 사용자 스레드가 등록한 콜백 인터페이스를 콜백하여 사용자 스레드에게 읽기 작업이 완료되었음을 알려줍니다🎜🎜🎜🎜사용자 스레드는 사용자 버퍼의 데이터를 읽고 후속 비즈니스 작업을 완료합니다🎜🎜🎜🎜🎜동기 IO에 비해 비동기 IO는 순차적으로 실행되지 않습니다. 🎜
사용자 프로세스가 aio_read
시스템 호출을 수행한 후에는 커널 데이터가 준비되었는지 여부에 관계없이 사용자 프로세스로 직접 반환되고 사용자 모드 프로세스는 다른 작업을 수행할 수 있습니다. . aio_read
系统调用之后,无论内核数据是否准备好,都会直接返回给用户进程,然后用户态进程可以去做别的事情。
等到数据准备好了,内核直接复制数据给进程,然后从内核向进程发送通知。
对比信号驱动IO,异步IO的主要区别在于:
异步IO又叫做事件驱动IO,在Unix中,为异步方式访问文件定义了一套库函数,定义了AIO的一系列接口。
aio_read
或者aio_write
发起异步IO操作,使用aio_error
신호 구동 IO와 비교할 때 비동기식 IO의 주요 차이점은 다음과 같습니다.
비동기 IO는 이벤트 중심 IO라고도 합니다. Unix에서는 파일에 대한 비동기 액세스를 위해 일련의 라이브러리 함수가 정의되고 일련의 AIO 인터페이스가 정의됩니다.
aio_read
또는 aio_write
를 사용하고, 실행 중인 IO의 상태를 확인하려면 aio_error
를 사용하세요. 작업. 현재 Linux에서 AIO의 커널 구현은 파일 IO에만 효과적입니다. 실제 AIO를 구현하려면 직접 구현해야 합니다.
현재 libevent, libev, libuv 등 많은 오픈 소스 비동기 IO 라이브러리가 있습니다.위 내용은 리눅스 io는 무슨 뜻인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!