[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° (1)

2022. 1. 30. 18:04Β·πŸ“ Book/✏ Game Server

3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ°

μ†ŒμΌ“μ€ 기본적으둜 파일 ν•Έλ“€κ³Ό λΉ„μŠ·ν•˜λ‹€. λ””μŠ€ν¬μ— κΈ°λ‘ν•˜κ±°λ‚˜ 읽어 듀일 λ•Œ 파일 핸듀을 μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ λ„€νŠΈμ›Œν¬λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜κ±°λ‚˜ 받을 λ•Œ μ†ŒμΌ“ 핸듀을 μ‚¬μš©ν•œλ‹€.

 

온라인 κ²Œμž„ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ†ŒμΌ“μ€ 파일 ν•Έλ“€ λ°©μ‹κ³ΌλŠ” μ•½κ°„ λ‹€λ₯΄λ‹€.

  • TCP둜 ν†΅μ‹ ν•˜λŠ” 경우 ν΄λΌμ΄μ–ΈνŠΈ 개수만큼 μ†ŒμΌ“μ΄ μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ κ²Œμž„ μ„œλ²„μ—μ„œ 닀루어야 ν•˜λŠ” μ†ŒμΌ“ κ°œμˆ˜κ°€ λ§Žλ‹€.
  • 파일 핸듀을 ν•˜λŠ” λ™μ•ˆ μŠ€λ ˆλ“œκ°€ λŒ€κΈ°ν•˜λŠ” 일이 μ—†μ–΄μ•Ό ν•œλ‹€.

 

μ΄λŸ¬ν•œ νŠΉμ§•μœΌλ‘œ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ†ŒμΌ“μ€ 보톡 비동기 μž…μΆœλ ₯ μƒνƒœλ‘œ 닀룬닀. 비동기 μž…μΆœλ ₯ λ°©μ‹μ—λŠ” 크게 λ…ΌλΈ”λ‘œν‚Ή μ†ŒμΌ“ 방식과 Overlapped I/O 방식이 μžˆλ‹€. 그리고 이 방식을 μ§„λ³΄μ‹œν‚¨ epollκ³Ό IOCP(I/O Completion Port) 방식이 많이 ν™œμš©λœλ‹€.

 

1. λΈ”λ‘œν‚Ή μ†ŒμΌ“

λ””λ°”μ΄μŠ€μ— 처리 μš”μ²­μ„ κ±Έμ–΄ 놓고 응닡을 λŒ€κΈ°ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μŠ€λ ˆλ“œμ—μ„œ λ°œμƒν•˜λŠ” λŒ€κΈ° ν˜„μƒμ„ λΈ”λ‘œν‚Ήμ΄λΌ ν•œλ‹€. μ†ŒμΌ“λΏλ§Œ μ•„λ‹ˆλΌ 파일 핸듀에 λŒ€ν•œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œλ„ μ΄λŸ¬ν•œ λŒ€κΈ° ν˜„μƒμ΄ λ°œμƒν•˜λŠ” 것을 λͺ¨λ‘ λΈ”λ‘œν‚Ήμ΄λΌ ν•œλ‹€.

 

λ””λ°”μ΄μŠ€μ— 일을 μ‹œν‚€λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν›„ μŠ€λ ˆλ“œκ°€ λŒ€κΈ° μƒνƒœλœ 상황

 

λΈ”λ‘œν‚Ήμ΄ λ°œμƒν•œ μŠ€λ ˆλ“œμ—μ„œλŠ” CPU 연산을 ν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, μŠ€λ ˆλ“œλŠ” waitable state인 μƒνƒœμ΄λ‹€. 이 μƒνƒœμΌ λ•Œ νŒŒμΌμ΄λ‚˜ μ†ŒμΌ“μ˜ μ‹€μ œ μ²˜λ¦¬λŠ” λ””λ°”μ΄μŠ€μ—μ„œ ν•œλ‹€. μž‘μ—…μ΄ λλ‚˜λ©΄ μƒνƒœλŠ” λ‹€μ‹œ running μƒνƒœλ‘œ 바뀐닀.

 

2. λ„€νŠΈμ›Œν¬ μ—°κ²° 및 솑신

TCPλŠ” μ—°κ²° μ§€ν–₯ν˜• ν”„λ‘œν† μ½œμ΄λ©° μΌλŒ€μΌ ν†΅μ‹ λ§Œ ν—ˆλ½ν•œλ‹€. λ”°λΌμ„œ TCP μ†ŒμΌ“ 1κ°œλŠ” 였직 끝점 1개 ν•˜κ³ λ§Œ 톡신할 수 μžˆλ‹€.

 

TCP 솑신

  • connect() ν•¨μˆ˜λŠ” μƒνƒœλ°© 끝점을 ν–₯ν•΄ TCP 연결을 μ‹œλ„ν•œλ‹€. μ΄λ•Œ μ—°κ²° 응닡이 올 λ•ŒκΉŒμ§€ λΈ”λ‘œν‚Ήμ„ μœ μ§€ν•œλ‹€.
  • send() ν•¨μˆ˜λŠ” 자기 μ»΄ν“¨ν„°μ˜ μš΄μ˜μ²΄μ œμ—μ„œ μƒλŒ€λ°© μ»΄ν“¨ν„°λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜λŠ” μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ λ¦¬ν„΄ν•œλ‹€.

 

3. λΈ”λ‘œν‚Ήκ³Ό μ†ŒμΌ“ 버퍼

μ†ŒμΌ“μ€ 각각 솑신 버퍼와 μˆ˜μ‹  버퍼λ₯Ό ν•˜λ‚˜μ”© κ°€μ§€κ³  μžˆλ‹€.

 

솑신 λ²„νΌλŠ”

  • λ°”μ΄νŠΈ 배열이며 ν¬κΈ°λŠ” κ³ μ •λ˜μ–΄ μžˆμœΌλ‚˜ 크기λ₯Ό λ§ˆμŒλŒ€λ‘œ λ³€κ²½ν•  수 μžˆλ‹€.
  • FIFO ν˜•νƒœλ‘œ μž‘λ™ν•œλ‹€.
  • send(data)λ₯Ό ν˜ΈμΆœν•˜λ©΄ dataλŠ” 솑신 버퍼에 μ±„μ›Œμ§€κ³  μž μ‹œ ν›„ 톡신 μ„ λ‘œλ₯Ό 톡해 점차적으둜 λΉ μ Έλ‚˜κ°„λ‹€.
  • 솑신 버퍼가 가득 μ°¬λ‹€λ©΄ λΈ”λ‘œν‚Ήμ΄ λ°œμƒν•˜κ³  빈 곡간이 생기면 λΈ”λ‘œν‚Ήμ΄ ν•΄μ œλ˜κ³  send() ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•œλ‹€.

 

λΈ”λ‘œν‚Ή λ°œμƒ

 

4. λ„€νŠΈμ›Œν¬ μ—°κ²°λ°›κΈ° 및 μˆ˜μ‹ 

TCP μˆ˜μ‹ 

  • accept() ν•¨μˆ˜λŠ” TCP 연결이 λ“€μ–΄μ˜¬ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦°λ‹€.
  • recv() ν•¨μˆ˜λŠ” μˆ˜μ‹ ν•  수 μžˆλŠ” 데이터가 μ—†μœΌλ©΄ λΈ”λ‘œν‚Ήμ΄ μΌμ–΄λ‚œλ‹€. μ΄λ•Œ 받은 데이터 크기가 0λ°”μ΄νŠΈλΌλ©΄ μƒλŒ€λ°©μ—μ„œ TCP 연결을 λλƒˆμŒμ„ μ˜λ―Έν•œλ‹€.

 

μˆ˜μ‹  λ²„νΌλŠ”

  • 솑신 버퍼와 λ§Žμ€ 뢀뢄이 λΉ„μŠ·ν•˜μ§€λ§Œ μž‘λ™ μˆœμ„œκ°€ λ°˜λŒ€μ΄λ‹€. 솑신 λ²„νΌμ—λŠ” μ‚¬μš©μžκ°€ push()ν•˜κ³  μš΄μ˜μ²΄μ œκ°€ pop()을 ν•˜μ§€λ§Œ μˆ˜μ‹  λ²„νΌμ—λŠ” μš΄μ˜μ²΄μ œκ°€ push()ν•˜κ³  μ‚¬μš©μžκ°€ pop()을 ν•œλ‹€.
  • 데이터가 μˆ˜μ‹ λ˜λŠ” 것이 μžˆμ„ λ•Œλ§ˆλ‹€ κ³„μ†ν•΄μ„œ μˆ˜μ‹  버퍼에 μ±„μ›Œμ£ΌλŠ”λ°, 꽉 μ°¨λ©΄ 더 이상 데이터λ₯Ό λ°›μ§€ μ•ŠλŠ”λ‹€.
  • μˆ˜μ‹  버퍼가 μ™„μ „νžˆ λΉ„μ–΄ 있으면 λΈ”λ‘œν‚Ήμ΄ λ°œμƒν•œλ‹€.

 

5. μˆ˜μ‹  버퍼가 가득 μ°¨λ©΄ λ°œμƒν•˜λŠ” ν˜„μƒ

λ§Œμ•½ μˆ˜μ‹  ν•¨μˆ˜κ°€ μˆ˜μ‹  λ²„νΌμ—μ„œ 데이터λ₯Ό κΊΌλ‚΄λŠ” 속도가

μš΄μ˜μ²΄μ œκ°€ μˆ˜μ‹  λ²„νΌμ˜ 데이터λ₯Ό μ±„μš°λŠ” 속도보닀 느리면 μ–΄λ–»κ²Œ 될까?

 

TCP μˆ˜μ‹  ν•¨μˆ˜μΈ recv()λŠ” 1λ°”μ΄νŠΈλΌλ„ μˆ˜μ‹ ν•  수 있으면 μ¦‰μ‹œ λ¦¬ν„΄ν•œλ‹€. μœ„μ™€ 같은 μƒν™©μ—μ„œλŠ” μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ?

 

TCP

 

μˆ˜μ‹  λ²„νΌμ—λŠ” 남은 곡간이 ν•˜λ‚˜λ„ 없을 λ•ŒκΉŒμ§€ μ™„μ „νžˆ μ±„μ›Œμ§€κ²Œ 되고 데이터λ₯Ό λ³΄λ‚΄λŠ” μͺ½μ—μ„œλŠ” 솑신 ν•¨μˆ˜ send()κ°€ λΈ”λ‘œν‚Ήλœλ‹€. 이 μƒνƒœμ—μ„œλŠ” TCP 톡신은 μ „ν˜€ μ—†κ³  TCP μ—°κ²°λ§Œ μ‚΄μ•„ μžˆλŠ” 것이닀.

 

UDP μ†ŒμΌ“μ—μ„œλŠ” λ°μ΄ν„°κ·Έλž¨μ΄ μ΅œμ†Œ 1개 도착해 있으면 μ¦‰μ‹œ λ¦¬ν„΄ν•œλ‹€. μœ„μ™€ 같은 μƒν™©μ—μ„œλŠ” μ–΄λ–»κ²Œ λ™μž‘ν• κΉŒ?

 

UDP

 

μˆ˜μ‹  버퍼가 담을 μ—¬μœ  곡간이 μ—†μœΌλ©΄ λ°μ΄ν„°κ·Έλž¨μ€ κ·Έλƒ₯ 버렀진닀. μ΄λ•Œ 솑신 ν•¨μˆ˜ sendTo()의 λΈ”λ‘œν‚Ήμ€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. 즉, λ°μ΄ν„°κ·Έλž¨ μœ μ‹€μ΄ λ°œμƒν•œλ‹€.

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“ Book/✏ Game Server' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 4μž₯ κ²Œμž„ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ
  • [Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° (2)
  • [Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 2μž₯ 컴퓨터 λ„€νŠΈμ›Œν¬ (2)
  • [Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 2μž₯ 컴퓨터 λ„€νŠΈμ›Œν¬ (1)
Blxxming
Blxxming
CS 지식과 κ³΅λΆ€ν•˜λ‹€ 배운 것, κ²½ν—˜ν•œ 것 등을 κΈ°λ‘ν•˜λŠ” λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€.
  • Blxxming
    πŸ’‘λ²ˆλœ©πŸ’‘
    Blxxming
  • 전체
    였늘
    μ–΄μ œ
  • 곡지사항

    • Tech Interview
    • πŸ“š Tech (246)
      • πŸ“ Computer Science (96)
        • ✏ OS (12)
        • ✏ Network & Web (10)
        • ✏ Database (11)
        • ✏ Data Structure (6)
        • ✏ Algorithm (40)
        • ✏ Design Pattern (9)
        • ✏ Cloud Computing (3)
        • ✏ (5)
      • πŸ“ Language (73)
        • ✏ Language (6)
        • ✏ C & C++ (11)
        • ✏ C# (19)
        • ✏ JAVA (37)
      • πŸ“ Game (43)
        • ✏ Computer Graphics (2)
        • ✏ Unity (14)
        • ✏ Unreal (26)
        • ✏ (1)
      • πŸ“ Book (34)
        • ✏ Effective (3)
        • ✏ Game Server (16)
        • ✏ Clean Code (14)
        • ✏ (1)
  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Blxxming
[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° (1)
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”