io_submit(2) - wariua/manpages-ko GitHub Wiki
io_submit - ๋น๋๊ธฐ I/O ์ฒ๋ฆฌ ์์ฒญ ์ ์ถํ๊ธฐ
#include <linux/aio_abi.h> /* ํ์ํ ํ์
์ ์ */
int io_submit(aio_context_t ctx_id, long nr, struct iocb **iocbpp);
์ฃผ์: ์ด ์์คํ ํธ์ถ์ ๋ํ glibc ๋ํผ๊ฐ ์๋ค. NOTES ์ฐธ๊ณ .
io_submit()
์์คํ
ํธ์ถ์ AIO ๋ฌธ๋งฅ ctx_id
์์ ์ฒ๋ฆฌ ํ์ nr
๊ฐ I/O ์์ฒญ ๋ธ๋ก์ ๋ฃ๋๋ค. iocbpp
์ธ์๋ nr
๊ฐ AIO ์ ์ด ๋ธ๋ก์ ๋ฐฐ์ด์ด์ด์ผ ํ๋ฉฐ ์ด๋ฅผ ๋ฌธ๋งฅ ctx_id
๋ก ์ ์ถํ๊ฒ ๋๋ค.
linux/aio_abi.h
์ ์ ์๋ผ ์๋ iocb
(I/O ์ ์ด ๋ธ๋ก) ๊ตฌ์กฐ์ฒด์ I/O ๋์์ ์ ์ดํ๋ ๋งค๊ฐ๋ณ์๋ค์ด ์๋ค.
#define <linux/aio_abi.h>
struct iocb {
__u64 aio_data;
__u32 PADDED(aio_key, aio_rw_flags);
__u16 aio_lio_opcode;
__s16 aio_reqprio;
__u32 aio_fildes;
__u64 aio_buf;
__u64 aio_nbytes;
__s64 aio_offset;
__u64 aio_reserved2;
__u32 aio_flags;
__u32 aio_resfd;
};
์ด ๊ตฌ์กฐ์ฒด์ ํ๋๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
aio_data
- I/O ์๋ฃ ์ ์ด ๋ฐ์ดํฐ๊ฐ
io_event
๊ตฌ์กฐ์ฒด์data
ํ๋๋ก ๋ณต์ฌ๋๋ค. (io_getevents(2) ์ฐธ๊ณ .) aio_key
- ์ปค๋ ๋ด๋ถ์ฉ ํ๋์ด๋ค.
io_submit()
ํธ์ถ ํ์ ์ด ํ๋๋ฅผ ๋ณ๊ฒฝํ์ง ๋ง ๊ฒ. aio_rw_flags
-
๊ตฌ์กฐ์ฒด์ ํจ๊ป ์ ๋ฌํ๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ํ๋๊ทธ๋ค์ด๋ค. ์ ํจํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
-
RWF_APPEND
(๋ฆฌ๋ ์ค 4.16๋ถํฐ) - ํ์ผ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ถ์. pwritev2(2)์ ์๋ ๊ฐ์ ์ด๋ฆ์ ํ๋๊ทธ ์ค๋ช
๊ณผ open(2)์
O_APPEND
์ค๋ช ์ฐธ๊ณ . -
RWF_DSYNC
(๋ฆฌ๋ ์ค 4.7๋ถํฐ) - ๋๊ธฐํ I/O ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์๊ฑด์ ๋ฐ๋ผ ์ฐ๊ธฐ ๋์์ด ์๋ฃ๋จ. pwritev2(2)์ ์๋ ๊ฐ์ ์ด๋ฆ์ ํ๋๊ทธ ์ค๋ช
๊ณผ open(2)์
O_DSYNC
์ค๋ช ์ฐธ๊ณ . -
RWF_HIPRI
(๋ฆฌ๋ ์ค 4.6๋ถํฐ) - ๋์ ์ฐ์ ๋ ์์ฒญ. ๊ฐ๋ฅํ๋ฉด ํด๋ง.
-
RWF_NOWAIT
(๋ฆฌ๋ ์ค 4.14๋ถํฐ) - ์ปค๋ ๋ด์์ ํ์ผ ๋ธ๋ก ํ ๋น์ด๋ ๋ณ๊ฒฝ ํ์ด์ง ํ๋ฌ์ฑ, ๋ฎคํ
์ค ๋ฝ ๊ฐ์ ๋์์ด๋ ํผ์กํ ๋ธ๋ก ์ฅ์น ๋๋ฌธ์ I/O๊ฐ ๋ธ๋ก ๋๋ ค๋ ๊ฒฝ์ฐ์ ๋๊ธฐํ์ง ์๋๋ค. ์ด ์ค ํ ์กฐ๊ฑด์ด๋ผ๋ ํด๋นํ๋ฉด
io_event
๊ตฌ์กฐ์ฒด์res
ํ๋์ ๋ฐํ ๊ฐ-EAGAIN
์ ๋ด์์ ์ ์ด ๋ธ๋ก์ ์ฆ์ ๋ฐํํ๋ค. (io_getevents(2) ์ฐธ๊ณ .) -
RWF_SYNC
(๋ฆฌ๋ ์ค 4.7๋ถํฐ) - ๋๊ธฐํ I/O ํ์ผ ๋ฌด๊ฒฐ์ฑ ์๊ฑด์ ๋ฐ๋ผ ์ฐ๊ธฐ ๋์์ด ์๋ฃ๋จ. pwritev2(2)์ ์๋ ๊ฐ์ ์ด๋ฆ์ ํ๋๊ทธ ์ค๋ช
๊ณผ open(2)์
O_SYNC
์ค๋ช ์ฐธ๊ณ .
-
aio_opcode
-
iocb
๊ตฌ์กฐ์ฒด๋ก ์ํํ I/O ์ข ๋ฅ๋ฅผ ๋ํ๋ธ๋ค. ์ ํจํ ๊ฐ๋ค์ดlinux/aio_abi.h
์ ์ด๊ฑฐํ์ผ๋ก ์ ์๋ผ ์๋ค.enum { IOCB_CMD_PREAD = 0, IOCB_CMD_PWRITE = 1, IOCB_CMD_FSYNC = 2, IOCB_CMD_FDSYNC = 3, IOCB_CMD_NOOP = 6, IOCB_CMD_PREADV = 7, IOCB_CMD_PWRITEV = 8, };
aio_reqprio
- ์์ฒญ ์ฐ์ ์์๋ฅผ ๋ํ๋ธ๋ค.
aio_fildes
- I/O ๋์์ ์ํํ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ด๋ค.
aio_buf
- ์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ ๋์์์ ๋ฐ์ดํฐ ์ด๋์ ์ฌ์ฉํ ๋ฒํผ์ด๋ค.
aio_nbytes
-
aio_buf
๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฒํผ์ ํฌ๊ธฐ์ด๋ค. aio_offset
- I/O ๋์์ ์ํํ ํ์ผ ์คํ์ ์ด๋ค.
aio_flags
-
iocb
๊ตฌ์กฐ์ฒด์ ์ฐ๊ณํ ํ๋๊ทธ๋ค์ ์งํฉ์ด๋ค. ์ ํจํ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.IOCB_FLAG_RESFD
- ๋น๋๊ธฐ I/O ์ ์ด ๋ก์ง์์ ์๋ฃ ์
aio_resfd
์ ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ์๋ฆผ์ ์ค์ผ ํ๋ค. -
IOCB_FLAG_IOPRIO
(๋ฆฌ๋ ์ค 4.18๋ถํฐ) -
aio_reqprio
ํ๋๋ฅผlinux/ioprio.h
์ ์ ์๋IOPRIO_VALUE
๋ก ํด์ํ๋ค.
aio_resfd
- ๋น๋๊ธฐ I/O ์๋ฃ ์์ ์๋ฆผ์ ๋ณด๋ผ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ด๋ค.
์ฑ๊ณต ์ io_submit()
์ ์ ์ถ๋ iocb
๊ฐ์๋ฅผ ๋ฐํํ๋ค. (nr
๋ณด๋ค ์์ ์๋ ์์ผ๋ฉฐ nr
์ด 0์ด๋ฉด 0์ผ ์๋ ์๋ค.) ์คํจ ๋ฐํ์ ๋ํด์ NOTES๋ฅผ ๋ณด๋ผ.
EAGAIN
-
iocb
๋ฅผ ํ์ ๋ฃ๊ธฐ ์ํ ์์์ด ์ถฉ๋ถ์น ์๋ค. EBADF
- ์ฒซ ๋ฒ์งธ
iocb
์ ์ง์ ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์ ํจํ์ง ์๋ค. EFAULT
- ํ ์๋ฃ ๊ตฌ์กฐ๊ฐ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
EINVAL
-
ctx_id
๋ก ์ง์ ํ AIO ๋ฌธ๋งฅ์ด ์ ํจํ์ง ์๋ค.nr
์ด 0๋ณด๋ค ์๋ค.*iocbpp[0]
์ ์๋iocb
๊ฐ ์ ๋๋ก ์ด๊ธฐํ ๋์ด ์์ง ์๋ค. ์ง์ ํ ๋์์ดiocb
์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ ํจํ์ง ์๋ค.aio_reqprio
ํ๋์ ๊ฐ์ด ์ ํจํ์ง ์๋ค. ENOSYS
- ์ด ์ํคํ
์ฒ์
io_submit()
์ด ๊ตฌํ๋ผ ์์ง ์๋ค. EPERM
-
aio_reqprio
ํ๋๊ฐ ํด๋์คIOPRIO_CLASS_RT
๋ก ์ค์ ๋ผ ์์ง๋ง ์ ์ถ ๋์์ ํ๋ ๋ฌธ๋งฅ์CAP_SYS_ADMIN
์ญ๋ฅ์ด ์๋ค.
๋ฆฌ๋ ์ค 2.5์์ ๋น๋๊ธฐ I/O ์์คํ ํธ์ถ๋ค์ด ์ฒ์ ๋ฑ์ฅํ๋ค.
io_submit()
์ ๋ฆฌ๋
์ค ์ ์ฉ์ด๋ฏ๋ก ์ด์์ฑ์ด ์์ด์ผ ํ๋ ํ๋ก๊ทธ๋จ์์๋ ์ฌ์ฉํ์ง ๋ง์์ผ ํ๋ค.
glibc์์ ์ด ์์คํ
ํธ์ถ์ ๋ํผ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค. syscall(2)์ ์ด์ฉํด ํธ์ถํ ์๋ ์๋ค. ํ์ง๋ง ์๋ง ๊ทธ๋ณด๋ค๋ libaio
์์ ์ ๊ณตํ๋ io_submit()
๋ํผ ํจ์๋ฅผ ์ฐ๊ณ ์ถ์ ๊ฒ์ด๋ค.
์ฐธ๊ณ ๋ก libaio
๋ํผ ํจ์์์๋ ctx_id
์ธ์์ ๋ค๋ฅธ ํ์
(io_context_t
)์ ์ด๋ค. ๋ํ libaio
๋ํผ์์๋ ์ผ๋ฐ์ ์ธ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๋ฅ ํ์ ๊ดํ์ ๋ฐ๋ฅด์ง ์๋๋ค. ์ฆ ์ค๋ฅ ์์ ์์ ์ค๋ฅ ๋ฒํธ๋ฅผ (ERRORS์ ๋์ด๋ ๊ฐ๋ค ์ค ํ๋์ ์์ ๊ฐ์) ๋ฐํํ๋ค. syscall(2)์ ํตํด ์์คํ
ํธ์ถ์ ๋ถ๋ฅด๋ ๊ฒฝ์ฐ์๋ ๋ฐํ ๊ฐ์ด ์ผ๋ฐ์ ์ธ ์ค๋ฅ ํ์ ๊ดํ์ ๋ฐ๋ฅธ๋ค. ์ฆ -1์ด๊ณ errno
์ ์ค๋ฅ๋ฅผ ๋ํ๋ด๋ (์์) ๊ฐ์ด ์ค์ ๋๋ค.
io_cancel(2), io_destroy(2), io_getevents(2), io_setup(2), aio(7)
2018-04-30