Programming Server-Side Applications

³É³¯À§Å° ÆäÀÌÁö¸ñ·Ï º¯°æ³»¿ª ȯ°æ¼³Á¤ ·Î±×ÀÎ °Ë»ö: Home

Programming Server-Side Applications for Windows 2000

by Jeffrey Richter & Jason D. Clark

Chapter One: Te Discipline of Service Development

Scalability and Perfomance

¼­¹ö ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§ ¿°µÎÇØ µÎ¾î¾ß ÇÏ´Â °Í:

Chapter Two: DEVICE I/O AND INTERTHREAD COMMUNICATION

Opening and Closing Devices

Device Creational Functiion
File CreateFile("c:\test.txt")
Directory CreateFile("c:\Program Files", ..., FILE_FLAG_BACKUP_SEMANTICS)
Logical disk drive CreateFile( "\\.\C:" )
Physical disk drive CreateFile( "\\.\PHYSICALDRIVE0" )
Serial Port CreateFile( "COM1" )
Parallel port CreateFile( "LPT1" )
Mailslot server CreateMailslot( "\\.\mailslot\mailslotname" )
Mailslot client CreateFile( "\\servername\mailslot\mailslotname" )
Named pipe server CreateNamedPipe( "\\.\pipe\pipename" )
Named pipe client CreateFile( "\\servername\\pipe\pipename" )
Anonymous pipe CreatePipe client and server
Socket socket(), accept(), AcceptEx()
Console CreateConsoleScreenBuffer(), or GetStdHandle()

A Detailed Look at CreateFile

Working with File Devices

Getting a File's Size

Positioning a File Pointer

Performing Synchronous Device I/O

BOOL ReadFile(
  HANDLE hFile,                // handle to file
  LPVOID lpBuffer,             // data buffer
  DWORD nNumberOfBytesToRead,  // number of bytes to read
  LPDWORD lpNumberOfBytesRead, // number of bytes read
  LPOVERLAPPED lpOverlapped    // overlapped buffer
);

BOOL WriteFile(
  HANDLE hFile,                    // handle to file
  LPCVOID lpBuffer,                // data buffer
  DWORD nNumberOfBytesToWrite,     // number of bytes to write
  LPDWORD lpNumberOfBytesWritten,  // number of bytes written
  LPOVERLAPPED lpOverlapped        // overlapped buffer
);

BOOL FlushFileBuffers(
  HANDLE hFile  // handle to file
);

Basics of Asynchronous Device I/O

The OVERLAPPED Structure

typedef struct _OVERLAPPED { 
    ULONG_PTR  Internal;       // [out] Error code
    ULONG_PTR  InternalHigh; // [out] Numver of bytes transferred
    DWORD  Offset;               // [in] Low 32-bit file offset
    DWORD  OffsetHigh;         // [in] High 32-bit file offset
    HANDLE hEvent;              // [in] Event handle or data
} OVERLAPPED; 

#define HasOverlappedIoCompleted(pOverlapped)      ((pOverlapped)->Internal != STATUS_PENDING)

Asynchronous Device I/O Caveats

Cancelling Queued I/O Requests

Receiving Completed I/O Request Notifications

Signaling a device kernel object ÇÑ device ¿¡ ´ëÇØ ¿©·¯ I/O request°¡ µ¿½Ã¿¡ ÁøÇàÁßÀ̶ó¸é ¾µ¸¸ÇÏÁö ¾ÊÀº ¹æ¹ýÀÌÁö¸¸, ÇÑ ¾²·¹µå°¡ I/O request¸¦ ¹ß»ý½ÃÅ°°í, ´Ù¸¥ ½º·¹µå°¡ ±×°ÍÀ» ó¸®ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
Signaling an event kernel object ÇÑ device ¿¡ ´ëÇØ ¿©·¯ I/O request°¡ µ¿½Ã¿¡ ¹ß»ýÇصµ ±¦Âú´Ù. ÇÑ ¾²·¹µå°¡ I/O request¸¦ ¹ß»ý½ÃÅ°°í, ´Ù¸¥ ½º·¹µå°¡ ±×°ÍÀ» ó¸®ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
Using alertable I/O ÇÑ device ¿¡ ´ëÇØ ¿©·¯ I/O request°¡ µ¿½Ã¿¡ ¹ß»ýÇصµ ±¦Âú´Ù. I/O request¸¦ ¹ß»ý½ÃŲ ½º·¹µå°¡ ¹Ýµå½Ã ±×°ÍÀ» ó¸®ÇØ¾ß ÇÑ´Ù.
Using I/O completion ports ÇÑ device ¿¡ ´ëÇØ µ¿½Ã´Ù¹ß I/O request°¡ ¹ß»ýÇصµ ±¦Âú´Ù. ÇÑ ½º·¹µå°¡ I/O request¸¦ ¹ß»ý½ÃÅ°°í, ´Ù¸¥ ½º·¹µå°¡ ±×°ÍÀ» ó¸®ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ¼º´É°ú À¯¿¬¼ºÀÌ °¡Àå ÁÁÀº ¹æ¹ý.

Method 1. Signaling a Device Kernel Object

Method 2. Signaling an Event kernel Object

BOOL GetOverlappedResult(
  HANDLE hFile,                       // handle to file, pipe, or device
  LPOVERLAPPED lpOverlapped,          // overlapped structure
  LPDWORD lpNumberOfBytesTransferred, // bytes transferred
  BOOL bWait                          // wait option
);

Method 3. Alertable I/O

BOOL ReadFileEx(
  HANDLE hFile,                                       // handle to file
  LPVOID lpBuffer,                                    // data buffer
  DWORD nNumberOfBytesToRead,                         // number of bytes to read
  LPOVERLAPPED lpOverlapped,                          // offset
  LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // completion routine
);

BOOL WriteFileEx(
  HANDLE hFile,                                       // handle to output file
  LPCVOID lpBuffer,                                   // data buffer
  DWORD nNumberOfBytesToWrite,                        // number of bytes to write
  LPOVERLAPPED lpOverlapped,                          // overlapped buffer
  LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine // completion routine
);

VOID CALLBACK FileIOCompletionRoutine(
  DWORD dwErrorCode,                // completion code
  DWORD dwNumberOfBytesTransfered,  // number of bytes transferred
  LPOVERLAPPED lpOverlapped         // I/O information buffer
);

Method 4. I/O Completion Ports

Creating an I/O Completion Port
HANDLE CreateIoCompletionPort (
  HANDLE FileHandle,              // handle to file
  HANDLE ExistingCompletionPort,  // handle to I/O completion port
  ULONG_PTR CompletionKey,        // completion key
  DWORD NumberOfConcurrentThreads // number of threads to execute concurrently
);

HANDLE CreatenewCompletionPort( DWORD dwNumberOfConcurrentThreads ) {
  return (CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, dwNumberOfConcurrentThreads ));

Associating a Device with an I/O Completion Port
BOOL AssociateDeviceWithCompletionPort( HANDLE hCompPort, HANDLE hDevice, DWORD dwCompKey ) {
  HANDLE h = CreateIoCompletionPort( hDevice, hCompPort, dwCompKey, 0 );
  return ( h == hCompPort );
}

Archtecting Around an I/O Completion Port

BOOL GetQueuedCompletionStatus(
  HANDLE CompletionPort,       // handle to completion port
  LPDWORD lpNumberOfBytes,     // bytes transferred
  PULONG_PTR lpCompletionKey,  // file completion key
  LPOVERLAPPED *lpOverlapped,  // buffer
  DWORD dwMilliseconds         // optional timeout value
);

How the I/O Completion Port Manages the Thread Pool
  1. I/O completion À» ¸¸µé¸é¼­ concurrent threadÀÇ °³¼ö´Â CPUÀÇ °³¼ö·Î ¼¼ÆÃ.
  2. ½ÇÁ¦ ½º·¹µå´Â CPU°³¼öx2 °³¸¦ »ý¼º
  3. completed I/O°¡ Å¥¿¡ µé¾î¿À¸é completion port°¡ waiting thread¸¦ Çϳª ±ú¿ö¼­ released thread queue·Î ¿Å±è.
  4. ¸¸¾à running thread°¡ Sleep(), WaitForSingleObject()µîÀÇ sleepÀ» À¯µµÇÏ´Â ÇÔ¼ö¸¦ callÇϸé, paused thread queue·Î ¿Å°Ü°¨. À̶§, released queueÀÇ ¼ö°¡ °¨¼ÒÇϹǷΠcompletion port°¡ waiting threadÀÇ ´Ù¸¥ ½º·¹µå¸¦ ±ú¿ö completed I/O¸¦ ó¸®Çϵµ·Ï ÇÔ. (ÃÖ´ë CPUÀÇ °³¼ö!)
  5. Áß°£¿¡ paused thread°¡ ƯÁ¤ Á¶°ÇÀ» ¸¸Á·Çϸ鼭 ´Ù½Ã ±ú¾î³². completion port´Â À̸¦ °¨ÁöÇÏ°í ÀÌ ½º·¹µå¸¦ released thread queue·Î ¿Å±è. ÀÌ ¶§ ¼ø°£ÀûÀ¸·Î ÁöÁ¤Çß´ø concurrency threadÀÇ °³¼öº¸´Ù ¸¹Àº ½º·¹µå°¡ ½ÇÇàµÊ.
  6. º¸Åë ·çÇÁ¸¦ µ¹¸é¼­ ´Ù½Ã GetQueuedCompletionStatus()¸¦ È£ÃâÇÏ°Ô µÇ¹Ç·Î ÀÌ ½º·¹µå µéÀº waiting thread queue·Î µ¹¾Æ°¨.

How Many Threads in the Pool?

Simulating Completed I/O Requests
BOOL PostQueuedCompletionStatus(
  HANDLE CompletionPort,            // handle to an I/O completion port
  DWORD dwNumberOfBytesTransferred, // bytes transferred
  ULONG_PTR dwCompletionKey,        // completion key 
  LPOVERLAPPED lpOverlapped         // overlapped buffer
);

Tips From This Book


ºÐ·ù°³¹ß

¸¶Áö¸· ÆíÁýÀÏ: 2013-6-24 2:39 pm (º¯°æ»çÇ×)
3235 hits | º¯°æ³»¿ª º¸±â | ÆäÀÌÁö ¼Ò½º º¸±â