Mรกs contenido relacionado
La actualidad mรกs candente (20)
Similar a Windows via C/C++ Chapter 10 (20)
Windows via C/C++ Chapter 10
- 5. ์ฅ์น๋ ?!
โข ์ ์ : ํต์ ๊ฐ๋ฅํ ์ด๋ค ๊ฒ
โข ์ข
๋ฅ : ํ์ผ, ์ง๋ ฌํฌํธ, ๋ฉ์ผ์ฌ๋กฏ, ์์ผ, etc... (p.388 ํ 10-1)
โข ํน์ฑ : ์ผ๋ถ ์ฅ์น๋ฅผ ์ ์ธํ๊ณ ๋ ์ธํฐํ์ด์ค๊ฐ ๊ฐ๋ค.
๏ผ CreateMailSlot(), CreateNamedPipe()
HANDLE hHandle = CreateFile(... ์์ฑ
SetCommConfig (HANDLE hCommDev, ...
SetMailslotInfo (HANDLE hMailslot, ... ์ด์ฉ
CloseHandle(HANDLE hObject) ์ข
๋ฃ
!! ๋จ ์ฅ์น๊ฐ Socket์ด์๋ค๋ฉด Closesocket(SOCKET s)
- 6. HANDLE CreateFile (
PCTSTR pszName,
DWORD dwDesireAccess,
DWORD dwShareMode,
PSECURITY_ATTRIBUTES psa,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hFileTemplate);
โข pszName : ํน์ ์ฅ์น์ ์ธ์คํด์ค / ์ฅ์น์ ํ์
์ ๊ตฌ๋ถ
โข dwDesireAccess : ์ฅ์น์ ๋ฐ์ดํฐ ์ฃผ๊ณ ๋ฐ๊ธธ ์ํ๋ ๋ฒ์
โข dwShareMode : ์ฅ์น์ ๊ณต์ ํน์ฑ
โข Psa : ๋ณด์ ์ค์
โข dwCreationDisposition : ํ์ผ์ ์ฌ๋ ๋ฐฉ๋ฒ
โข dwFlagsAndAttributes : ์ธ๋ถ์ ํต์ Flag / ํ์ผ์ ํน์ฑ
โข hFileTemplate : ์ด๋ฏธ ์ด๋ฆฐ ํ์ผ์ ๋ํ ํธ๋ค or NULL
!! ํ์ผ์ด ์๋ ๋ค๋ฅธ ์ฅ์น์ ๋ํด์๋ ๋ฐ๋์ OPEN_EXISTING
(p.391 ~ 398)
- 8. ์ฅ์น ์ด์ฉํ๊ธฐ
โข ํ์ผ ํฌ๊ธฐ ์ป๊ธฐ
โข ํ์ผ ํฌ์ธํฐ ์์น ์ง์
โข ํ์ผ์ ๋ ์ค์
BOOL GetFileSize (hFile, ...); ๋
ผ๋ฆฌ์ ์ธ ํฌ๊ธฐ ๋ฐํ
DWORD GetCompressedFileSize (pszFileName, ...);
๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ ๋ฐํ
ReadFile (hFile, ...); 64bit ์คํ์
SetFilePointEx (hFile, ... ); ๋๊ธฐ์ ์ธ I/O๋ฅผ ์ํํ ์์น
SetEndOfFile(hFile, ...); ์ปค๋์ค๋ธ์ ํธ์ ํ์ผ
ํฌ์ธํฐ ๋ณ๊ฒฝ
- 10. ๋๊ธฐ ์ฅ์น I/O
โข ๋๊ธฐ ์ฅ์น I/O ์ํ
โข ๋๊ธฐ ์ฅ์น I/O ์ทจ์ (์ ์ ์ผ๋ก ๋๋ผ์ด๋ฒ์ ๋ฌ๋ ค์๋ค.)
BOOL ReadFile (
HANDLE hFile,
PVOID pvBuffer,
DWORD nNumByteToRead,
PDWORD pdwNumBytes,
OVERLAPPED* pOverlapped);
BOOL CancelSynchronousIo (HANDLE hThread);
- 12. ์ปดํจํฐ๊ฐ ์ํํ๋ ๋ค๋ฅธ ์์
๋ค์ ๋นํด ์ฅ์น I/O๋ ์๋์ ์ผ๋ก ๊ฐ
์ฅ ๋๋ฆฌ๊ณ , ์์ธกํ ์ ์๋ ์์
์ค ํ๋๋ค.
๋น๋๊ธฐ I/O ์์ฒญ์ ๊ณ ์ฑ๋ฅ์ ํ์ฅ์ฑ ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ
๊ธฐ ์ํ์ฌ ์ค๊ณ ๋์๋ค.
1. ์ค์ ๋ก I/O ์์
์ ์ํํ ์ฅ์น์ ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ก ์ ๋ฌ
2. ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๊ฐ ์ฅ์น๋ก ๋ถํฐ ์๋ต ๋๊ธฐ
3. ์ ํ๋ฆฌ์ผ์ด์
์ I/O ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ์์
์ํ
BOOL ReadFile (
HANDLE hFile,
PVOID pvBuffer,
DWORD nNumByteToRead,
PDWORD pdwNumBytes,
OVERLAPPED* pOverlapped); FILE_FLAG_OVERLAPPED
- 13. typedef struct _OVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
โข Internal : ์ฒ๋ฆฌ๋ I/O์ ์๋ฌ ์ฝ๋๋ฅผ ๋ด๋๋ฐ ์ฌ์ฉํ๋ค. ๋น๋๊ธฐ I/O ์์ฒญ
์ ์๋ํ๋ฉด ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ Internal ๋ฉค๋ฒ ๊ฐ์
STATUS_PENDING์ผ๋ก ์ค์ ํ์ฌ ์์ง ์์
์ด ์๋ฃ๋์ง ์์์ผ๋ฉฐ
์ด๋ ํ ์๋ฌ๋ ๋ฐ์ํ์ง ์์์์ ๋ํ๋ธ๋ค.
โข InternalHigh : ๋น๋๊ธฐ I/O ์์
์ด ์๋ฃ๋๋ฉด ์ด ๋ฉค๋ฒ๋ ์ค์ ๋ก ์ก์์ ๋
๋ฐ์ดํธ ์๋ฅผ ์ ์ฅํ๊ฒ ๋๋ค.
- 14. โข Offset : ์ด ์ธ์์ ์๋ OffsetHigh๋ฅผ ํตํด ํ์ผ ๋ด์์ I/O ์์
์ ์
์ํ ์์น๋ฅผ 64๋นํธ ์คํ์
๊ฐ์ผ๋ก ์ง์ ํ ์ ์๋ค. ๋์ผํ ํ์ผ ์ปค๋
์ค๋ธ์ ํธ์ ๋ํด ์ฌ๋ฌ ๋ฒ์ ๋น๋๊ธฐ I/O ์์ฒญ ์์๋ ๋ฐ๋์
OVERLAPPED ๊ตฌ์กฐ์ฒด ๋ด์ I/O ์์
์ ์์ํ ์์น๋ฅผ ์ง์ ํด์ผ ํ๋ค.
โข OffsetHigh : ์์ Offset๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ฉฐ 32๋นํธ ์์ ํ์ผ์ ์ค
ํ์
์ ๋ํ๋ธ๋ค.
โข hEvent : ์ด ๋ฉค๋ฒ๋ I/O ์๋ฃ ํต์ง๋ฅผ ์์ ํ๋ ๋ค ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํ๋์
๋ฐฉ๋ฒ์์ ์ฌ์ฉ๋๋ค. ์ผ๋ฌํฐ๋ธ I/O ํต์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ฌ
์ฉ์ ์์๋ก ์ด ๋ฉค๋ฒ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
- 15. โข ๋น๋๊ธฐ I/O ์์ฒญ์ด ์๋ฃ๋๋ฉด I/O ์์ฒญ ์ ์ฌ์ฉํ๋
OVERLAPPED ๊ตฌ์กฐ์ฒด์ ์ฃผ์๋ฅผ ๋๋ ค์ฃผ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด
๊ตฌ์กฐ์ฒด์ ์ฅ์น ํธ๋ค์ด๋ ์ ์ฉํ ์ปจํ
์คํธ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋งํ
๋ฉค๋ฒ๋ฅผ ํฌํจ์์ผ์ ์์ฑํ๊ธฐ๋ ํ๋ค.
Enum IOType
{
OP_RECV,
OP_SEND
}
class OVERLAPPEDEX : public OVERLAPPED
{
IOType m_eIOType;
SOCKET m_hSocket;
};
- 16. ๋น๋๊ธฐ ์ฅ์น I/O ์ฌ์ฉ ์ ์ฃผ์์
1. ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ๋ ๋น๋๊ธฐ I/O์์ฒญ์ ํญ์ ์ ์
์ ์ถ๋ก ์ฒ๋ฆฌ ์ํจ
2. ์๋ฌ ํ์ธ์ ์ํํ๋ ์ ๋นํ ๋ฐฉ๋ฒ์ ๋ํด ์๊ณ ์์ด์ผ ํ๋ค.
1. ๋น๋๊ธฐ ์์ฒญ์๋ ์์คํ
์ ์ํด ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ๋ ์๋ค.
2. Read / Write File์ I/O ์์ฒญ์ด ๋๊ธฐ์ ์ผ๋ก ์ํ๋๋ ๊ฒฝ์ฐ 0์ด ์
๋ ๊ฐ์ ๋ฐํ
3. I/O ์์ฒญ์ด ๋น๋๊ธฐ์ ์ผ๋ก ์ํ๋๋ ๊ฒฝ์ฐ๋ ์๋ฌ ๋ฐ์์ FALSE
๋ฐํ, ๊ณ ๋ก GetLastError (ERROR_IO_PENDING)
3. ๋ฐ์ดํฐ ๋ฒํผ์ OVERLAPPED ๊ตฌ์กฐ์ฒด๋ I/O ์์ฒญ์ด ์๋ฃ๋ ๋๊น์ง
์ฎ๊ฒจ์ง๊ฑฐ๋ ์ญ์ ๋์ง ์์์ผ ํ๋ค.
- 17. ์์ฒญ๋ ์ฅ์น I/O์ ์ทจ์
โข CancelIo ํจ์ ํธ์ถ
โข ์ด ํจ์๋ฅผ ํธ์ถํ ์ค๋ ๋๊ฐ ์ฝ์
ํ ๋ชจ๋ I/O ์์ฒญ ์ทจ์
โข ์ฅ์น์ ๋ํ ํธ๋ค ๋ซ๊ธฐ
โข ์ด๋ค ์ค๋ ๋๊ฐ I/O ์์ฒญ์ ์ฝ์
ํ์ง ๊ณ ๋ คํ์ง ์๊ณ ๋ชจ๋ I/O ์์ฒญ ์ทจ์
โข ํธ๋ค์ด I/O ์ปดํ๋ ์ด์
ํฌํธ์ ์ฐ๊ณ๋์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด, ์ค๋ ๋๊ฐ
์ข
๋ฃ๋ ๋ ์ข
๋ฃ๋ ์ค๋ ๋๊ฐ ์ฝ์
ํ์๋ ๋ชจ๋ I/O ์์ฒญ์ด ์ทจ์
โข ํน์ ์ฅ์น์ ๋ํด ํ๋์ I/O ์์ฒญ๋ง ์ทจ์ํ ๋
โข CancelIoEx ํจ์ ํธ์ถ
- 19. ์๋ฃ ํต์ง ๋ฐฉ๋ฒ?
โข ๋น๋๊ธฐ ํธ์ถ์ ์ธ์ ์๋ฃ๋ ์ง ์ ์ ์๊ธฐ๋๋ฌธ์ I/O ์์
์ด ์๋ฃ๋๋ฉด ์๋ฃ
๋ ์ฌ์ค์ ํต์งํด ์ฃผ์ด์ผ ํ๋ค.
- 20. ์๋ฃ ํต์ง ๋ฐฉ๋ฒ?
๋ฐฉ๋ฒ ์์ฝ
๋๋ฐ์ด์ค ์ปค๋ ์ค๋ธ์ ํธ ์๊ทธ๋๋ง โข ๋จ์ผ์ ์ฅ์น์ ๋ํด ๋ค์์ I/O ์์ฒญ ์ ํฉํ์ง
์๋ค.
โข ํน์ ์ค๋ ๋๊ฐ I/O ์์ฒญ์ ์ฝ์
ํ๊ณ ๋ค๋ฅธ ์ค๋
๋๊ฐ ์๋ฃ ํต์ง๋ฅผ ์์ ํ ์ ์๋ค.
์ด๋ฒคํธ ์ปค๋ ์ค๋ธ์ ํธ์ ์๊ทธ๋๋ง โข ๋จ์ผ์ ์ฅ์น์ ๋ํด ๋ค์์ I/O ์์ฒญ์ ์ํํ
์ ์๋ค.
โข ํน์ ์ค๋ ๋๊ฐ I/O ์์ฒญ์ ์ฝ์
ํ๊ณ ๋ค๋ฅธ ์ค๋
๋๊ฐ ์๋ฃ ํต์ง๋ฅผ ์์ ํ ์ ์๋ค.
์ผ๋ฌํฐ๋ธ I/O ์ฌ์ฉ โข ๋จ์ผ์ ์ฅ์น์ ๋ํด ๋ค์์ I/O ์์ฒญ์ ์ํํ
์ ์๋ค.
โข ํญ์ I/O ์์ฒญ์ ์ฝ์
ํ ์ค๋ ๋๊ฐ ์๋ฃ ํต์ง๋ฅผ
์์ ํ๋ค.
I/O ์ปดํ๋ฆฌ์
ํฌํธ ์ฌ์ฉ โข ๋จ์ผ์ ์ฅ์น์ ๋ํด ๋ค์์ I/O ์์ฒญ์ ์ํํ
์ ์๋ค.
โข ํน์ ์ค๋ ๋๊ฐ I/O ์์ฒญ์ ์ฝ์
ํ๊ณ ๋ค๋ฅธ ์ค๋
๋๊ฐ ์๋ฃ ํต์ง๋ฅผ ์์ ํ ์ ์๋ค.
โข ์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ํ์ฅ์ฑ์ด ๋ฐ์ด๋๊ณ ์ ์ฐ์ฑ์ด ์
๋ค.
- 21. ๋๋ฐ์ด์ค ์ปค๋ ์ค๋ธ์ ํธ์ ์๊ทธ๋๋ง
โข ๋๋ฐ์ด์ค ์ปค๋ ์ค๋ธ์ ํธ์ ์๊ทธ๋๊ณผ ๋
ผ์๊ทธ๋ ์ํ๋ฅผ ์ด์ฉ.
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...)
BYTE bBuffer[100];
OVERLAPPED o = { 0 };
o.Offset = 345;
BOOL bReadDone = ReadFile(hFile, bBuffer, 100, NULL, &o);
DWORD dwError = GetLastError();
If (!bReadDone && (dwError == ERROR_IO_PENDING)) {
WaitForSingleObject(hFile, INFINITE);
bReadDone = TRUE;
}
If (bReadDone) {
...
}
- 22. ๋๋ฐ์ด์ค ์ปค๋ ์ค๋ธ์ ํธ์ ์๊ทธ๋๋ง
โข ๋น๋๊ธฐ I/O๋ฅผ ์ํด ๋๋ฐ์ด์ค๋ฅผ ์ด ๋ ๋ฐ๋์ FILE_FLAG_OVERLAPPED
โข OVERLAPPED ๊ตฌ์กฐ์ฒด์ Offset, OffsetHigh, hEvent ์ด๊ธฐํ
โข bReadDone์ ํ์ธํ ๋๊ธฐ์ ์ผ๋ก ์ํ๋์๋์ง ํ์ธํ๊ณ ๋๊ธฐ์ ์ด ์๋
๋ผ๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก I/O ์์
์ด ์์ฒญ๋์๋์ง ํ์ธ
โข ์ฝ๊ธฐ ์์
์๋ฃ ์ bBuffer์๋ ์ฝ์ ๋ฐ์ดํฐ๊ฐ, OVERLAPPED ๊ตฌ์กฐ์ฒด์
Internal ๋ฉค๋ฒ์๋ Error์ฝ๋๊ฐ, InternalHigh ๋ฉค๋ฒ์๋ ์ฝ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ
๊ฐ ๊ฐ๊ฐ ์ ์ฅ๋๋ค.
- 23. ๋๋ฐ์ด์ค ์ปค๋ ์ค๋ธ์ ํธ์ ์๊ทธ๋๋ง์ ๋ฌธ์ ?
HANDLE hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...)
BYTE bReadBuffer[100];
OVERLAPPED oRead = { 0 };
ReadFile(hFile, bReadBuffer, 100, NULL, &oRead);
BYTE bWriteBuffer[10] = {0, 1, 2, 3, ... };
OVERLAPPED oWrite = { 0 };
oWrite.Offset = 10;
WirteFile(hFile, bWriteBuffer, _countof(bWriteBuffer), NULL, &oWrite);
...
WaitForSingleObject(hFile, INFINITE)
// ???
- 24. ์ด๋ฒคํธ ์ปค๋ ์ค๋ธ์ ํธ์ ์๊ทธ๋๋ง
HANDLE hHandle = CreateFile(..., FILE_FLAG_OVERLAPPED, ...)
BYTE bReadBuffer[100];
OVERLAPPED oRead = { 0 };
oRead.hEvent = CreateEvent(...);
ReadFile(hFile, bReadBuffer, 100, NULL, &oRead);
BYTE bWriteBuffer[10] = {0, 1, 2, 3, ... };
OVERLAPPED oWrite = { 0 };
oWirte.hEvent = CreateEvent(...);
WirteFile(hFile, bWriteBuffer, _countof(bWriteBuffer), NULL, &oWrite);
- 25. ์ด๋ฒคํธ ์ปค๋ ์ค๋ธ์ ํธ์ ์๊ทธ๋๋ง
HANDLE h[2];
h[0] = oRead.hEvent;
h[1] = oWrite.hEvent;
DWORD dw = WaitForMultipleObjects(2, h, FALSE, INFINITE);
Switch (dw โ WAIT_OBJECT_0) {
case 0: // ์ฝ๊ธฐ ์์
์๋ฃ
break;
case 1: // ์ฐ๊ธฐ ์์
์๋ฃ
break;
}
๏ผ GetOverlappedResult(...)
๏ผ ํ์ง๋ง ํ์ฌ๋ Internal๊ณผ InternalHigh์ด ๋ฌธ์ํ
- 26. ์ผ๋ฌํฐ๋ธ I/O
๏ผ APC(Asynchronous Procedure Call)
๏ผ ์ค๋ ๋๊ฐ ์์ฑ๋๋ฉด APC ํ๋ผ ๋ถ๋ฆฌ๋ ํ๊ฐ ํ๋์ฉ ์์ฑ
๏ผ ReadFileEX / WriteFileEX
BOOL ReadFileEx (
HANDLE hFile,
PVOID pvBuffer,
DWORD nNumByteToRead,
OVERLAPPED* pOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE pfnRoutine);
VOID WINAPI CompletionRoutine (
DWORD dwError,
DWORD pwNumBytes,
OVERLAPPED* po);
- 27. ์ผ๋ฌํฐ๋ธ I/O
hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...);
ReadFileEx(hFile, ...);
WriteFileEx(hFile, ...);
ReadFileEx(hFile, ...);
SomeFunc();
Write I/O Read I/O Read I/O
๏ผ ์ค๋ ๋๋ฅผ ์ธํฐ๋ฝํธ ๊ฐ๋ฅํ ์ํ๊ฐ ๋์์์ ์๋ ค์ค์ผํ๋ค.
๏ผ ์ฆ, ์ค๋ ๋๋ฅผ ์ผ๋ฌํฐ๋ธ ์ํ๋ก ๋ณ๊ฒฝ
- 28. ์ผ๋ฌํฐ๋ธ I/O
๏ผ ์ผ๋ฌํฐ๋ธ ์ํ๋ก ๋ณ๊ฒฝํ ์ ์๋ ํจ์
โข SleepEx / WaitForSingleObjectEx / WaitForMultipleObjectsEx /
SignalObjectAndWait / GetQueuedCompletionStatusEx /
MsgWaitForMultipleObjectsEx
๏ผ ์ผ๋ฌํฐ๋ธ I/O์ ์ฅ๋จ์
โข ์ฅ์
โข ๋น๋๊ธฐ ํธ์ถ์ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด์ค๋ค..ใ
.ใ
โข ๋จ์ผ ์ค๋ ๋๋ผ์ ๋๊ธฐํ ์ฒ๋ฆฌ๋ฅผ ํ ํ์๊ฐ ์๋ค. ใ
.ใ
โข ๋จ์
โข ์ฝ๋ฐฑํจ์
โข ์ฐ๋ ๋ฉ ๋ฌธ์
- 29. I/O ์ปดํ๋ฆฌ์
ํฌํธ
โข ์ปจ์ปค๋ฐํธ ๋ชจ๋ธ
โข ์ปจ์ปค๋ฐํธ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ์๋น์ค ์ ํ๋ฆฌ์ผ์ด์
์ ์๋์ฐ์์ ๊ตฌํ
ํ์์ ๋ ์ฑ๋ฅ์ด ๊ธฐ๋๋งํผ ๋์ค์ง ์์ ๊ฐ์ ํด์ ๋์จ ๊ฒฐ๊ณผ๋ก ํ์ด๋
๊ฒ์ด ๋ฐ๋ก I/O ์ปดํ๋ฆฌ์
ํฌํธ ์ปค๋ ์ค๋ธ์ ํธ์ด๋ค
โข I/O ์ปดํ๋ฆฌ์
ํฌํธ ์์ฑ
HANDLE CreateIoCompletionPort(
HANDLE hFile,
HANDLE hExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD dwNumberOfConcurrentThreads);
- 30. I/O ์ปดํ๋ฆฌ์
ํฌํธ
HANDLE CreateNewCompletionPort (DWORD dwThreads)
{
return CreateIoCompletionPort(
INVALID_HANDLE_VALUE, NULL, 0,
dwThreads);
|
โข dwThreads
โข ๋์ผ ์๊ฐ์ ๋์์ ์ํํ ์ ์๋ ์ค๋ ๋์ ์ต๋ ๊ฐ์
โข ๋ณดํต์ CPU ๊ฐ์๋งํผ์ ์
๋ ฅ
- 31. I/O ์ปดํ๋ฆฌ์
ํฌํธ
โข I/O ์ปดํ๋ฆฌ์
ํฌํธ ์ฐ๊ณ
HANDLE CreateIoCompletionPort(
HANDLE hFile,
HANDLE hExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD dwNumberOfConcurrentThreads);
โข hFile : ์ฅ์น์ ๋ํ ํธ๋ค (ํ์ผ, ์์ผ, ๋ฉ์ผ์ฌ๋กฏ, ํ์ดํ๋ฑ)
โข hExistingCompletionPort : ์์ฑํด ๋ I/O ์ปดํ๋ฆฌ์
ํฌํธ ํธ๋ค
โข CompletionKey : ์ปดํ๋ฆฌ์
ํค (์ฌ์ฉ์๊ฐ ์์๋ก ๊ฒฐ์ ํ ์ ์๋ค.)
- 32. I/O ์ปดํ๋ฆฌ์
ํฌํธ
โข I/O ์ปดํ๋ฆฌ์
ํฌํธ ์ฐ๊ณ
BOOL AssociateDeviceWithCompletionPort(
HANDLE hDevice,
HANDLE hExistingCompletionPort,
ULONG_PTR CompletionKey,) {
HANDLE h = CreateIoCompletionPort(hDevice,
hCompletionPort, dwCompletionKey, 0);
return (h == hCompletionPort);
}
- 33. I/O ์ปดํ๋ฆฌ์
ํฌํธ
โข ์ฅ์น ๋ฆฌ์คํธ
โข I/O ์ปดํ๋ฆฌ์
ํ
โข ๋๊ธฐ ์ค๋ ๋ ํ
โข ๋ฆด๋ฆฌ์ฆ ์ค๋ ๋ ๋ฆฌ์คํธ
โข ์ผ์ ์ ์ง ์ค๋ ๋ ๋ฆฌ์คํธ
- 34. I/O ์ปดํ๋ฆฌ์
ํฌํธ
์ปค๋ ๋ชจ๋
Device List I/O Request List I/O Completion Queue
์ ์ ๋ชจ๋
WSARecv()
WSASend() GetQueuedCompletionS
CreateCompletionPort
ReadFileEX() tatus()
โฆ
- 35. I/O ์ปดํ๋ฆฌ์
ํฌํธ๋ฅผ ์ด์ฉํ ์ํคํ
์ณ ์ค๊ณ
โข ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ค๋ ๋ ํ
โข ํ ๋ด์ ๋ช ๊ฐ์ ์ค๋ ๋๋ฅผ ์์ฑํด ๋๋ ๊ฒ์ด ์ข์๊ฐ? (๋ค์๋ฐํ์๋ถ)
โข ์๋ฃ ํต์ง๊ฐ ์ ๋ฌ ๋์์ ๋ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๋ ๋๋ฅผ ๋๊ธฐ ์ํ๋ก!!
BOOL GetQueuedCompletionStatus(
HANDLE hCompletionPort,
PDWORD pdwNumberOfBytesTransferred,
PULONG_PTR pCompletionKey,
OVERLAPPED** ppOverlapped,
DWORD dwMilliseconds);
- 36. I/O ์ปดํ๋ฆฌ์
ํฌํธ๋ฅผ ์ด์ฉํ ์ํคํ
์ณ ์ค๊ณ
โข ๋๊ธฐ ์ค๋ ๋ ํ
โข ํ์
์ ์ถ(LIFO) ๋ฐฉ์์ผ๋ก ์ค๋ ๋๋ฅผ ๊นจ์ด๋ค.
โข ๋ฆด๋ฆฌ์ฆ ์ค๋ ๋ ๋ฆฌ์คํธ
โข I/O ์ปดํ๋ฆฌ์
ํฌํธ๊ฐ ๋๊ธฐ ์ค๋ ๋ ํ์ ์๋ ์ค๋ ๋๋ฅผ ๊นจ์ฐ๋ ๊ฒฝ์ฐ
โข ์ผ์ ์ ์ง๋์๋ ์ค๋ ๋๊ฐ ๋ค์ ๊นจ์ด๋ฌ์ ๊ฒฝ์ฐ
โข ์ผ์ ์ ์ง ์ค๋ ๋ ๋ฆฌ์คํธ
โข ์ํ ์ค์ด๋ ์ค๋ ๋๊ฐ ์ค๋ ๋๋ฅผ ์ ์ง์ํค๋ ํจ์๋ฅผ ํธ์ถ
โข ์ ์ง ์ค์ด๋ ์ค๋ ๋๊ฐ ๊นจ์ด๋๋ฉด ๋ฆด๋ฆฌ์ฆ ์ค๋ ๋ ๋ฆฌ์คํธ๋ก ์ฝ์
- 37. I/O ์ปดํ๋ฆฌ์
ํฌํธ์ ์ค๋ ๋ ํ ๊ด๋ฆฌ๋ฐฉ๋ฒ
โข I/O ์ปดํ๋ฆฌ์
ํฌํธ ์์ฑํ ๋ ์ง์ ํ ์ค๋ ๋ ๊ฐ์ ์ด์์ ์ด๊ณผํ ์ ์๋ค
โข ๊ทผ๋ฐ ์?! ์ด๋ณด๋ค ๋ง์ ์ค๋ ๋๋ฅผ ํ๋ก ๊ด๋ฆฌํด์ผ ํ๋๊ฐ?
โข ๋ฆด๋ฆฌ์ฆ ์ค๋ ๋ ๋ฆฌ์คํธ
โข ๋๊ธฐ ์ค๋ ๋ ๋ฆฌ์คํธ
๏ผ I/O ์ปดํ๋ฆฌ์
์ฌ์ฉ ๋ชฉ์
๏ผ CPU๊ฐ ๊ณ์ํด์ ์์
์ ์ํํ๋๋ก ์ํ๋ฅผ ์ ์งํ๋ ๊ฒ