E D R S I H C RSS
ID
Password
Join
특히 생각없이 μ €μ§€λ₯΄λŠ” μ‹€μˆ˜κ°€ μƒλŒ€μ—κ²Œ μ–΄λ–€ μƒμ²˜λ₯Ό μ£ΌλŠ”μ§€ μƒˆμ‚Ό λ°œκ²¬ν•˜κ²Œ λœλ‹€. - "10μΌμ•ˆμ— λ‚¨μžμΉœκ΅¬μ—κ²Œ μ°¨μ΄λŠ” 법" ν‰λ‘ μ—μ„œ.

λͺ©μ°¨ #

Contents

1 λͺ©μ°¨
2 μ‹œμž‘ν•˜λ©°
3 CPκ°€ 뭐지?
4 CP와 μ†ŒμΌ“κ³Όμ˜ 상관관계
5 κ΄€λ ¨ ν•¨μˆ˜ μ‚¬μš©λ²•
5.1 CP ν•Έλ“€ μ–»κΈ°
5.2 CP에 μ†ŒμΌ“ν• λ‹Ήν•˜κΈ°
5.3 μΌκΎΌμ“°λž˜λ“œ 내뢀ꡬ쑰
5.4 μΈμœ„μ μΈ μ™„λ£Œ νŒ¨ν‚· 보내기
6 MSDNλ²ˆμ—­
6.1 Completion Ports

2 μ‹œμž‘ν•˜λ©° #

  • λ§Žμ€ κ³³μ—μ„œ λ„€νŠΈμ›Œν¬ μ„œλ²„μ— λŒ€ν•œ λ‚΄μš©μ΄ λ‚˜μ˜€μ§€λ§Œ, Completion Ports에 λŒ€ν•΄ μžμ„Έν•˜κ²Œ μ„€λͺ…ν•œ 곳은 λ³„λ‘œ μ—†μ—ˆλ˜ 것 κ°™μŠ΅λ‹ˆλ‹€. 제 μžμ‹ λ„ λ…ν•™μœΌλ‘œ 얻어낸거라 약간은 정석적이지 μ•Šκ³  νŽΈλ²•μ μΈ λ‚΄μš©λ„ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. CP에 κ΄€λ ¨λœ 아티클이 μžˆλ”κ΅°μš”. μ—¬κΈ°λ₯Ό κ°€λ³΄μ‹œκΈ°λ°”λžλ‹ˆλ‹€. [http]http://www.codeproject.com/internet/iocp.asp [http]http://www.codeproject.com/internet/winsockiocp.asp
  • μ–΄λ–€ κ³³μ—μ„œλŠ” Completion Portλ₯Ό CPIO라고도 ν•˜κ³  IOCP라고도 ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” κ·Έλƒ₯ CP라고 ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
  • Overlapped I/OλŠ” OL이라고 μ€„μ—¬μ„œ μ“°κ² μŠ΅λ‹ˆλ‹€. (HTMLνƒœκ·Έκ°€ μ•„λ‹™λ‹ˆλ‹€. :( ) μ–Έμ œλ‚˜μ²˜λŸΌ 쑴칭은 μƒλž΅ν•˜κ² μŠ΅λ‹ˆλ‹€. :D

3 CPκ°€ 뭐지? #

  • 보톡 Win32 μš΄μ˜μ²΄κ³„μ—μ„œμ˜ 비동기적 μž…μΆœλ ₯을 μ§€μ›ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μž₯치라면 OLκ³Ό CP을 λ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ‹€μŒμ˜ 두가지 λͺ©μ μ„ μœ„ν•΄ μ‚¬μš©λœλ‹€κ³  볼수 있죠.
    1. λΈ”λ‘ν•˜μ§€ μ•Šκ³  μž…μΆœλ ₯을 μ§€μ‹œν•  수 μžˆλ‹€. - μ„€λ Ή ν˜„μž¬ μ†ŒμŠ€λΌμΈμ—μ„œ μž…μΆœλ ₯이 μ™„λ£Œλ˜μ§€ μ•Šμ•˜λ‹€κ³  ν•˜λ”λΌλ„ 일단은 λ‹€μŒ μ†ŒμŠ€λΌμΈμ˜ λͺ…령을 μˆ˜ν–‰ν•˜κ³  μ›ν•˜λŠ” λΆ€λΆ„μ—μ„œ 채크할 수 μžˆλ‹€.
    2. μž…μΆœλ ₯ μ’…λ£Œμ§ν›„ μ–΄λ–€ μ½”λ“œλ₯Ό μ§€μ •ν•  수 μžˆλ‹€. - 이것은 트릭과 μž”λ¨Έλ¦¬λ₯Ό λ§Œλ“€μˆ˜ μžˆλŠ” μš”μ†Œκ°€ λœλ‹€. 예λ₯Ό λ“€μ–΄ 읽기 μž‘μ—…μ΄ λλ‚˜λ©΄ λ°”λ‘œ λ‹€μŒ 읽기λ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.
  • CPλŠ” κ°„λ‹¨νžˆ λ§ν•΄μ„œ "μ–΄λ–€ μž…μΆœλ ₯의 μ’…λ£Œμ—¬λΆ€λ₯Ό 계속 보고 μžˆλ‹€κ°€ μ’…λ£Œμ‹œμ μ—μ„œ μ§€μ •λœ 처리λ₯Ό λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰ν•΄μ£ΌλŠ” μž₯치"이닀. 즉, λ°±κ·ΈλΌμš΄λ“œ 싀행이 κ°€λŠ₯ν•˜κΈ°μœ„ν•΄ μ“°λ ˆλ“œκ°€ ν•„μš”ν•˜λ‹€.
  • 'μ–΄? 그건 OLμ΄μžλ‚˜!'라고 ν•  μˆ˜λ„ μžˆκ² λ‹€. κ°œλ…μ μΈ μΈ‘λ©΄μ—μ„œλŠ” λ§žλ‹€. CP도 μž…μΆœλ ₯처리λ₯Ό μœ„ν•΄μ„œλŠ” OLκ³Ό 같이 μ‚¬μš©ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ–΄λ–»κ²Œ 보면 OL의 μ’…λ£Œμ±„ν¬λ°©λ²• 쀑 ν•˜λ‚˜λΌκ³  μ–˜κΈ°ν•΄λ„ λ§žλ‹€κ³  ν•  수 μžˆλ‹€. (OL에 λŒ€ν•œ λ‚΄μš©μ€ Overlapped I/O 이야기 μ°Έμ‘°)
  • 보톡 CP의 μœ„λ ₯이 λ°œνœ˜λ˜λŠ” 뢀뢄은 μƒλ‹Ήνžˆ λ§Žμ€ μ‚¬μš©μžκ°€ λ™μ‹œμ ‘μ†κ°€λŠ₯ν•œ μ„œλ²„λ₯Ό μ œμž‘ν•  λ•Œμ΄λ‹€. μ†ŒμΌ“λ„ ν™”μΌμ˜ μΌμ’…μ΄λΌλŠ” 것은 μ•„λ§ˆ μ•„μ‹œλ¦¬λΌκ³  λ―ΏλŠ”λ‹€. OLμžμ²΄λ§ŒμœΌλ‘œλŠ” μ—¬λŸ¬κ°œμ˜ μž…μΆœλ ₯을 λ™μ‹œμ— κ΄€λ¦¬ν•˜κΈ°λž€ 쉽지 μ•Šλ‹€. WSAWaitForMultipleEvents()ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ 이벀트 객체λ₯Ό 체크해도 64κ°œκ°€ ν•œκ³„λ‹ˆκΉ 64개 μ΄μƒμ˜ 접속을 λ§Œλ“œλŠ” 것은 무리가 μžˆλ‹€. κ²Œλ‹€κ°€ 그것듀을 λΉ„λ™κΈ°μ μœΌλ‘œ μ²΄ν¬ν•˜λ €λ©΄ 각각의 처리λ₯Ό μœ„ν•œ μ“°λ ˆλ“œλ₯Ό κ΄€λ¦¬ν•΄μ•Όν•˜λŠ” 뢀담도 생긴닀.
  • CPλŠ” CPUμ„±λŠ₯이 ν—ˆλ½ν•˜λŠ”ν•œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ§€μ •ν•œ 수의 μž…μΆœλ ₯을 λ°œμƒν•œ μˆœμ„œλŒ€λ‘œ μ²˜λ¦¬ν•˜λŠ” 역할을 ν•œλ‹€. 즉, λͺ‡ 개 μ•ˆλ˜λŠ” μ†ŒμΌ“μ²˜λ¦¬λ₯Ό μœ„ν•΄μ„œ CPλ₯Ό μ“΄λ‹€λŠ” 것은 κ°„λ‹¨ν•œ λ°©λ²•μœΌλ‘œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•œ 데도 λΆˆκ΅¬ν•˜κ³  λ³΅μž‘ν•œ 방법을 νƒν•˜λŠ” κ²½μš°κ°€ 될 수 μžˆλ‹€. (CPλŠ” ꡬ쑰상 ν•¨μˆ˜λŠ” λͺ‡ 개 μ•ˆλ˜μ§€λ§Œ μž…μΆœλ ₯ ν•¨μˆ˜μ˜ μ†ŒμŠ€μƒ μœ„μΉ˜λ₯Ό 기점으둜 μ€€λΉ„λΆ€λΆ„κ³Ό μ™„λ£ŒλΆ€λΆ„μ΄ λ‚˜λ‰˜μ–΄μ§€κΈ° λ•Œλ¬Έμ— μ „λ°˜μ μœΌλ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ쑰가 λ³΅μž‘ν•΄μ§ˆ 수 μžˆλŠ” 것이 단점이닀. μ•„λ§ˆλ„ μœˆλ„μš°μ¦ˆ μš΄μ˜μ²΄κ³„ μƒμ—μ„œλŠ” μ†ŒμΌ“κ³Ό κ²°ν•©ν•˜λ € μ œμž‘ν•  수 μžˆλŠ” κ°€μž₯ λ³΅μž‘ν•œ λͺ¨λΈμ΄λΌκ³  ν•˜κ² λ‹€.)
  • ACE λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” proactorλΌλŠ” νŒ¨ν„΄μœΌλ‘œ κ΅¬ν˜„μ΄ λ˜μ–΄μžˆλ‹€. ACE ν”„λ‘œκ·Έλž˜λ° μ°Έμ‘°.

4 CP와 μ†ŒμΌ“κ³Όμ˜ 상관관계 #


μœ„ 그림은 CP의 λ‚΄λΆ€ 처리 ꡬ쑰λ₯Ό κ°„λ‹¨ν•˜κ²Œ κ·Έλ €λ³Έ 것이닀. (μ•„~ 정말 μ°λ ν•˜λ‹€. <:( ) μœ„μ—μ„œ Socket이라고 λ˜μ–΄μžˆλŠ” 뢀뢄은 이미 CP에 λ“±λ‘λ˜μ–΄μžˆλŠ” μ†ŒμΌ“μ„ λ§ν•œλ‹€. 즉, CPμ—μ„œ μ†ŒμΌ“μ˜ μž…μΆœλ ₯을 νŒλ‹¨ν•˜λŠ” μˆœμ„œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.
  1. μš°μ„  μž…μΆœλ ₯이 λ°œμƒν•  μ†ŒμΌ“μ„ CP에 λ“±λ‘ν•œλ‹€. (μ•„λž˜ "CP에 μ†ŒμΌ“ν• λ‹Ήν•˜κΈ°"μ°Έμ‘°)
  2. μ†ŒμΌ“μ„ μ‚¬μš©ν•˜μ—¬ WSARecv/WSASendλ₯Ό μ‹€ν–‰ν•œλ‹€.
  3. ν•΄λ‹Ή

5 κ΄€λ ¨ ν•¨μˆ˜ μ‚¬μš©λ²• #

  • μš°μ„  MSDNμ—μ„œ λ¬΄μ§€ν•˜κ²Œ λ°°κΌˆμŒμ„ λ°νžŒλ‹€. CP와 κ΄€λ ¨λœ ν•¨μˆ˜λŠ” λ‹¬λž‘ 3κ°œμ΄λ‹€.
HANDLE CreateIoCompletionPort (
  HANDLE FileHandle,               // 화일핸듀. λ„€νŠΈμ›Œν¬μš©λ„λΌλ©΄ μ†ŒμΌ“ν•Έλ“€μ„ λ„£μœΌλ©΄ λœλ‹€.
  HANDLE ExistingCompletionPort,   // CPν•Έλ“€
  ULONG_PTR CompletionKey,         // μ™„λ£Œ ν‚€ ꡬ쑰체. λ‚˜μ€‘μ— μ„€λͺ….
  DWORD NumberOfConcurrentThreads  // λ™μ‹œμ— 싀행될 μ“°λ ˆλ“œμ˜ 수
);

이 ν•¨μˆ˜λŠ” νŠΉλ³„ν•˜κ²Œ 2κ°€μ§€ 역할을 ν•œλ‹€. κ·Έ 역할을 κ°„λ‹¨νžˆ μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
  • CP 자체의 ν•Έλ“€ 생성(μ΄ˆκΈ°ν™”)
  • μž…μΆœλ ₯이 λ°œμƒν•˜λŠ” 핸듀등둝 - (μ—¬κΈ°μ„œλŠ” μ†ŒμΌ“μ΄ λ˜κ² λ‹€)

5.1 CP ν•Έλ“€ μ–»κΈ° #

λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•˜μ—¬ CP핸듀을 얻을 수 μžˆλ‹€. λ¬Όλ‘  CreateIoCompletionPortλ₯Ό μ‚¬μš©ν•œλ‹€.
HANDLE hCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, NULL, NumThreads);

μœ„μ—μ„œ hCPλŠ” CP의 핸듀을 담을 λ³€μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄κ³ , NumThreadsλŠ” CP에 κ΄€λ ¨λ˜μ–΄μ Έμ„œ μ‹€ν–‰λ˜λŠ” "일꾼 μ“°λ ˆλ“œ"의 개수λ₯Ό μ˜λ―Έν•œλ‹€. 이 개수의 κ°€μž₯ 효율적인 μˆ˜μΉ˜λŠ” ν˜„μž¬ μ‹œμŠ€ν…œμ— μ„€μΉ˜λœ CPU의 μˆ˜μ΄μ§€λ§Œ 만일 μ“°λ ˆλ“œλ‚΄μ—μ„œ μˆœκ°„μ μœΌλ‘œ μ²˜λ¦¬ν•΄μ•Όν•  μ‹œκ°„μ΄ κΈΈμ–΄μ§„λ‹€λ©΄ μž„μ˜μ˜ 개수둜 μ •ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ, CP의 내뢀적인 νŠΉμ„±μƒ μ—¬κΈ°μ„œ μ§€μ •ν•œ κ°œμˆ˜μ™€ μ‹€μ œ μƒμ„±ν•œ 일꾼 μ“°λ ˆλ“œμ˜ μˆ˜λŠ” μ •ν™•νžˆ λ§žμ•„λ–¨μ–΄μ Έμ•Ό ν•œλ‹€.

만일 NumThreadsλ₯Ό 0으둜 μ„€μ •ν•˜λ©΄ ν˜„μž¬ μ‹œμŠ€ν…œμ— μ„€μΉ˜λœ CPU의 수둜 μžλ™μœΌλ‘œ μ„€μ •λœλ‹€.

5.2 CP에 μ†ŒμΌ“ν• λ‹Ήν•˜κΈ° #

Acceptλ˜μ–΄ μ•žμœΌλ‘œ 계속 Send/Recvκ°€ λ°œμƒν•  μ†ŒμΌ“ 핸듀을 connectsock이라고 ν•˜λ©΄,
if (CreateIoCompletionPort((HANDLE)connectsock, hCP, (DWORD)tCPKey, 0) == NULL)
{
   // CP μƒμ„±μ—λŸ¬. 이 μ‹œμ μ—μ„œ CPλŠ” λ“±λ‘λ˜μ–΄μžˆμ§€ μ•Šλ‹€.
}
λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•˜κ²Œ λœλ‹€. (λ§¨λ§ˆμ§€λ§‰ 인자의 λ‚΄μš©μ΄ 0인 것을 μ£Όλͺ©ν•΄λΌ. λ§ˆμ§€λ§‰μΈμžλŠ” μ†ŒμΌ“μ„ λ“±λ‘ν•˜λŠ”λ° μžˆμ–΄μ„œλŠ” μ‚¬μš©λ˜μ§€ μ•ŠλŠ”λ‹€.)

5.3 μΌκΎΌμ“°λž˜λ“œ 내뢀ꡬ쑰 #

(λ³΄μΆ©μš”λ§)
BOOL GetQueuedCompletionStatus(
  HANDLE CompletionPort,        // CPν•Έλ“€
  LPDWORD lpNumberOfBytes,      // μ „μ†‘λœ byte수λ₯Ό 담을 λ³€μˆ˜ν¬μΈν„°
  PULONG_PTR lpCompletionKey,   // μ™„λ£Œ ν‚€ ꡬ쑰체. β†‘λ‚˜ β†“μ—μ„œ λ„˜κ²¨μ€€ κ²ƒμž„.
  LPOVERLAPPED *lpOverlapped,   // OVERLAPPED ꡬ쑰체. WSARecv, WSASendμ—μ„œ λ„˜κ²¨μ£Όκ²Œ λœλ‹€.
  DWORD dwMilliseconds          // νƒ€μž„μ•„μ›ƒ.
);

5.4 μΈμœ„μ μΈ μ™„λ£Œ νŒ¨ν‚· 보내기 #

(λ³΄μΆ©μš”λ§)
BOOL PostQueuedCompletionStatus(
  HANDLE CompletionPort,                 // CPν•Έλ“€
  DWORD dwNumberOfBytesTransferred,      // μ „μ†‘λœ byte수λ₯Ό 담을 λ³€μˆ˜ν¬μΈν„°
  ULONG_PTR dwCompletionKey,             // λ„˜κ²¨μ€„ μ™„λ£Œ ν‚€ ꡬ쑰체.
  LPOVERLAPPED lpOverlapped              // OVERLAPPED ꡬ쑰체.
);

6 MSDNλ²ˆμ—­ #

6.1 Completion Ports #


(λ²ˆμ—­μ— μ˜μ—­μ΄ 많이 λ“€μ–΄κ°”μŒμ„ λ°νž™λ‹ˆλ‹€. μ• λ§€ν•œ μš©μ–΄λŠ” κ·Έλƒ₯ μ μ—ˆμŠ΅λ‹ˆλ‹€. - redpixel)

I/O completion ports are used with asynchronous I/O.
I/O CPλŠ” 비동기 μž…μΆœλ ₯κ³Ό ν•¨κ»˜ μ‚¬μš©λœλ‹€.

The CreateIoCompletionPort function associates
an I/O completion port with one or more file handles.
CreateIoCompletionPort ν•¨μˆ˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 화일 ν•Έλ“€κ³Ό CPλ₯Ό μ—°κ²°μ‹œν‚€λŠ” 역할을 ν•œλ‹€.

When an asynchronous I/O operation started
on a file handle associated with a completion port
is completed, an I/O completion packet is queued to the port.
CP와 μ—°κ²°λœ ν™”μΌν•Έλ“€μ—μ„œ 비동기 μž…μΆœλ ₯이 싀행될 λ•Œ CP νŒ¨ν‚·μ€ CP λ‚΄λΆ€μ˜ 큐에 μ μž¬λœλ‹€.


This can be used to combine the synchronization point
for multiple file handles into a single object.
이것은 단일 객체둜써의 닀쀑화일 핸듀을 μœ„ν•œ 동기적 처리λ₯Ό κ²°ν•©ν•˜κΈ°μœ„ν•΄ μ‚¬μš©λ  수 μžˆλ‹€.(?)

A thread uses the GetQueuedCompletionStatus function
to wait for a completion packet to be queued to
the completion port, rather than waiting directly
for the asynchronous I/O to complete.
μ“°λ ˆλ“œλŠ” μ§μ ‘μ μœΌλ‘œ 비동기 μž…μΆœλ ₯이 μ’…λ£Œλ˜κΈ°λ₯Ό 기닀리기 λ³΄λ‹€λŠ”, CPλ‚΄λΆ€μ˜ 큐에 적재된 μ™„λ£Œ νŒ¨ν‚·(completion packet)을 λ°›κΈ°μœ„ν•΄ GetQueuedCompletionStatusν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 같은 역할을 μˆ˜ν–‰ν•  수 μžˆλ‹€.

Threads that block their execution on a completion port
are released in last-in-first-out (LIFO) order.
CPμƒμ—μ„œ κ·Έλ“€μ˜ 싀행을 λΈ”λ‘λ‹Ήν•œ μ“°λ ˆλ“œλŠ” LIFO μˆœμ„œλ‘œμ¨ 싀행이 μž¬κ°œλœλ‹€.

This means that when a completion packet is queued to
the completion port, the system releases the last thread
to block its execution on the port.
이것은 CP에 μ™„λ£Œ νŒ¨ν‚·μ΄ μ μž¬λ˜μ—ˆμ„ λ•Œ, μ‹œμŠ€ν…œμ€ κ°€μž₯ μ΅œκ·Όμ— ν¬νŠΈμƒμ—μ„œ 싀행을 λΈ”λ‘λ‹Ήν•œ μ“°λ ˆλ“œλ₯Ό λ™μž‘μ‹œν‚¨λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

When a thread calls GetQueuedCompletionStatus,
it is associated with the specified completion port until it exits,
specifies a different completion port, or frees the completion port.
μ“°λ ˆλ“œκ°€ GetQueuedCompletionStatus을 ν˜ΈμΆœν•˜λ©΄, κ·Έ ν•¨μˆ˜μ˜ 싀행이 λλ‚ λ•ŒκΉŒμ§€ μ§€μ •λœ CP와 μ—°κ²°λ˜λ©°, λ‹€λ₯Έ CPλ₯Ό μ§€μ •ν•˜κ³  CPλ₯Ό ν•΄μ œν•œλ‹€.

A thread can be associated with at most one completion port.
μ“°λ ˆλ“œλŠ” μ΅œμ†Œν•œ ν•œκ°œμ˜ CP와 결합될 수 μžˆλ‹€.

The most important property of a completion port is the concurrency value.
CP의 κ°€μž₯ μ€‘μš”ν•œ 속성은 concurrency value이닀.

The concurrency value of a completion port is specified when the completion port is created.
CP의 concurrency valueλŠ” CPκ°€ μƒμ„±λ λ•Œ μ§€μ •λœλ‹€.

This value limits the number of runnable threads associated with the completion port.
이 값은 CP와 κ²°ν•©ν•˜μ—¬ μ‹€ν–‰κ°€λŠ₯ν•œ μ“°λ ˆλ“œμ˜ 수λ₯Ό μ œν•œν•œλ‹€.

When the total number of runnable threads associated with the completion port
reaches the concurrency value, the system blocks the execution of any subsequent threads
that specify the completion port until the number of runnable threads associated
with the completion port drops below the concurrency value.
CP와 κ²°ν•©λœ μ‹€ν–‰κ°€λŠ₯ν•œ μ“°λ ˆλ“œμ˜ μˆ˜κ°€ concurrency value에 λ‹€λ‹€λ₯΄λ©΄, μ‹œμŠ€ν…œμ€ μ‹€ν–‰κ°€λŠ₯ν•œ μ“°λ ˆλ“œμ˜ μˆ˜κ°€ concurrency valueμ•„λž˜λ‘œ λ–¨μ–΄μ§ˆλ•ŒκΉŒμ§€ μ–΄λ–€ λ‹€μŒμˆœμ„œλ₯Ό κΈ°λ‹€λ¦¬λŠ” μ“°λ ˆλ“œλΌλ„ 싀행을 λΈ”λŸ­μ‹œν‚€κ²Œ λœλ‹€.

The most efficient scenario occurs when there are completion packets waiting in the queue,
but no waits can be satisfied because the port has reached its concurrency limit.
κ°€μž₯ 효율적인 μ‹œλ‚˜λ¦¬μ˜€λŠ” μ™„λ£Œ νŒ¨ν‚·μ΄ νμ—μ„œ κΈ°λ‹€λ¦¬λŠ” λ™μ•ˆ CPκ°€ concurrency value의 ν•œκ³„μ— λ„λ‹¬ν•˜κ²Œ λ§Œλ“œλŠ” λŒ€κΈ° μ“°λ ˆλ“œκ°€ 없도둝 ν•˜λŠ” 것이닀.

In this case, when a running thread calls GetQueuedCompletionStatus,
it will immediately pick up the queued completion packet.
이 κ²½μš°μ—λŠ” 싀행쀑인 μ“°λ ˆλ“œκ°€ GetQueuedCompletionStatusλ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œ 그것은 μ¦‰μ‹œ 큐에 적재된 μ™„λ£ŒνŒ¨ν‚·μ„ κ°€μ Έμ˜€κ²Œ λœλ‹€.

No context switches will occur, because the running thread is
continually picking up completion packets and the other threads are unable to run.
μ΄λ•ŒλŠ” context switching이 λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. μ™œλƒλ©΄ μ‹€ν–‰ν•˜λŠ” μ“°λ ˆλ“œκ°€ μ—°μ†μ μœΌλ‘œ μ™„λ£Œ νŒ¨ν‚·μ„ νšλ“ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. (μ—­μ£Ό : μ΄λ•Œ λ‹€λ₯Έ μ“°λ ˆλ“œλŠ” 각각의 μ™„λ£ŒνŒ¨ν‚·μ„ μ²˜λ¦¬ν•˜κ±°λ‚˜ μ‹€ν–‰λ˜μ§€ λͺ»ν•˜κ³  λΈ”λŸ­λœλ‹€.)

The best value to pick for the concurrency value is the number of CPUs on the machine.
concurrency valueλ₯Ό μ§€μ •ν•˜κΈ° μœ„ν•œ κ°€μž₯ 졜적의 μˆ˜μΉ˜λŠ” μ‹œμŠ€ν…œμƒμ˜ CPU의 μˆ˜μ΄λ‹€.

If your transaction required a lengthy computation,
a larger concurrency value will allow more threads to run.
만일 μ—¬λŸ¬λΆ„μ˜ transactionμ²˜λ¦¬κ°€ μ–΄λŠμ •λ„ μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” 계산이면, 쒀더 큰 concurrency valueλ₯Ό μ§€μ •ν•¨μœΌλ‘œμ¨ 더 λ§Žμ€ μ“°λ ˆλ“œκ°€ μ‹€ν–‰λ˜λŠ” 것을 ν—ˆλ½ν•  수 μžˆλ‹€.

Each transaction will take longer to complete, but more transactions will
be processed at the same time.
각 transaction은 μ’…λ£Œλ˜λŠ”λ° λ”μš± 였래 κ±Έλ¦¬κ² μ§€λ§Œ, 보닀 λ§Žμ€ transaction이 λ™μ‹œμ— 처리될 것이닀.

It is easy to experiment with the concurrency value
to achieve the best effect for your application.
μ—¬λŸ¬λΆ„μ˜ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•œ μ΅œλŒ€ν•œμ˜ νš¨μœ¨μ„ λ§žμΆ”κΈ° μœ„ν•΄ concurrency value을 μ‹€ν—˜ν•˜λŠ” 것은 μ‰¬μš΄ 일일것이닀.

The PostQueuedCompletionStatus function allows an application to queue
its own special-purpose I/O completion packets to the completion port
without starting an asynchronous I/O operation.
PostQueuedCompletionStatus ν•¨μˆ˜λŠ” 비동기 μž…μΆœλ ₯ 처리λ₯Ό μ‹œμž‘ν•˜μ§€ μ•Šκ³  CPμ—κ²Œ νŠΉλ³„ν•œ λͺ©μ μ˜ CP μ™„λ£Œ νŒ¨ν‚·μ„ 큐에 μ μž¬ν• λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€.

This is useful for notifying worker threads of external events.
이것은 각 μ“°λ ˆλ“œμ—κ²Œ μ™ΈλΆ€ 이벀트λ₯Ό μΈμ‹μ‹œν‚¬λ•Œ μœ μš©ν•˜λ‹€.

The completion port is freed when there are no more references to it.
CPλŠ” 그것을 더이상 μ°Έμ‘°ν•˜μ§€ μ•Šμ„λ•Œ λ©”λͺ¨λ¦¬μ—μ„œ ν•΄μ œλœλ‹€.

The completion port handle and every file handle associated
with the completion port reference the completion port.
CPν•Έλ“€κ³Ό CP와 κ²°ν•©λœ 각 화일 핸듀은 CPλ₯Ό μ°Έμ‘°ν•œλ‹€.

All the handles must be closed to free the completion port.
To close the port handle, call the CloseHandle function.

CPλ₯Ό ν•΄μ œν•˜κΈ° μœ„ν•΄ λͺ¨λ“  핸듀듀은 λ°˜λ“œμ‹œ ν•΄μ œλ˜μ–΄μ•Ό ν•œλ‹€. CP핸듀을 λ‹«κΈ° μœ„ν•΄μ„  CloseHandleν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λΌ.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.4874 sec