SlideShare una empresa de Scribd logo
1 de 39
๋™๊ธฐ?! ๋น„๋™๊ธฐ?!

โ€ข ๋™๊ธฐ(Synchronous) : ๋™์‹œ ๋ฐœ์ƒํ•˜๋Š”

โ€ข ๋น„๋™๊ธฐ(Asynchronous) : ๋™์‹œ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”
์žฅ์น˜๋ž€ ?!
โ€ข ์ •์˜ : ํ†ต์‹  ๊ฐ€๋Šฅํ•œ ์–ด๋–ค ๊ฒƒ

โ€ข ์ข…๋ฅ˜ : ํŒŒ์ผ, ์ง๋ ฌํฌํŠธ, ๋ฉ”์ผ์Šฌ๋กฏ, ์†Œ์ผ“, etc... (p.388 ํ‘œ 10-1)

โ€ข ํŠน์„ฑ : ์ผ๋ถ€ ์žฅ์น˜๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ™๋‹ค.
   ๏ƒผ CreateMailSlot(), CreateNamedPipe()

HANDLE hHandle = CreateFile(...                    ์ƒ์„ฑ

SetCommConfig (HANDLE hCommDev, ...
SetMailslotInfo (HANDLE hMailslot, ...             ์ด์šฉ

CloseHandle(HANDLE hObject)                        ์ข…๋ฃŒ

 !! ๋‹จ ์žฅ์น˜๊ฐ€ Socket์ด์˜€๋‹ค๋ฉด Closesocket(SOCKET s)
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)
์žฅ์น˜ ์ด์šฉํ•˜๊ธฐ
โ€ข ํŒŒ์ผ ํฌ๊ธฐ ์–ป๊ธฐ

โ€ข ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ ์ง€์ •

โ€ข ํŒŒ์ผ์˜ ๋ ์„ค์ •


BOOL GetFileSize (hFile, ...);                    ๋…ผ๋ฆฌ์ ์ธ ํฌ๊ธฐ ๋ฐ˜ํ™˜
DWORD GetCompressedFileSize (pszFileName, ...);
                                                  ๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ ๋ฐ˜ํ™˜

ReadFile (hFile, ...);                 64bit ์˜คํ”„์…‹
SetFilePointEx (hFile, ... );          ๋™๊ธฐ์ ์ธ I/O๋ฅผ ์ˆ˜ํ–‰ํ•  ์œ„์น˜



SetEndOfFile(hFile, ...);              ์ปค๋„์˜ค๋ธŒ์ ํŠธ์˜ ํŒŒ์ผ
                                       ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ
๋™๊ธฐ ์žฅ์น˜ I/O
โ€ข ๋™๊ธฐ ์žฅ์น˜ I/O ์ˆ˜ํ–‰

โ€ข ๋™๊ธฐ ์žฅ์น˜ I/O ์ทจ์†Œ (์ „์ ์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„์— ๋‹ฌ๋ ค์žˆ๋‹ค.)


BOOL ReadFile (
HANDLE            hFile,
PVOID             pvBuffer,
DWORD nNumByteToRead,
PDWORD            pdwNumBytes,
OVERLAPPED* pOverlapped);


BOOL CancelSynchronousIo (HANDLE hThread);
์ปดํ“จํ„ฐ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ์ž‘์—…๋“ค์— ๋น„ํ•ด ์žฅ์น˜ 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
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 ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ด ๋ฉค๋ฒ„๋Š” ์‹ค์ œ๋กœ ์†ก์ˆ˜์‹ ๋œ
  ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.
โ€ข Offset : ์ด ์ธ์ž์™€ ์•„๋ž˜ OffsetHigh๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ๋‚ด์—์„œ I/O ์ž‘์—…์„ ์‹œ
  ์ž‘ํ•  ์œ„์น˜๋ฅผ 64๋น„ํŠธ ์˜คํ”„์…‹ ๊ฐ’์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋™์ผํ•œ ํŒŒ์ผ ์ปค๋„
  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋น„๋™๊ธฐ I/O ์š”์ฒญ ์‹œ์—๋Š” ๋ฐ˜๋“œ์‹œ
  OVERLAPPED ๊ตฌ์กฐ์ฒด ๋‚ด์— I/O ์ž‘์—…์„ ์‹œ์ž‘ํ•  ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.



โ€ข OffsetHigh : ์œ„์˜ Offset๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋ฉฐ 32๋น„ํŠธ ์ƒ์œ„ ํŒŒ์ผ์˜ ์˜ค
  ํ”„์…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.


โ€ข hEvent : ์ด ๋ฉค๋ฒ„๋Š” I/O ์™„๋ฃŒ ํ†ต์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์˜
  ๋ฐฉ๋ฒ•์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ์–ผ๋Ÿฌํ„ฐ๋ธ” I/O ํ†ต์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์‚ฌ
  ์šฉ์ž ์ž„์˜๋กœ ์ด ๋ฉค๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
โ€ข ๋น„๋™๊ธฐ I/O ์š”์ฒญ์ด ์™„๋ฃŒ๋˜๋ฉด I/O ์š”์ฒญ ์‹œ ์‚ฌ์šฉํ–ˆ๋˜
     OVERLAPPED ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋Œ๋ ค์ฃผ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด
     ๊ตฌ์กฐ์ฒด์— ์žฅ์น˜ ํ•ธ๋“ค์ด๋‚˜ ์œ ์šฉํ•œ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋งŒํ•œ
     ๋ฉค๋ฒ„๋ฅผ ํฌํ•จ์‹œ์ผœ์„œ ์ž‘์„ฑํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

Enum IOType
{
        OP_RECV,
        OP_SEND
}
class OVERLAPPEDEX : public OVERLAPPED
{
        IOType       m_eIOType;
        SOCKET       m_hSocket;
};
๋น„๋™๊ธฐ ์žฅ์น˜ 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 ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€
  ์˜ฎ๊ฒจ์ง€๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
์š”์ฒญ๋œ ์žฅ์น˜ I/O์˜ ์ทจ์†Œ


โ€ข   CancelIo ํ•จ์ˆ˜ ํ˜ธ์ถœ
    โ€ข   ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฝ์ž…ํ•œ ๋ชจ๋“  I/O ์š”์ฒญ ์ทจ์†Œ


โ€ข   ์žฅ์น˜์— ๋Œ€ํ•œ ํ•ธ๋“ค ๋‹ซ๊ธฐ
    โ€ข   ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ I/O ์š”์ฒญ์„ ์‚ฝ์ž…ํ•œ์ง€ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  I/O ์š”์ฒญ ์ทจ์†Œ


โ€ข   ํ•ธ๋“ค์ด I/O ์ปดํ”Œ๋ ˆ์ด์…˜ ํฌํŠธ์™€ ์—ฐ๊ณ„๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด, ์Šค๋ ˆ๋“œ๊ฐ€
    ์ข…๋ฃŒ๋  ๋•Œ ์ข…๋ฃŒ๋œ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฝ์ž…ํ•˜์˜€๋˜ ๋ชจ๋“  I/O ์š”์ฒญ์ด ์ทจ์†Œ


โ€ข   ํŠน์ • ์žฅ์น˜์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ I/O ์š”์ฒญ๋งŒ ์ทจ์†Œํ•  ๋•Œ
    โ€ข   CancelIoEx ํ•จ์ˆ˜ ํ˜ธ์ถœ
์™„๋ฃŒ ํ†ต์ง€ ๋ฐฉ๋ฒ•?


โ€ข   ๋น„๋™๊ธฐ ํ˜ธ์ถœ์€ ์–ธ์ œ ์™„๋ฃŒ๋  ์ง€ ์•Œ ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— I/O ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์™„๋ฃŒ
    ๋œ ์‚ฌ์‹ค์„ ํ†ต์ง€ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
์™„๋ฃŒ ํ†ต์ง€ ๋ฐฉ๋ฒ•?

๋ฐฉ๋ฒ•                  ์š”์•ฝ

๋””๋ฐ”์ด์Šค ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ ์‹œ๊ทธ๋„๋ง   โ€ข   ๋‹จ์ผ์˜ ์žฅ์น˜์— ๋Œ€ํ•ด ๋‹ค์ˆ˜์˜ I/O ์š”์ฒญ ์ ํ•ฉํ•˜์ง€
                        ์•Š๋‹ค.
                    โ€ข   ํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ I/O ์š”์ฒญ์„ ์‚ฝ์ž…ํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ
                        ๋“œ๊ฐ€ ์™„๋ฃŒ ํ†ต์ง€๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฒคํŠธ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ๊ทธ๋„๋ง   โ€ข   ๋‹จ์ผ์˜ ์žฅ์น˜์— ๋Œ€ํ•ด ๋‹ค์ˆ˜์˜ I/O ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ• 
                        ์ˆ˜ ์žˆ๋‹ค.
                    โ€ข   ํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ I/O ์š”์ฒญ์„ ์‚ฝ์ž…ํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ
                        ๋“œ๊ฐ€ ์™„๋ฃŒ ํ†ต์ง€๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
์–ผ๋Ÿฌํ„ฐ๋ธ” I/O ์‚ฌ์šฉ         โ€ข   ๋‹จ์ผ์˜ ์žฅ์น˜์— ๋Œ€ํ•ด ๋‹ค์ˆ˜์˜ I/O ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ• 
                        ์ˆ˜ ์žˆ๋‹ค.
                    โ€ข   ํ•ญ์ƒ I/O ์š”์ฒญ์„ ์‚ฝ์ž…ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ์™„๋ฃŒ ํ†ต์ง€๋ฅผ
                        ์ˆ˜์‹ ํ•œ๋‹ค.
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ ์‚ฌ์šฉ      โ€ข   ๋‹จ์ผ์˜ ์žฅ์น˜์— ๋Œ€ํ•ด ๋‹ค์ˆ˜์˜ I/O ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ• 
                        ์ˆ˜ ์žˆ๋‹ค.
                    โ€ข   ํŠน์ • ์Šค๋ ˆ๋“œ๊ฐ€ I/O ์š”์ฒญ์„ ์‚ฝ์ž…ํ•˜๊ณ  ๋‹ค๋ฅธ ์Šค๋ ˆ
                        ๋“œ๊ฐ€ ์™„๋ฃŒ ํ†ต์ง€๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.
                    โ€ข   ์ด ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๊ณ  ์œ ์—ฐ์„ฑ์ด ์žˆ
                        ๋‹ค.
๋””๋ฐ”์ด์Šค ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ๊ทธ๋„๋ง


 โ€ข   ๋””๋ฐ”์ด์Šค ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ๊ทธ๋„๊ณผ ๋…ผ์‹œ๊ทธ๋„ ์ƒํƒœ๋ฅผ ์ด์šฉ.

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) {
...
}
๋””๋ฐ”์ด์Šค ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ๊ทธ๋„๋ง


โ€ข   ๋น„๋™๊ธฐ I/O๋ฅผ ์œ„ํ•ด ๋””๋ฐ”์ด์Šค๋ฅผ ์—ด ๋•Œ ๋ฐ˜๋“œ์‹œ FILE_FLAG_OVERLAPPED

โ€ข   OVERLAPPED ๊ตฌ์กฐ์ฒด์˜ Offset, OffsetHigh, hEvent ์ดˆ๊ธฐํ™”

โ€ข   bReadDone์„ ํ™•์ธํ›„ ๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ๋™๊ธฐ์ ์ด ์•„๋‹ˆ
    ๋ผ๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ I/O ์ž‘์—…์ด ์š”์ฒญ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

โ€ข   ์ฝ๊ธฐ ์ž‘์—… ์™„๋ฃŒ ์‹œ bBuffer์—๋Š” ์ฝ์€ ๋ฐ์ดํ„ฐ๊ฐ€, OVERLAPPED ๊ตฌ์กฐ์ฒด์˜
    Internal ๋ฉค๋ฒ„์—๋Š” Error์ฝ”๋“œ๊ฐ€, InternalHigh ๋ฉค๋ฒ„์—๋Š” ์ฝ์€ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ
    ๊ฐ€ ๊ฐ๊ฐ ์ €์žฅ๋œ๋‹ค.
๋””๋ฐ”์ด์Šค ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ๊ทธ๋„๋ง์˜ ๋ฌธ์ œ ?

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)

// ???
์ด๋ฒคํŠธ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ๊ทธ๋„๋ง


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);
์ด๋ฒคํŠธ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ๊ทธ๋„๋ง


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์ด ๋ฌธ์„œํ™”
์–ผ๋Ÿฌํ„ฐ๋ธ” 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);
์–ผ๋Ÿฌํ„ฐ๋ธ” I/O

hFile = CreateFile(..., FILE_FLAG_OVERLAPPED, ...);


ReadFileEx(hFile, ...);
WriteFileEx(hFile, ...);
ReadFileEx(hFile, ...);


SomeFunc();


Write I/O     Read I/O     Read I/O




๏ƒผ ์Šค๋ ˆ๋“œ๋ฅผ ์ธํ„ฐ๋ŸฝํŠธ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์Œ์„ ์•Œ๋ ค์ค˜์•ผํ•œ๋‹ค.
     ๏ƒผ ์ฆ‰, ์Šค๋ ˆ๋“œ๋ฅผ ์–ผ๋Ÿฌํ„ฐ๋ธ” ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
์–ผ๋Ÿฌํ„ฐ๋ธ” I/O

๏ƒผ ์–ผ๋Ÿฌํ„ฐ๋ธ” ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
โ€ข   SleepEx / WaitForSingleObjectEx / WaitForMultipleObjectsEx /
    SignalObjectAndWait / GetQueuedCompletionStatusEx /
    MsgWaitForMultipleObjectsEx



๏ƒผ ์–ผ๋Ÿฌํ„ฐ๋ธ” I/O์˜ ์žฅ๋‹จ์ 
โ€ข   ์žฅ์ 
     โ€ข   ๋น„๋™๊ธฐ ํ˜ธ์ถœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค..ใ… .ใ… 
     โ€ข   ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋ผ์„œ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ใ… .ใ… 
โ€ข   ๋‹จ์ 
     โ€ข   ์ฝœ๋ฐฑํ•จ์ˆ˜
     โ€ข   ์“ฐ๋ ˆ๋”ฉ ๋ฌธ์ œ
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ


โ€ข    ์ปจ์ปค๋ŸฐํŠธ ๋ชจ๋ธ
      โ€ข   ์ปจ์ปค๋ŸฐํŠธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œˆ๋„์šฐ์—์„œ ๊ตฌํ˜„
          ํ•˜์˜€์„ ๋•Œ ์„ฑ๋Šฅ์ด ๊ธฐ๋Œ€๋งŒํผ ๋‚˜์˜ค์ง€ ์•Š์ž ๊ฐœ์„ ํ•ด์„œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋กœ ํƒœ์–ด๋‚œ
          ๊ฒƒ์ด ๋ฐ”๋กœ I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค

โ€ข    I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ ์ƒ์„ฑ

    HANDLE CreateIoCompletionPort(
           HANDLE hFile,
           HANDLE hExistingCompletionPort,
           ULONG_PTR CompletionKey,
           DWORD dwNumberOfConcurrentThreads);
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ

    HANDLE CreateNewCompletionPort (DWORD dwThreads)
    {
              return CreateIoCompletionPort(
                      INVALID_HANDLE_VALUE, NULL, 0,
                      dwThreads);
    |

โ€ข       dwThreads
         โ€ข   ๋™์ผ ์‹œ๊ฐ„์— ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜
         โ€ข   ๋ณดํ†ต์€ CPU ๊ฐœ์ˆ˜๋งŒํผ์„ ์ž…๋ ฅ
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ

โ€ข    I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ ์—ฐ๊ณ„

    HANDLE CreateIoCompletionPort(
           HANDLE hFile,
           HANDLE hExistingCompletionPort,
           ULONG_PTR CompletionKey,
           DWORD dwNumberOfConcurrentThreads);


โ€ข    hFile : ์žฅ์น˜์— ๋Œ€ํ•œ ํ•ธ๋“ค (ํŒŒ์ผ, ์†Œ์ผ“, ๋ฉ”์ผ์Šฌ๋กฏ, ํŒŒ์ดํ”„๋“ฑ)
โ€ข    hExistingCompletionPort : ์ƒ์„ฑํ•ด ๋‘” I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ ํ•ธ๋“ค
โ€ข    CompletionKey : ์ปดํ”Œ๋ฆฌ์…˜ ํ‚ค (์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.)
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ

โ€ข       I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ ์—ฐ๊ณ„

    BOOL AssociateDeviceWithCompletionPort(
            HANDLE hDevice,
            HANDLE hExistingCompletionPort,
            ULONG_PTR CompletionKey,) {


            HANDLE h = CreateIoCompletionPort(hDevice,
            hCompletionPort, dwCompletionKey, 0);
            return (h == hCompletionPort);
    }
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ

              โ€ข ์žฅ์น˜ ๋ฆฌ์ŠคํŠธ


              โ€ข I/O ์ปดํ”Œ๋ฆฌ์…˜ ํ



              โ€ข ๋Œ€๊ธฐ ์Šค๋ ˆ๋“œ ํ



              โ€ข ๋ฆด๋ฆฌ์ฆˆ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ



              โ€ข ์ผ์‹œ ์ •์ง€ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ

์ปค๋„ ๋ชจ๋“œ


      Device List       I/O Request List   I/O Completion Queue




์œ ์ € ๋ชจ๋“œ

                           WSARecv()
                          WSASend()        GetQueuedCompletionS
 CreateCompletionPort
                          ReadFileEX()            tatus()
                              โ€ฆ
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ๋ฅผ ์ด์šฉํ•œ ์•„ํ‚คํ…์ณ ์„ค๊ณ„

โ€ข    ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์Šค๋ ˆ๋“œ ํ’€
      โ€ข   ํ’€ ๋‚ด์— ๋ช‡ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹์€๊ฐ€? (๋‹ค์Œ๋ฐœํ‘œ์ž๋ถ„)
โ€ข    ์™„๋ฃŒ ํ†ต์ง€๊ฐ€ ์ „๋‹ฌ ๋˜์—ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šค๋ ˆ๋“œ๋ฅผ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ!!


    BOOL GetQueuedCompletionStatus(
           HANDLE hCompletionPort,
           PDWORD pdwNumberOfBytesTransferred,
           PULONG_PTR pCompletionKey,
           OVERLAPPED** ppOverlapped,
           DWORD dwMilliseconds);
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ๋ฅผ ์ด์šฉํ•œ ์•„ํ‚คํ…์ณ ์„ค๊ณ„

โ€ข   ๋Œ€๊ธฐ ์Šค๋ ˆ๋“œ ํ
    โ€ข   ํ›„์ž…์„ ์ถœ(LIFO) ๋ฐฉ์‹์œผ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šด๋‹ค.
โ€ข   ๋ฆด๋ฆฌ์ฆˆ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ
    โ€ข   I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ๊ฐ€ ๋Œ€๊ธฐ ์Šค๋ ˆ๋“œ ํ์— ์žˆ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šฐ๋Š” ๊ฒฝ์šฐ
    โ€ข   ์ผ์‹œ ์ •์ง€๋˜์—ˆ๋˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‹ค์‹œ ๊นจ์–ด๋‚ฌ์„ ๊ฒฝ์šฐ
โ€ข   ์ผ์‹œ ์ •์ง€ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ
    โ€ข   ์ˆ˜ํ–‰ ์ค‘์ด๋˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์Šค๋ ˆ๋“œ๋ฅผ ์ •์ง€์‹œํ‚ค๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
    โ€ข   ์ •์ง€ ์ค‘์ด๋˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊นจ์–ด๋‚˜๋ฉด ๋ฆด๋ฆฌ์ฆˆ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ๋กœ ์‚ฝ์ž…
I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ์˜ ์Šค๋ ˆ๋“œ ํ’€ ๊ด€๋ฆฌ๋ฐฉ๋ฒ•

โ€ข   I/O ์ปดํ”Œ๋ฆฌ์…˜ ํฌํŠธ ์ƒ์„ฑํ•  ๋•Œ ์ง€์ •ํ•œ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜ ์ด์ƒ์„ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋‹ค
โ€ข   ๊ทผ๋ฐ ์™œ?! ์ด๋ณด๋‹ค ๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ํ’€๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
    โ€ข   ๋ฆด๋ฆฌ์ฆˆ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ
    โ€ข   ๋Œ€๊ธฐ ์Šค๋ ˆ๋“œ ๋ฆฌ์ŠคํŠธ


๏ƒผ I/O ์ปดํ”Œ๋ฆฌ์…˜ ์‚ฌ์šฉ ๋ชฉ์ 
    ๏ƒผ CPU๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ
Windows via C/C++ Chapter 10
Windows via C/C++ Chapter 10

Mรกs contenido relacionado

La actualidad mรกs candente

ํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œ
ํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œ
ํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œ
์„ฑ์ฃผ ์ด
ย 
[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11
[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11
[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11
ํฅ๋ฐฐ ์ตœ
ย 
[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)
[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)
[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)
Sang Don Kim
ย 
C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€
C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€
C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€
Gwangwhi Mah
ย 
์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013
์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013
์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013
Esun Kim
ย 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungee
scor7910
ย 

La actualidad mรกs candente (20)

Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒBoost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
Boost๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜๋‚ด๋ถ€๊ตฌ์กฐ 20151111 ์„œ์ง„ํƒ
ย 
Windows reversing study_basic_5
Windows reversing study_basic_5Windows reversing study_basic_5
Windows reversing study_basic_5
ย 
ํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œ
ํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œ
ํŒŒ์ด์ฌ 2์™€ ์œ ๋‹ˆ์ฝ”๋“œ
ย 
[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11
[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11
[KGC 2011]Boost ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ C++11
ย 
Web hacking introduction
Web hacking introductionWeb hacking introduction
Web hacking introduction
ย 
Javascript ๊ต์œก์ž๋ฃŒ pdf
Javascript ๊ต์œก์ž๋ฃŒ pdfJavascript ๊ต์œก์ž๋ฃŒ pdf
Javascript ๊ต์œก์ž๋ฃŒ pdf
ย 
[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)
[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)
[Td 2015]๋…น์Šจ c++ ์ฝ”๋“œ์— ๋ชจ๋˜ c++๋กœ ๊ธฐ๋ฆ„์น ํ•˜๊ธฐ(์˜ฅ์ฐฌํ˜ธ)
ย 
C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€
C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€
C++ 11 ์— ๋Œ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์•Œ์•„๋ด…์‹œ๋‹ค 1๋ถ€
ย 
์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013
์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013
์‚ฌ๋ก€๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณด๋Š” ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ์ตœ์ ํ™” NDC2013
ย 
Near field communication
Near field communicationNear field communication
Near field communication
ย 
Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungee
ย 
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
ย 
System+os study 1
System+os study 1System+os study 1
System+os study 1
ย 
Windows reversing study_basic_1
Windows reversing study_basic_1Windows reversing study_basic_1
Windows reversing study_basic_1
ย 
8 swift แ„Œแ…ฎแ†ผแ„Žแ…ฅแ†ธแ„’แ…กแ†ทแ„‰แ…ฎ
8 swift แ„Œแ…ฎแ†ผแ„Žแ…ฅแ†ธแ„’แ…กแ†ทแ„‰แ…ฎ8 swift แ„Œแ…ฎแ†ผแ„Žแ…ฅแ†ธแ„’แ…กแ†ทแ„‰แ…ฎ
8 swift แ„Œแ…ฎแ†ผแ„Žแ…ฅแ†ธแ„’แ…กแ†ทแ„‰แ…ฎ
ย 
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique์˜ ๋ฐœ์ „๊ณผ ์ตœ์‹  ํŠธ๋žœ๋“œ
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique์˜ ๋ฐœ์ „๊ณผ ์ตœ์‹  ํŠธ๋žœ๋“œ[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique์˜ ๋ฐœ์ „๊ณผ ์ตœ์‹  ํŠธ๋žœ๋“œ
[2012 CodeEngn Conference 07] manGoo - Exploit Writing Technique์˜ ๋ฐœ์ „๊ณผ ์ตœ์‹  ํŠธ๋žœ๋“œ
ย 
GopherCon Korea 2015 - Python ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Go (์ด๊ฒฝ์ฐฌ)
GopherCon Korea 2015 - Python ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Go (์ด๊ฒฝ์ฐฌ)GopherCon Korea 2015 - Python ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Go (์ด๊ฒฝ์ฐฌ)
GopherCon Korea 2015 - Python ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ Go (์ด๊ฒฝ์ฐฌ)
ย 
Pwnable study basic_3
Pwnable study basic_3Pwnable study basic_3
Pwnable study basic_3
ย 
[2008 CodeEngn Conference 02] seaofglass - Immunity Debugger ํ™œ์šฉ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘
[2008 CodeEngn Conference 02] seaofglass - Immunity Debugger ํ™œ์šฉ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘[2008 CodeEngn Conference 02] seaofglass - Immunity Debugger ํ™œ์šฉ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘
[2008 CodeEngn Conference 02] seaofglass - Immunity Debugger ํ™œ์šฉ๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ œ์ž‘
ย 
Windows reversing study_basic_2
Windows reversing study_basic_2Windows reversing study_basic_2
Windows reversing study_basic_2
ย 

Similar a Windows via C/C++ Chapter 10

10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io
10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io
10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io
ssuser3fb17c
ย 
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€
ํ™์ค€ ๊น€
ย 
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„
ํ™์ค€ ๊น€
ย 
Iocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ด
Iocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ดIocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ด
Iocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ด
Nam Hyeonuk
ย 
[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C# ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C#  ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C#  ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C# ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
Sungkyun Kim
ย 

Similar a Windows via C/C++ Chapter 10 (20)

10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io
10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io
10 ๋™๊ธฐ๋ฐ๋น„๋™๊ธฐ์žฅ์น˜io
ย 
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€
ย 
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„
11์žฅ ์œˆ๋„์šฐ ์Šค๋ ˆ๋“œ ํ’€ + 12์žฅ ํŒŒ์ด๋ฒ„
ย 
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œOverlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
Overlapped IO์™€ IOCP ์กฐ์‚ฌ ๋ฐœํ‘œ
ย 
GCGC- CGCII ์„œ๋ฒ„ ์—”์ง„์— ์ ์šฉ๋œ ๊ธฐ์ˆ  (4) - Executing System
GCGC- CGCII ์„œ๋ฒ„ ์—”์ง„์— ์ ์šฉ๋œ ๊ธฐ์ˆ  (4) - Executing SystemGCGC- CGCII ์„œ๋ฒ„ ์—”์ง„์— ์ ์šฉ๋œ ๊ธฐ์ˆ  (4) - Executing System
GCGC- CGCII ์„œ๋ฒ„ ์—”์ง„์— ์ ์šฉ๋œ ๊ธฐ์ˆ  (4) - Executing System
ย 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. Job
ย 
Device driver
Device driverDevice driver
Device driver
ย 
Iocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ด
Iocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ดIocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ด
Iocp ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํ•ด
ย 
[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C# ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C#  ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C#  ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
[KGC2014] ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ C++ - C# ํ˜ผํ•ฉ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ๊ฒŒ์ž„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
ย 
NodeJs๋กœ ๋””๋ฐ”์ด์Šค ํ†ต์‹ ํ•˜๊ธฐ
NodeJs๋กœ ๋””๋ฐ”์ด์Šค ํ†ต์‹ ํ•˜๊ธฐNodeJs๋กœ ๋””๋ฐ”์ด์Šค ํ†ต์‹ ํ•˜๊ธฐ
NodeJs๋กœ ๋””๋ฐ”์ด์Šค ํ†ต์‹ ํ•˜๊ธฐ
ย 
Tizen main loop ์ดํ•ด
Tizen main loop ์ดํ•ดTizen main loop ์ดํ•ด
Tizen main loop ์ดํ•ด
ย 
I phone 2 release
I phone 2 releaseI phone 2 release
I phone 2 release
ย 
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open APIDo IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
Do IoT Yourself! - ์‚ฌ๋ฌผ ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ Open API
ย 
NODE.JS ๊ธ€๋กœ๋ฒŒ ๊ธฐ์—… ์ ์šฉ ์‚ฌ๋ก€ ๊ทธ๋ฆฌ๊ณ , real-time ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ
NODE.JS ๊ธ€๋กœ๋ฒŒ ๊ธฐ์—… ์ ์šฉ ์‚ฌ๋ก€  ๊ทธ๋ฆฌ๊ณ , real-time ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐNODE.JS ๊ธ€๋กœ๋ฒŒ ๊ธฐ์—… ์ ์šฉ ์‚ฌ๋ก€  ๊ทธ๋ฆฌ๊ณ , real-time ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ
NODE.JS ๊ธ€๋กœ๋ฒŒ ๊ธฐ์—… ์ ์šฉ ์‚ฌ๋ก€ ๊ทธ๋ฆฌ๊ณ , real-time ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ
ย 
eclipse์—์„œ intelliJ IDEA๋กœ
eclipse์—์„œ intelliJ IDEA๋กœeclipse์—์„œ intelliJ IDEA๋กœ
eclipse์—์„œ intelliJ IDEA๋กœ
ย 
I os push: ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋‚ ์”จ, ๋Œ€๊ธฐํ™˜๊ฒฝ ์—ก
I os push:  ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ  ๋‚ ์”จ, ๋Œ€๊ธฐํ™˜๊ฒฝ ์—กI os push:  ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ  ๋‚ ์”จ, ๋Œ€๊ธฐํ™˜๊ฒฝ ์—ก
I os push: ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋‚ ์”จ, ๋Œ€๊ธฐํ™˜๊ฒฝ ์—ก
ย 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
ย 
Init to systemd
Init to systemdInit to systemd
Init to systemd
ย 
OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
ย 
Open vSwitch์˜ Vendor Extension ๊ตฌํ˜„
Open vSwitch์˜ Vendor Extension ๊ตฌํ˜„Open vSwitch์˜ Vendor Extension ๊ตฌํ˜„
Open vSwitch์˜ Vendor Extension ๊ตฌํ˜„
ย 

รšltimo

Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)
Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)
Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)
Wonjun Hwang
ย 
Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)
Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)
Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)
Wonjun Hwang
ย 

รšltimo (6)

A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
ย 
Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)
Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)
Console API (Kitworks Team Study ๋ฐฑํ˜œ์ธ ๋ฐœํ‘œ์ž๋ฃŒ)
ย 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
ย 
์บ๋“œ์•ค๊ทธ๋ž˜ํ”ฝ์Šค 2024๋…„ 5์›”ํ˜ธ ๋ชฉ์ฐจ
์บ๋“œ์•ค๊ทธ๋ž˜ํ”ฝ์Šค 2024๋…„ 5์›”ํ˜ธ ๋ชฉ์ฐจ์บ๋“œ์•ค๊ทธ๋ž˜ํ”ฝ์Šค 2024๋…„ 5์›”ํ˜ธ ๋ชฉ์ฐจ
์บ๋“œ์•ค๊ทธ๋ž˜ํ”ฝ์Šค 2024๋…„ 5์›”ํ˜ธ ๋ชฉ์ฐจ
ย 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
ย 
Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)
Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)
Merge (Kitworks Team Study ์ด์„ฑ์ˆ˜ ๋ฐœํ‘œ์ž๋ฃŒ 240426)
ย 

Windows via C/C++ Chapter 10

  • 1.
  • 2.
  • 3. ๋™๊ธฐ?! ๋น„๋™๊ธฐ?! โ€ข ๋™๊ธฐ(Synchronous) : ๋™์‹œ ๋ฐœ์ƒํ•˜๋Š” โ€ข ๋น„๋™๊ธฐ(Asynchronous) : ๋™์‹œ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”
  • 4.
  • 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)
  • 7.
  • 8. ์žฅ์น˜ ์ด์šฉํ•˜๊ธฐ โ€ข ํŒŒ์ผ ํฌ๊ธฐ ์–ป๊ธฐ โ€ข ํŒŒ์ผ ํฌ์ธํ„ฐ ์œ„์น˜ ์ง€์ • โ€ข ํŒŒ์ผ์˜ ๋ ์„ค์ • BOOL GetFileSize (hFile, ...); ๋…ผ๋ฆฌ์ ์ธ ํฌ๊ธฐ ๋ฐ˜ํ™˜ DWORD GetCompressedFileSize (pszFileName, ...); ๋ฌผ๋ฆฌ์ ์ธ ํฌ๊ธฐ ๋ฐ˜ํ™˜ ReadFile (hFile, ...); 64bit ์˜คํ”„์…‹ SetFilePointEx (hFile, ... ); ๋™๊ธฐ์ ์ธ I/O๋ฅผ ์ˆ˜ํ–‰ํ•  ์œ„์น˜ SetEndOfFile(hFile, ...); ์ปค๋„์˜ค๋ธŒ์ ํŠธ์˜ ํŒŒ์ผ ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ
  • 9.
  • 10. ๋™๊ธฐ ์žฅ์น˜ I/O โ€ข ๋™๊ธฐ ์žฅ์น˜ I/O ์ˆ˜ํ–‰ โ€ข ๋™๊ธฐ ์žฅ์น˜ I/O ์ทจ์†Œ (์ „์ ์œผ๋กœ ๋“œ๋ผ์ด๋ฒ„์— ๋‹ฌ๋ ค์žˆ๋‹ค.) BOOL ReadFile ( HANDLE hFile, PVOID pvBuffer, DWORD nNumByteToRead, PDWORD pdwNumBytes, OVERLAPPED* pOverlapped); BOOL CancelSynchronousIo (HANDLE hThread);
  • 11.
  • 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 ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • 18.
  • 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๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ