io_uring_0305
IO_URING Submission
Introduction - 소개
I/O 요청 제출(Submitting)은 일반적으로 다음과 같은 순서입니다.
struct io_uring_sqe *sqe = io_uring_get_sqe(ring);
/* Setup a readv operation */
io_uring_prep_readv(sqe, file_fd, fi->iovecs, blocks, 0);
/* Set user data */
io_uring_sqe_set_data(sqe, fi);
/* Finally, submit the request */
io_uring_submit(ring);
이 요약(snippet)은 'liburing'이 포함된 cat 예제에서 가져온 것입니다.
io_uring_get_sqe()를 호출하여 제출 대기열 항목 또는 SQE를 얻고,
io_uring_prep_readv() 또는 io_uring_prep_accept()와 같이 수행하려는 I/O 유형에 대한 제출 도우미 중 하나를 사용하고,
io_uring_sqe_set_data()를 호출하여 이 요청을 고유하게 식별하는 데이터 구조에 대한 포인터(완료 측에서 동일한 사용자 데이터를 다시 가져옴)를 지정하고,
마지막으로 io_uring_submit()을 호출하여 요청을 제출합니다.
io_uring_submit() 시스템 호출을 호출하지 않도록 폴링(주기적 확인)을 설정할 수도 있습니다.
📦 struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring)
이 함수는 I/O 작업을 제출하는 데 사용할 수 있는 제출 대기열 항목을 반환합니다.
io_uring_submit()을 호출하여 커널에 대기열에 있는 요청을 처리하라고 지시하기 전에 이 함수를 여러 번 호출하여 I/O 요청을 대기열에 넣을 수 있습니다.
⦿ Parameters
• ring: io_uring_queue_init()에 의해 설정된 io_uring 구조입니다.
⦿ Return value: 반환 값: 비어 있는 SQE를 나타내는 'io_uring_sqe'에 대한 포인터.
제출 큐가 가득 차면 NULL이 반환됩니다.
⦿ 참조
• io_uring low-level interface programming - https://unixism.net/loti/low_level.html#low-level
• cp utility with liburing - https://unixism.net/loti/tutorial/cp_liburing.html#cp-liburing
📦 void io_uring_sqe_set_data(struct io_uring_sqe *sqe, void *data)
이는 전달된 SQE 인스턴스의 사용자 데이터 필드를 설정하는 인라인 편의 함수입니다.
⦿ Parameters
• sqe: 사용자 데이터를 설정하려는 SQE 인스턴스입니다.
• data: 사용자 데이터에 대한 포인터.
📦 void io_uring_sqe_set_flags(struct io_uring_sqe *sqe, unsigned flags)
이는 전달된 SQE 인스턴스의 플래그 필드를 설정하는 인라인 편의 함수입니다.
⦿ Parameters
• sqe: 사용자 데이터를 설정하려는 SQE 인스턴스입니다.
• flags: 설정하려는 플래그. 비트맵 필드입니다.
다양한 SQE 플래그와 그 의미에 대해서는 io_uring_enter() 참조 페이지를 참조하세요.
https://unixism.net/loti/ref-iouring/io_uring_enter.html#io-uring-enter
📦 int io_uring_submit(struct io_uring *ring)
io_uring_get_sqe()를 통해 획득한 SQE를 커널에 제출합니다.
여러 I/O 요청을 설정하기 위해 io_uring_get_sqe()를 여러 번 호출한 후 이를 한 번 호출할 수 있습니다.
⦿ Parameters
• ring: io_uring_queue_init()에 의해 설정된 io_uring 구조입니다.
⦿ Return value: 제출된 SQE 수를 반환합니다.
⦿ 참조
• io_uring low-level interface programming - https://unixism.net/loti/low_level.html#low-level
• cp utility with liburing - https://unixism.net/loti/tutorial/cp_liburing.html#cp-liburing
📦 int io_uring_submit_and_wait(struct io_uring *ring, unsigned wait_nr)
io_uring_submit()과 동일하지만 대기할 완료 횟수를 지정할 수 있는 추가 매개변수 'wait_nr'을 사용합니다.
이 호출은 'wait_nr' 제출 요청이 커널에 의해 처리되고 해당 세부 정보가 완료 대기열에 배치될 때까지 차단됩니다.
⦿ Parameters
• wait_nr: 대기할 완료 횟수입니다.
⦿ Return value: 제출된 SQE 수를 반환합니다.
Submission helpers - 제출 도움 함수들
제출 도우미(Submission helpers)는 SQE를 통해 요청하려는 I/O 작업을 쉽게 지정할 수 있는 편리한 기능입니다. 지원되는 I/O 유형당 하나의 기능이 있습니다.
📦 file descriptor: 파일 설명자(說明子) 구조체
⦿ file descriptor의 한국어 표현을 아래와 같이 여러 가지로 할 수 있으나, 파일 설명자(file 說明子)로 하겠습니다.
사전적으로도 가장 정확한 표현은 파일 설명자(file 說明子)입니다.
• 파일 설명자(file 說明子)[정보·통신]: 프로그램에서 보조 기억 장치에 있는 파일에 접근하는 데 이용되는 여러 가지 파일 정보를 담고 있는 자료 구조.
• 서술자(敍述者)[명사 문학]: 이야기를 전개하는 사람.
• 기술자(記述子)[명사 정보·통신]: 데이터베이스의 정보를 분류하거나 문헌의 개념이나 내용을 표현하기 위해 사용되는 색인어.
• 설명자(說明者)[명사]: 어떤 사실이나 사물에 관하여 상대편이 잘 알 수 있도록 밝히어 말하는 사람.
• 식별자(識別子)[명사 정보·통신]
① 데이터 항목을 식별하며, 때로는 이름을 붙여 그 데이터의 성질을 표시하기 위해 쓰이는 문자.
② 이름을 붙이고 표시나 위치를 지정하는 데 쓰는 기호. 데이터 구조, 데이터 항목 또는 프로그램 위치 따위에 관련된다.
③ 사용하는 기본 요소들을 구분하기 위하여 정해진 규칙에 따라 부여한 이름.
④ 기록이나 문헌의 내용을 표현하는 색인어인 ‘디스크립터’로 사용되는 기호.
📦 [Linux kernel 5.1] void io_uring_prep_nop (struct io_uring_sqe *sqe)
이 함수는 무작동(no-op)인 IORING_OP_NOP 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
이러한 종류의 작업은 테스트 목적으로 존재하며 io_uring 인터페이스의 속도와 효율성을 테스트하는 데 사용됩니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
📦 [Linux kernel 5.6] void io_uring_prep_read (struct io_uring_sqe *sqe, int fd, void *buf, unsigned nbytes, off_t offset)
이 함수는 읽기 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 읽을 파일 설명자(file descriptor)입니다.
• buf: 읽은 데이터를 복사할 버퍼입니다.
• nbytes: 읽을 바이트 수(number)입니다.
• offset: 읽을 파일의 절대 오프셋(absolute offset)입니다.
⦿ 참고
• read(2) - http://man7.org/linux/man-pages/man2/read.2.html
• lseek(2) - http://man7.org/linux/man-pages/man2/lseek.2.html
📦 [Linux kernel 5.6] void io_uring_prep_write (struct io_uring_sqe *sqe, int fd, const void *buf, unsigned nbytes, off_t offset)
이 함수는 쓰기 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 쓸 파일 설명자(file descriptor)입니다.
• buf: 데이터를 쓸 버퍼입니다.
• nbytes: 쓸 바이트 수(number)입니다.
• offset: 쓸 파일의 절대 오프셋(absolute offset)입니다.
⦿ 참고
• write(2) - http://man7.org/linux/man-pages/man2/write.2.html
• lseek(2) - http://man7.org/linux/man-pages/man2/lseek.2.html
📦 [Linux kernel 5.1] void io_uring_prep_readv (struct io_uring_sqe *sqe, int fd, const struct iovec *iovecs, unsigned nr_vecs, off_t offset)
이 함수는 Linux의 분산(scatter)/수집(gather) I/O 시스템 호출 제품군의 일부인 readv(2) 또는
preadv(2)와 유사한 '분산(scatter)' 읽기 작업을 사용하여 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 읽을 파일 설명자입니다.
• iovecs: iovec 구조 배열에 대한 포인터
• nr_vecs: iovecs 인수가 가리키는 배열의 iovec 인스턴스 수(number)입니다.
• offset: 읽을 파일의 절대 오프셋입니다.
⦿ 참고
• readv(2) - http://man7.org/linux/man-pages/man2/readv.2.html
• 이 함수를 사용하는 liburing을 사용한 cat 유틸리티 예제 - https://unixism.net/loti/tutorial/cat_liburing.html#cat-liburing
📦 [Linux kernel 5.1] void io_uring_prep_read_fixed (struct io_uring_sqe *sqe, int fd, void *buf, unsigned nbytes, off_t offset, int buf_index)
io_uring_prep_read()와 마찬가지로 이 함수는 읽기 작업을 통해 sqe가 가리키는 제출 대기열 항목을 설정합니다.
주요 차이점은 이 함수가 io_uring_register()를 통해 등록된 미리 할당된 고정된 버퍼 세트와 함께 작동하도록 설계되었다는 것입니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 읽을 파일 설명자입니다.
• buf: 읽은 데이터를 복사할 버퍼입니다.
• nbytes: 읽을 바이트 수(number)입니다.
• offset: 읽을 파일의 절대 오프셋입니다.
• buf_index: 사용할 사전 할당된(pre-allocated) 버퍼 집합의 인덱스입니다.
⦿ 참고
• io_uring_register() - https://unixism.net/loti/ref-iouring/io_uring_register.html#c.io_uring_register
• read(2) - http://man7.org/linux/man-pages/man2/read.2.html
• lseek(2) - http://man7.org/linux/man-pages/man2/lseek.2.html
📦 [Linux kernel 5.1] void io_uring_prep_writev (struct io_uring_sqe *sqe, int fd, const struct iovec *iovecs, unsigned nr_vecs, off_t offset)
이 함수는 Linux의 분산(scatter)/수집(gather) I/O 시스템 호출 제품군의 일부인 writev(2) 또는 pwritev(2)와
유사한 '수집(gather)' 쓰기 작업을 사용하여 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 쓸 파일 설명자입니다.
• iovecs: iovec 구조 배열에 대한 포인터
• nr_vecs: iovecs 인수가 가리키는 배열의 iovec 인스턴스 수(number)입니다.
• offset: 쓸 파일의 절대 오프셋입니다.
⦿ 참고
• writev(2) - http://man7.org/linux/man-pages/man2/writev.2.html
• 이 함수를 사용하는 liburing을 사용한 cp 유틸리티 예제 - https://unixism.net/loti/tutorial/cp_liburing.html#cp-liburing
📦 [Linux kernel 5.1] void io_uring_prep_write_fixed (struct io_uring_sqe *sqe, int fd, const void *buf, unsigned nbytes, off_t offset, int buf_index)
io_uring_prep_writev()와 마찬가지로 이 함수는 쓰기 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
주요 차이점은 이 함수가 io_uring_register()를 통해 등록된 미리 할당된 고정된 버퍼 세트와 함께 작동하도록 설계되었다는 것입니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 쓸 파일 설명자입니다.
• buf: 데이터를 쓸 버퍼입니다.
• nbytes: 쓸 바이트 수(number)입니다.
• offset: 쓸 파일의 절대 오프셋입니다.
• buf_index: 사용할 사전 할당된 버퍼 집합의 인덱스입니다.
⦿ 참고
• io_uring_register() - https://unixism.net/loti/ref-iouring/io_uring_register.html#c.io_uring_register
• write(2) - http://man7.org/linux/man-pages/man2/write.2.html
• lseek(2) - http://man7.org/linux/man-pages/man2/lseek.2.html
📦 [Linux kernel 5.1] void io_uring_prep_fsync(struct io_uring_sqe *sqe, int fd, unsigned fsync_flags)
이 함수는 fsync(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
이로 인해 디스크 캐시에 있는 파일 데이터 및 메타데이터의 '변경(dirty)' 버퍼가 디스크에 동기화됩니다.
⦿ Note - 주의
이 작업을 대기열에 추가한다고 해서 이 작업 전에 대기열에 추가된 모든 쓰기 작업으로 파일에 쓴 데이터가
디스크에 동기화된다는 보장은 없다는 점에 유의하는 것이 중요합니다.
이는 제출 대기열의 작업이 커널에 의해 병렬로 선택되어 실행될 수 있기 때문입니다.
이 동기화 작업은 앞에 대기 중인 다른 쓰기 작업보다 훨씬 먼저 완료될 수 있습니다.
이것이 미치는 영향은 이 작업이 실행되는 시점에 파일에 이미 존재하는 '변경(dirty)' 버퍼 중 하나가 디스크에 동기화된다는 것입니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 쓸 파일 설명자입니다.
• fsync_flags: 이는 0 또는 'IORING_FSYNC_DATASYNC'일 수 있으며 이는 fdatasync(2)같이 작동합니다.
⦿ 참고
• io_uring_register() - https://unixism.net/loti/ref-iouring/io_uring_register.html#c.io_uring_register
• write(2) - http://man7.org/linux/man-pages/man2/write.2.html
• lseek(2) - http://man7.org/linux/man-pages/man2/lseek.2.html
📦 [Linux kernel 5.6] void io_uring_prep_close (struct io_uring_sqe *sqe, int fd)
이 함수는 close(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
이로 인해 fd가 가리키는 파일 설명자가 닫힙니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 파일 설명자
⦿ 참고
• close(2) - http://man7.org/linux/man-pages/man2/close.2.html
📦 [Linux kernel 5.6] void io_uring_prep_openat (struct io_uring_sqe *sqe, int dfd, const char *path, int flags, mode_t mode)
이 함수는 openat(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
이로 인해 경로(path)가 가리키는 파일이 dfd 디렉터리 파일 설명자가 나타내는 디렉터리에 상대적인 경로에서 열리게 됩니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• dfd: 파일이 열릴 상대 디렉터리를 나타내는 디렉터리 파일 설명자(directory file descriptor)입니다.
• path: 열려는 파일의 경로 이름입니다.
• flags:이는 접근(access) 모드 플래그입니다. open(2)과 동일합니다.
• mode: 새 파일을 생성할 때 적용되는 파일 권한 비트입니다. open(2)에서와 동일합니다.
⦿ 참고
• openat(2) - http://man7.org/linux/man-pages/man2/openat.2.html
• open(2) - http://man7.org/linux/man-pages/man2/open.2.html
📦 [Linux kernel 5.6] void io_uring_prep_openat2 (struct io_uring_sqe *sqe, int dfd, const char *path, struct open_how *how)
이 함수는 openat2(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
이로 인해 경로(path)가 가리키는 파일이 dfd 디렉터리 파일 설명자가 나타내는 디렉터리에 상대적인 경로에서 열리게 됩니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• dfd: 파일이 열릴 상대 디렉터리를 나타내는 디렉터리 파일 설명자입니다.
• path: 열려는 파일의 경로 이름.
• how: 파일을 정확히 어떻게 열 것인지 제어할 수 있는 open_how 구조에 대한 포인터. 자세한 내용은 openat2(2)를 참조하십시오.
⦿ 참고
• openat2(2) - http://man7.org/linux/man-pages/man2/openat2.2.html
• open(2) - http://man7.org/linux/man-pages/man2/open.2.html
📦 [Linux kernel 5.6] void io_uring_prep_fallocate (struct io_uring_sqe *sqe, int fd, int mode, off_t offset, off_t len)
이 함수는 fallocate(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
fallocate(2) 시스템 호출은 파일 설명자 'fd'가 나타내는 파일에 대한 파일 공간을 할당(allocate), 할당 취소(deallocate), 축소(collapse), 0(zero)
또는 늘리는(increase) 데 사용됩니다.
자세한 내용은 fallocate(2)를 참조하십시오.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 작업을 수행할 파일의 파일 설명자입니다.
• mode: 파일에 대해 수행할 작업을 설명했습니다. 자세한 내용은 fallocate(2)를 참조하십시오.
• offset: 작업을 시작할 파일의 오프셋입니다.
• len: 작업 길이.
⦿ 참고
• fallocate(2) - http://man7.org/linux/man-pages/man2/fallocate.2.html
- Allocating disk space: FALLOC_FL_KEEP_SIZE, FALLOC_FL_UNSHARE_RANGE
- Deallocating file space: FALLOC_FL_PUNCH_HOLE
- Collapsing file space: FALLOC_FL_COLLAPSE_RANGE
- Zeroing file space: FALLOC_FL_ZERO_RANGE
- Increasing file space: FALLOC_FL_INSERT_RANGE
📦 [Linux kernel 5.6] void io_uring_prep_statx (struct io_uring_sqe *sqe, int dfd, const char *path, int flags, unsigned mask, struct statx *statxbuf)
이 함수는 statx(2)와 유사한 작업을 통해 sqe가 가리키는 제출 대기열 항목을 설정합니다.
statx(2) 시스템 호출은 'statxbuf'가 가리키는 statx 구조에 채워지는 경로가 가리키는 파일에 대한 메타 정보를 얻습니다.
자세한 내용은 statx(2)를 참조하십시오.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• dfd: 이 값과 경로에 따라 경로(path)가 가리키는 파일은 절대, 프로세스에 대한 상대 또는 dfd의 디렉터리 설명자가
참조하는 디렉터리에 대한 상대로 해석될 수 있으며 다른 유형의 해석도 가능합니다.
자세한 내용은 statx(2)를 참조하십시오.
• path: 파일 경로. dfd의 값과 결합하여 해석됩니다. 자세한 내용은 statx(2)를 참조하십시오.
• flags: 이는 경로 이름을 찾는 방법에 영향을 미치는 데 사용됩니다.
또한 원격 파일 시스템에서 파일을 쿼리할 때 커널이 수행하는 동기화 종류에 영향을 줄 수도 있습니다.
See statx(2) for details.
⦿ 참고
• statx(2) - http://man7.org/linux/man-pages/man2/statx.2.html
📦 [Linux kernel 5.6] void io_uring_prep_fadvise (struct io_uring_sqe *sqe, int fd, off_t offset, off_t len, int advice)
이 함수는 posix_fadvise(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
posix_fadvise(2) 시스템 호출을 사용하면 응용 프로그램은 파일 설명자 fd가 나타내는 파일의 데이터에 순차적으로(sequentially),
무작위로(randomly) 또는 기타 방법으로 액세스할 계획을 운영 체제에 조언할 수 있습니다.
이는 애플리케이션의 성능을 향상시키기 위한 것입니다. 자세한 내용은 posix_fdavise(2)를 참조하세요.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 조언(advice)을 제공할 파일의 파일 설명자입니다.
• offset: 조언(advice)이 적용되는 시작 파일의 오프셋입니다.
• len: 조언(advice)이 적용될 때까지의 길이.
• advice:
- POSIX_FADV_NORMAL
- POSIX_FADV_SEQUENTIAL
- POSIX_FADV_RANDOM
- POSIX_FADV_NOREUSE
- POSIX_FADV_WILLNEED
- POSIX_FADV_DONTNEED
⦿ 참고
• posix_fadvise(2) - http://man7.org/linux/man-pages/man2/posix_fadvise.2.html
📦 [Linux kernel 5.6] void io_uring_prep_madvise (struct io_uring_sqe *sqe, void *addr, off_t length, int advice)
이 함수는 madvise(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
madvise(2) 시스템 호출을 사용하면 애플리케이션은 주소(addr)가 가리키는 메모리에 대해 최대 길이 바이트까지 운영 체제에 조언할 수 있습니다.
조언은 애플리케이션이 해당 메모리 범위에 액세스할 계획(순차적, 무작위 또는 기타 방식)이나
무엇보다도 프로세스가 자식(프로세스)을 포크할 때 운영 체제가 이를 공유하지 않아야 하는지에 대한 것일 수 있습니다.
이는 애플리케이션의 성능을 향상시키기 위한 것입니다. 자세한 내용은 mdavise(2)를 참조하십시오.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• addr: 조언(advice)이 적용되는 메모리 범위의 시작 주소입니다.
• len: 조언(advice)이 적용될 때까지의 길이
• advice:
Conventional advice values
- MADV_NORMAL
- MADV_RANDOM
- MADV_SEQUENTIAL
- MADV_WILLNEED
- MADV_DONTNEED
Linux-specific advice values
- MADV_REMOVE
- MADV_DONTFORK
- MADV_DOFORK
- MADV_HWPOISON
- MADV_MERGEABLE
- MADV_UNMERGEABLE
- MADV_SOFT_OFFLINE
- MADV_HUGEPAGE
- MADV_NOHUGEPAGE
- MADV_COLLAPSE
- MADV_DONTDUMP (since Linux 3.4)
- MADV_DODUMP (since Linux 3.4)
- MADV_FREE (since Linux 4.5)
- MADV_WIPEONFORK (since Linux 4.14)
- MADV_KEEPONFORK (since Linux 4.14)
- MADV_COLD (since Linux 5.4)
- MADV_PAGEOUT (since Linux 5.4)
- MADV_POPULATE_READ (since Linux 5.14)
- MADV_POPULATE_WRITE (since Linux 5.14)
⦿ 참고
• madvise(2) - http://man7.org/linux/man-pages/man2/madvise.2.html
📦 [Linux kernel 5.7] void io_uring_prep_splice (struct io_uring_sqe *sqe, int fd_in, loff_t off_in, int fd_out, loff_t off_out, unsigned int nbytes, unsigned int splice_flags)
이 함수는 splice(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
splice(2) 시스템 호출은 커널 주소 공간과 사용자 주소 공간 간에 데이터를 복사하지 않고
두 파일 설명자('fd_in'과 'fd_out') 간에 데이터를 복사합니다.
그러나 파일 설명자 중 하나는 파이프를 나타내야 합니다. 자세한 내용은 splice(2)를 참조하십시오.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd_in: 읽을 파일 설명자입니다.
• off_in: 'fd_in'이 파이프를 참조하는 경우 NULL이어야 합니다. 'fd_in'이 파이프가 아니고 다음과 같은 경우:
- 'off_in'이 NULL인 경우, 'fd_in'의 데이터는 해당 파일 오프셋에서 읽혀지고 그에 따라 파일 오프셋이 조정됩니다.
- 'off_in'이 NULL이 아닌 경우, 'off_in'은 'fd_in'에서 바이트를 읽을 시작 오프셋을 지정하는 버퍼를 가리켜야 합니다.
이 경우 'fd_in'의 파일 오프셋은 변경되지 않고 그대로 유지됩니다.
• fd_out, off_out: 'fd_in' 및 'off_in'과 같은 유사한 명령문이 이러한 인수에 적용됩니다.
• nbytes: 복사할 바이트 수
• splice_flags: 복사본에 영향을 미치는 비트 마스크입니다. 자세한 내용은 splice(2)를 참조하십시오.
- SPLICE_F_MOVE
- SPLICE_F_NONBLOCK
- SPLICE_F_MORE
- SPLICE_F_GIFT
⦿ 참고
• splice(2) - http://man7.org/linux/man-pages/man2/splice.2.html
📦 [Linux kernel 5.3] void io_uring_prep_recvmsg (struct io_uring_sqe *sqe, int fd, struct msghdr *msg, unsigned flags)
이 함수는 recvmsg(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
recvmsg(2) 시스템 호출은 소켓에서 데이터를 읽는 데 사용됩니다.
msghdr 구조를 사용하여 필요한 인수 수를 줄입니다.
이 호출은 연결 지향(TCP 등) 소켓과 비연결형(UDP 등) 소켓 모두에서 작동합니다.
자세한 내용은 recvmsg(2)를 참조하십시오.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 읽을 소켓입니다.
• msg: msghdr 구조에 대한 포인터입니다.
• flags: 읽기에 영향을 미치는 비트 마스크입니다. 자세한 내용은 recvmsg(2)를 참조하십시오.
- MSG_CMSG_CLOEXEC
- MSG_DONTWAIT
- MSG_ERRQUEUE
- MSG_OOB
- MSG_PEEK
- MSG_TRUNC
- MSG_WAITALL
⦿ 참고
• recvmsg(2) - http://man7.org/linux/man-pages/man2/recvmsg.2.html
📦 [Linux kernel 5.3] void io_uring_prep_sendmsg (struct io_uring_sqe *sqe, int fd, const struct msghdr *msg, unsigned flags)
io_uring_prep_recvmsg()와 동일하지만 소켓에 쓰기 위한 것입니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 쓸(write to) 소켓입니다.
• msg: msghdr 구조에 대한 포인터입니다.
• flags: 쓰기에 영향을 미치는 비트 마스크입니다. 자세한 내용은 sendmsg(2)를 참조하십시오.
- MSG_CONFIRM
- MSG_DONTROUTE
- MSG_DONTWAIT
- MSG_EOR
- MSG_MORE
- MSG_NOSIGNAL
- MSG_OOB
- MSG_FASTOPEN
⦿ 참고
• sendmsg(2) - http://man7.org/linux/man-pages/man2/sendmsg.2.html
📦 [Linux kernel 5.6] void io_uring_prep_recv (struct io_uring_sqe *sqe, int sockfd, void *buf, size_t len, int flags)
이 함수는 recv(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
recv(2) 시스템 호출은 소켓에서 데이터를 읽는 데 사용됩니다.
msghdr 구조를 사용하여 필요한 인수 수를 줄입니다.
이 호출은 연결 지향(TCP 등) 소켓과 비연결형(UDP 등) 소켓 모두에서 작동합니다.
flags 인수가 없으면 길이가 0인 데이터그램을 처리하는 동안 한 가지 작은 차이점을 제외하고는 read(2)와 완전히 동일합니다.
자세한 내용은 recv(2)를 참조하십시오.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 읽을(read from) 소켓입니다.
• buf: 데이터를 읽을 버퍼에 대한 포인터입니다.
• len: 읽을 바이트 수입니다.
• flags: 읽기에 영향을 미치는 비트 마스크입니다. 자세한 내용은 recv(2)를 참조하십시오.
- MSG_CMSG_CLOEXEC
- MSG_DONTWAIT
- MSG_ERRQUEUE
- MSG_OOB
- MSG_PEEK
- MSG_TRUNC
- MSG_WAITALL
⦿ 참고
• recv(2) - http://man7.org/linux/man-pages/man2/recv.2.html
📦 [Linux kernel 5.6] void io_uring_prep_send (struct io_uring_sqe *sqe, int sockfd, const void *buf, size_t len, int flags)
io_uring_prep_recv()와 동일하지만 소켓에 쓰기 위한 것입니다.
⦿ 참고
• send(2) - http://man7.org/linux/man-pages/man2/send.2.html
📦 [Linux kernel 5.5] void io_uring_prep_accept (struct io_uring_sqe *sqe, int fd, struct sockaddr *addr, socklen_t *addrlen, int flags)
이 함수는 accept4(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
accept4(2) 시스템 호출은 연결 지향 소켓 유형(SOCK_STREAM, SOCK_SEQPACKET)과 함께 사용됩니다.
듣기 소켓 fd에 대해 보류 중인 연결 대기열에서 첫 번째 연결 요청을 추출합니다.
flags 인수를 0으로 설정하면 accept4(2)는 accept(2)와 완전히 동일합니다.
자세한 내용은 accept4(2)를 참조하세요.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 듣기(listening) 소켓 fd
• addr: sockaddr 구조에 대한 포인터. 이는 상대방(peer)의 주소로 채워집니다.
• addrlen: socklen_t에 대한 포인터입니다. 호출에 대한 sockaddr 구조의 크기로 채워져야 하고 상대방 주소의 크기로
설정되는 값-결과 인수입니다.
• flags: 시스템 호출에 영향을 미치는 비트 마스크입니다. 자세한 내용은 accept4(2)를 참조하세요.
- SOCK_NONBLOCK
- SOCK_CLOEXEC
⦿ 참고
• accept4(2) - http://man7.org/linux/man-pages/man2/accept4.2.html
📦 [Linux kernel 5.5] void io_uring_prep_connect (struct io_uring_sqe *sqe, int fd, struct sockaddr *addr, socklen_t addrlen)
이 함수는 connect(2)와 유사한 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
connect(2) 시스템 호출은 fd에서 참조되는 소켓을 'addr'에 지정된 주소에 연결하는 데 사용됩니다.
자세한 내용은 connect(2)를 참조하세요.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 듣기(listening) 소켓 fd
• addr: 상대방(peer)의 주소를 포함하는 sockaddr 구조에 대한 포인터입니다.
• addrlen: socklen_t에 대한 포인터입니다. 호출에 대한 sockaddr 구조의 크기로 채워져야 하고 상대방 주소의 크기로 설정되는 값-결과 인수입니다.
⦿ 참고
• connect(2) - http://man7.org/linux/man-pages/man2/connect.2.html
📦 [Linux kernel 5.6] void io_uring_prep_epoll_ctl (struct io_uring_sqe *sqe, int epfd, int fd, int op, struct epoll_event *ev)
이 함수는 epoll_ctl(2) 같은 작업을 통해 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
epoll_ctl(2) 시스템 호출은 'epfd'가 참조하는 epoll(7) 인스턴스의 관심 목록에서 수정 항목을 추가하거나 제거하는 데 사용됩니다.
'op'에 지정된 추가, 제거 또는 수정 작업은 파일 설명자 fd에 적용됩니다. 자세한 내용은 epoll_ctl(2)을 참조하십시오.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• epfd: epoll 인스턴스를 나타내는 파일 설명자.
• fd: 추가, 삭제 또는 수정할 파일 설명자입니다.
• op: 수행할 epoll 작업(EPOLL_CTL_ADD, EPOLL_CTL_DEL 또는 EPOLL_CTL_MOD).
• ev: epoll_event 구조체에 대한 포인터입니다.
⦿ 참고
• epoll_ctl(2) - http://man7.org/linux/man-pages/man2/epoll_ctl.2.html
• epoll(7) - http://man7.org/linux/man-pages/man7/epoll.7.html
📦 [Linux kernel 5.1] void io_uring_prep_poll_add (struct io_uring_sqe *sqe, int fd, short poll_mask)
이 함수는 폴(poll)의 관심 목록에 파일 설명자를 추가하고 'poll_mask'에 지정된 이벤트를 수신하기 위해 poll(2)과
같은 작업을 사용하여 'sqe'가 가리키는 제출 대기열 항목을 설정합니다.
'EPOLLONESHOT'이 없는 'poll'이나 'epoll'과 달리, 이 인터페이스는 항상 일회성 모드로 작동합니다.
즉, 폴링 작업이 완료되면 다시 제출해야 합니다. 자세한 내용은 poll(2)을 참조하세요.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• fd: 이벤트를 주기적으로 확인하는 파일 설명자.
• poll_mask: 수신할 이벤트를 포함하는 비트 마스크입니다.
⦿ 참고
• poll(2) - http://man7.org/linux/man-pages/man2/poll.2.html
📦 [Linux kernel 5.1] void io_uring_prep_poll_remove (struct io_uring_sqe *sqe, void *user_data)
poll(2)에 의한 모니터링 요청에서 제거합니다.
⦿ Parameters
• sqe: 일반적으로 io_uring_get_sqe()에 의해 반환되는 SQE에 대한 포인터입니다.
• user_data: 사용자 데이터에 대한 포인터입니다.
이 사용자 데이터와 관련된 요청은 추가 모니터링에서 제거됩니다.
⦿ 참고
• poll(2) - http://man7.org/linux/man-pages/man2/poll.2.html
⚛ 원문
