[Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (3)

2022. 1. 9. 16:01ยท๐Ÿ“ Book/โœ Game Server

1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ

 

10. ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ฒŒ์ž„ ์„œ๋ฒ„

๋งŽ์€ ์ƒ์šฉ ๊ฒŒ์ž„ ์„œ๋ฒ„๋Š” CPU๊ฐ€ ์—ฌ๋Ÿฌ ์ฝ”์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒŒ์ž„ ์„œ๋ฒ„๋ฅผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ๋™ํ•˜๋Š” ๊ฒฝ์šฐ ์ฝ”์–ด ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ๋น„ํšจ์œจ์„ฑ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ๊ทธ๋ž˜์„œ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๊ฒฝ์šฐ CPU ๊ฐœ์ˆ˜๋งŒํผ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šฐ๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

 

์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ, ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค

 

  • ๊ฐ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐฉ์„ ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€์ง€๊ณ  ๋ฐฉ์—์„œ๋Š” ํ”Œ๋ ˆ์ด์–ด ํ•˜๋‚˜ ์ด์ƒ์ด ์‹ฑ๊ธ€ ํ”Œ๋ ˆ์ด ํ˜น์€ ๋ฉ€ํ‹ฐ ํ”Œ๋ ˆ์ด๋ฅผ ํ•œ๋‹ค.
  • ํ”Œ๋ ˆ์ด์–ด ์ •๋ณด๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋””๋ฐ”์ด์Šค ํƒ€์ž„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ ํฐ ์‹œ๋ฆฌ์–ผ ๋ณ‘๋ชฉ์ด ์ผ์–ด๋‚œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋‚˜ ์ฝ”๋ฃจํ‹ด ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
  • ๋ฐฉ ๊ฐœ์ˆ˜๋งŒํผ ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜์˜ ํšŸ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.
  • ๊ฐ™์€ ๋™์‹œ์ ‘์†์ž๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์„œ๋ฒ„๋ผ๊ณ  ํ•˜๋”๋ผ๋„ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์ ‘์†์ž ์ˆ˜๋ฅผ ํฌ๊ฒŒ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค.

 

11. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๊ฒŒ์ž„ ์„œ๋ฒ„

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŽ์ด ๋„์šฐ๊ธฐ ๊ณค๋ž€ํ•  ๋•Œ: ํ”„๋กœ์„ธ์Šค๋‹น ๋กœ๋”ฉํ•ด์•ผ ํ•˜๋Š” ๊ฒŒ์ž„ ์ •๋ณด์˜ ์šฉ๋Ÿ‰์ด ๋งค์šฐ ํด ๋•Œ
  • ์„œ๋ฒ„ ํ•œ ๋Œ€์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ CPU์˜ ์—ฐ์‚ฐ๋Ÿ‰์„ ๋™์›ํ•ด์•ผ ํ•  ๋งŒํผ ๋งŽ์€ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ
  • ์ฝ”๋ฃจํ‹ด์ด๋‚˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์“ธ ์ˆ˜ ์—†๊ณ  ๋””๋ฐ”์ด์Šค ํƒ€์ž„์ด ๋ฐœ์ƒํ•  ๋•Œ
  • ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์„œ๋ฒ„ ๊ธฐ๊ธฐ๋‹น ํ•˜๋‚˜๋งŒ ๋‘์–ด์•ผ ํ•  ๋•Œ
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ์ด ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์•ก์„ธ์Šคํ•ด์•ผ ํ•  ๋•Œ

 

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ

 

ํ•œ ํ”„๋กœ์„ธ์Šค์— ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒŒ์ž„ ์„œ๋ฒ„์˜ ๋ชจ๋ธ์ด๋‹ค.

์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๊ฒŒ์ž„ ์„œ๋ฒ„ ๋ฉ”์ธ, ๊ฒŒ์ž„ ๋ฐฉ, ๋ฎคํ…์Šค

 

  • ๊ฒŒ์ž„ ์„œ๋ฒ„ ๋ฉ”์ธ์€ ๋ฐฉ ๋ชฉ๋ก์„ ๊ฐ€์ง€๋ฉฐ ๋ฐฉ ๋ชฉ๋ก์—๋Š” ๊ฐ ๋ฐฉ์ด ๋“ค์–ด๊ฐ„๋‹ค.
  • ๊ฐ ๋ฐฉ์€ ๋ฎคํ…์Šค๋ฅผ ๊ฐ€์ง€๋ฉฐ ๋˜ ๊ฒŒ์ž„ ์„œ๋ฒ„ ๋ฉ”์ธ ์ž์ฒด๋„ ๋ฎคํ…์Šค๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ํ”Œ๋ ˆ์ด์–ด ํ–‰๋™์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” ๊ฐ ๋ฐฉ์„ ์ž ๊ทผ ํ›„์— ํ•œ๋‹ค.
    • ๊ณตํ†ต ๋ฐ์ดํ„ฐ(๋ฐฉ ๋ชฉ๋ก ๋“ฑ)๋ฅผ ์ž ๊ทผ๋‹ค.
    • ํ”Œ๋ ˆ์ด์–ด A๊ฐ€ ๋“ค์–ด ์žˆ๋Š” ๋ฐฉ์„ ๋ฐฉ ๋ชฉ๋ก์—์„œ ์ฐพ๋Š”๋‹ค.
    • ๊ณตํ†ต ๋ฐ์ดํ„ฐ๋ฅผ ์ž ๊ธˆ ํ•ด์ œํ•œ๋‹ค.
    • ์ฐพ์€ ๋ฐฉ์„ ์ž ๊ทผ๋‹ค.
    • ํ”Œ๋ ˆ์ด์–ด A์˜ ๋ฐฉ ์•ˆ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
    • ๋ฐฉ์„ ์ž ๊ธˆ ํ•ด์ œํ•œ๋‹ค.
MyGameServer.DoSomething(playerID)
{
    lock(m_critSec);
    room = m_roomList.find(player);
    Unlock(m_critSec);
 
    lock(room.m_critSec);
    room.DoSomething(playerID);
    Unlock(room.m_critSec);
}

 

12. ์Šค๋ ˆ๋“œ ํ’€๋ง

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์˜ ๊ฒŒ์ž„ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ๋•Œ ์Šค๋ ˆ๋“œ๋Š” ๋ช‡ ๊ฐœ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์–ด๋–ค ์ผ์„ ํ•˜๋ฉด ์ข‹์„๊นŒ?

 

๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ํด๋ผ์ด์–ธํŠธ๋งˆ๋‹ค ์Šค๋ ˆ๋“œ๋ฅผ ๋ฐฐ์ •ํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐœ๋ฐœ์€ ์‰ฝ์ง€๋งŒ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ์•„์ง€๋ฏ€๋กœ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ํ˜ธ์ถœ ์Šคํƒ์„ ๊ฐ€์ง€๋Š”๋ฐ ์ด๋ฅผ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋งค์šฐ ์ปค์ง„๋‹ค.
  • ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜ ์—ฐ์‚ฐ์€ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ธ๋ฐ ์ด๋ฅผ ๋งค์šฐ ์ž์ฃผํ•ด์•ผ ํ•œ๋‹ค.

 

์•ž์„  ๋ฐฉ๋ฒ•์€ ๊ฑฐ์˜ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์Šค๋ ˆ๋“œ ํ’€๋ง์ด๋‹ค.

 

์Šค๋ ˆ๋“œ ํ’€๋ง

 

๊ณต์ค‘ ํ™”์žฅ์‹ค์—๋Š” ๋ฌธ์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ผ๋ ฌ๋กœ ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์‚ฌ์šฉ ์ค‘์ด ์•„๋‹Œ ๋ฌธ์ด ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด ๋“ค์–ด๊ฐ€๊ณ  ๋ชจ๋“  ๋ฌธ์ด ์‚ฌ์šฉ ์ค‘์ด๋ฉด ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. ์ด๋•Œ ๊ฐ ๋ฌธ์€ ์Šค๋ ˆ๋“œ์ด๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด๋ฒคํŠธ์ด๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์˜ ์ง‘ํ•ฉ, ์ฆ‰ ํ™”์žฅ์‹ค์€ ์Šค๋ ˆ๋“œ ํ’€์ด๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋งŽ์€ ์ˆ˜์˜ ์ด๋ฒคํŠธ๋ฅผ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด์„œ ๋„ˆ๋ฌด ๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ๋‘์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์–ด๋–ค ์„œ๋ฒ„์˜ ์ฃผ ์—ญํ• ์ด ๋””๋ฐ”์ด์Šค ํƒ€์ž„์ด ์—†๊ณ  CPU ์—ฐ์‚ฐ๋งŒ ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ผ๋ฉด, ์Šค๋ ˆ๋“œ ํ’€์˜ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋Š” CPU ๊ฐœ์ˆ˜์™€ ๋™์ผํ•˜๊ฒŒ ์žก์•„๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.
  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ํŒŒ์ผ ๋“ฑ ๋‹ค๋ฅธ ๊ฒƒ์— ์•ก์„ธ์Šค ํ•˜๋ฉด์„œ ๋””๋ฐ”์ด์Šค ํƒ€์ž„์ด ๋ฐœ์ƒํ•  ๋•Œ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋Š” CPU ๊ฐœ์ˆ˜๋ณด๋‹ค ๋งŽ์•„์•ผ ํ•œ๋‹ค.

 

13. ์ด๋ฒคํŠธ

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ์ด๋‹ค.

 

์ด๋ฒคํŠธ๋Š” ์ž ์ž๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๊นจ์šฐ๋Š” ๋„๊ตฌ๋กœ Reset(์ด๋ฒคํŠธ ์—†์Œ, 0), Set(์ด๋ฒคํŠธ ์žˆ์Œ, 1) ์ƒํƒœ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค.

 

Event event1;
 
void Thread1()
{
    // ์ด๋ฒคํŠธ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ์ผ์œผํ‚ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    event1.Wait();
}
 
void Thread2()
{
    // ์ด๋ฒคํŠธ์— ์‹ ํ˜ธ๋ฅผ ์ค€๋‹ค.
    event1.SetEvent();
}
  • CreateEvent: ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • CloseHandle: ์ด๋ฒคํŠธ๋ฅผ ํŒŒ๊ดดํ•œ๋‹ค.
  • WaitForSingleObject: ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • SetEvent: ์ด๋ฒคํŠธ์— ์‹ ํ˜ธ๋ฅผ ์ค€๋‹ค.

 

์ด๋ฒคํŠธ๋Š” ์Šค๋ ˆ๋“œ ๊ฐ„ ์†Œํ†ตํ•˜๋ฉฐ ์ผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์Šค๋ ˆ๋“œ 1์˜ ์ผ์„ ๋งˆ์นœ ํ›„ ์Šค๋ ˆ๋“œ 2์— ์•Œ๋ฆด ๋•Œ ํ™œ์šฉํ•œ๋‹ค.

 

14. ์„ธ๋งˆํฌ์–ด

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ์ด๋‹ค.

 

๋ฎคํ…์Šค๋‚˜ ์ž„๊ณ„ ์˜์—ญ์€ ์˜ค๋กœ์ง€ ์Šค๋ ˆ๋“œ 1๊ฐœ๋งŒ ์ž์›์„ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์„ธ๋งˆํฌ์–ด๋Š” ์›ํ•˜๋Š” ๊ฐœ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์›์„ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

Semaphore sema1;
 
void Main()
{
    // ์Šค๋ ˆ๋“œ 2๊ฐœ๋งŒ ์ž์›์„ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ œํ•œํ•œ๋‹ค.
    sema1 = new Semaphore(2);
}
 
void Thread1()
{
    // ๋ฆฌ์†Œ์Šค๋ฅผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    sema1.Wait();
 
    // ๋ฆฌ์†Œ์Šค ์•ก์„ธ์Šค๊ฐ€ ๋‹ค ๋๋‚ฌ์Œ์„ ์„ธ๋งˆํฌ์–ด์— ์•Œ๋ฆฐ๋‹ค.
    sema1.Release();
}
 
void Thread2()
{
    // ๋ฆฌ์†Œ์Šค๋ฅผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    sema1.Wait();
 
    // ๋ฆฌ์†Œ์Šค ์•ก์„ธ์Šค๊ฐ€ ๋‹ค ๋๋‚ฌ์Œ์„ ์„ธ๋งˆํฌ์–ด์— ์•Œ๋ฆฐ๋‹ค.
    sema1.Release();
}
 
void Thread3()
{
    // ๋ฆฌ์†Œ์Šค๋ฅผ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    sema1.Wait();
 
    // ๋ฆฌ์†Œ์Šค ์•ก์„ธ์Šค๊ฐ€ ๋‹ค ๋๋‚ฌ์Œ์„ ์„ธ๋งˆํฌ์–ด์— ์•Œ๋ฆฐ๋‹ค.
    sema1.Release();
}
  • CreateSemaphore: ์„ธ๋งˆํฌ์–ด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž์›์„ ๋ช‡ ๊ฐœ ํ—ˆ๋ฝํ•˜๋Š”์ง€ ์„ค์ •ํ•œ๋‹ค.
  • WaitForSingleObject: ์„ธ๋งˆํฌ์–ด๊ฐ€ ์ž์› ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•˜๊ณ , ํ—ˆ๋ฝํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
  • ReleaseSemaphore: ์„ธ๋งˆํฌ์–ด์— ์ž์› ์•ก์„ธ์Šค๊ฐ€ ๋๋‚ฌ์Œ์„ ํ†ต๋ณดํ•œ๋‹ค.
  • CloseHandle: ์„ธ๋งˆํฌ์–ด๋ฅผ ํŒŒ๊ดดํ•œ๋‹ค.

 

์„ธ๋งˆํฌ์–ด๋Š” ์ƒํƒœ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ ์ดˆ๊ธฐ๊ฐ’์€ ์„ค์ •ํ–ˆ๋˜ ์ตœ๋Œ€ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•œ ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜์ด๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์„ธ๋งˆํฌ์–ด์— ์ž์› ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•˜๋ฉด ์ƒํƒœ ๊ฐ’์„ 1 ๊ฐ์†Œํ•˜๋ฉฐ ์ž์› ์•ก์„ธ์Šค๊ฐ€ ๋๋‚œ ํ›„์—” 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ์„ธ๋งˆํฌ์–ด์™€ ์ด๋ฒคํŠธ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ์ด๋ฒคํŠธ๋Š” ์ƒํƒœ ๊ฐ’์ด 0, 1๋กœ ์ œํ•œ๋˜์ง€๋งŒ ์„ธ๋งˆํฌ์–ด๋Š” 0 ์ด์ƒ์˜ ๊ฐ’์ด๋ž€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 

15. ์›์ž ์กฐ์ž‘

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•œ ๋˜ ๋‹ค๋ฅธ ๋„๊ตฌ์ด๋‹ค.

 

์›์ž ์กฐ์ž‘์€ ๋ฎคํ…์Šค๋‚˜ ์ž„๊ณ„ ์˜์—ญ ์ž ๊ธˆ ์—†์ด๋„ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ํ•˜๋“œ์›จ์–ด ๊ธฐ๋Šฅ์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์›์ž ์กฐ์ž‘ ๊ธฐ๋Šฅ์„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

16. ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ”ํ•œ ์‹ค์ˆ˜๋“ค

1. ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๋ชจ๋‘์— ์ž ๊ธˆ ํ•˜์ง€ ์•Š๊ธฐ

๊ทธ๋ƒฅ ๊ฐ’์„ ์ฝ๊ณ ๋งŒ ์žˆ์œผ๋ฉด ์ž ๊ธˆ์„ ํ•˜์ง€ ์•Š๋”๋ผ๋„ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๋ง‰์—ญํ•œ ์ƒ๊ฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค.

ํฌ๋ž˜์‹œ๋ฅผ ์ผ์œผํ‚ค์ง€๋Š” ์•Š์ง€๋งŒ a ๊ฐ’์ด ์ด์ƒํ•˜๊ฒŒ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ๋‹ค.

int a;
mutex a_mutex;
 
void func1()
{
    // lock(a_mutex); ๋ˆ„๋ฝ
    print(a);
}
 
void func2()
{
    lock(a_mutex);
    a = a + 10;
}

 

2. ์ž ๊ธˆ ์ˆœ์„œ ๊ผฌ์ž„

ํ”„๋กœ๊ทธ๋žจ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ด ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๊ธฐ๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต๋‹ค.

์ œ์ผ ์ข‹์€ ๊ฒƒ์€ ์ž ๊ธˆ ์ˆœ์„œ ๊ทœ์น™์„ ์ตœ๋Œ€ํ•œ ์ ๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

3. ๋„ˆ๋ฌด ์ข์€ ์ž ๊ธˆ ๋ฒ”์œ„

์ž ๊ธˆ ๊ฐ์ฒด ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ๋„“์œผ๋ฉด ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์šด์˜์ฒด์ œ๊ฐ€ ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ์•„์ง€๊ณ  ๋ณ‘๋ ฌ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

์ž ๊ธˆ ๋ฒ”์œ„๋ฅผ ์ขํžˆ๋ฉด ์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜์˜ ํ™•๋ฅ ์ด ๋–จ์–ด์ง€๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์ž„๊ณ„ ์˜์—ญ ์ž ๊ธˆ์ด ๋” ๋งŽ์€ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ž„๊ณ„ ์˜์—ญ์„ ์ ๋‹นํ•œ ์ˆ˜์ค€์—์„œ ๋‚˜๋ˆ„๋ฉด ์ข‹๋‹ค.

 

4. ๋””๋ฐ”์ด์Šค ํƒ€์ž„์ด ์„ž์ธ ์ž ๊ธˆ

๋””๋ฐ”์ด์Šค ํƒ€์ž„์ด ์žˆ์„ ๋•Œ๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž์ฃผ ์ ‘๊ทผํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ž ๊ธˆ์„ ํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

ํŠนํžˆ ์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜๋Š” ๋กœ๊ทธ ์ถœ๋ ฅ์ด๋‚˜ ์ฝ˜์†” ์ถœ๋ ฅ์ด๋‹ค.

๋™์‹œ์ ‘์†์ž๋Š” ๋งŽ์€๋ฐ ๊ฒŒ์ž„ ์„œ๋ฒ„์—์„œ CPU ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ, ์ด ๋•Œ๋ฌธ์ธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

 

5. ์ž ๊ธˆ์˜ ์ „์—ผ์„ฑ์œผ๋กœ ๋ฐœ์ƒํ•œ ์‹ค์ˆ˜

์ž ๊ธˆ์œผ๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฆฌ์†Œ์Šค์—์„œ ์–ป์–ด ์˜จ ๊ฐ’์ด๋‚˜ ํฌ์ธํ„ฐ ์ฃผ์†Œ ๊ฐ’ ๋“ฑ์ด ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ์ž ๊ธˆ ์ƒํƒœ๋ฅผ ๊ณ„์† ์œ ์ง€ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

class A
{
    int x;
    int y;
};
 
mutex list_mutex;
List<A> list;
 
void func()
{
    lock(list_mutex);
    A* a = list.GetFirst(); 
    unlock(list_mutex);
 
    a->x++; // ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„
}

 

6. ์ž ๊ธˆ๋œ ๋ฎคํ…์Šค๋‚˜ ์ž„๊ณ„ ์˜์—ญ ์‚ญ์ œ

class A
{
    mutex mutex;
    int a;
};
 
void func()
{
    A* a = new A();
    lock(a->mutex);
    delete a;
}

 

7. ์ผ๊ด€์„ฑ ๊ทœ์น™ ๊นจ๊ธฐ

์•„๋ž˜ ์ฝ”๋“œ์—์„œ list์™€ listCount๋Š” ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ž ๊ธˆ ๊ฐ์ฒด๊ฐ€ 2๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ด€์„ฑ์ด ์œ ์ง€๋˜์ง€ ๋ชปํ•œ๋‹ค.

class Node
{
    Node* next;
};
 
Node* list = null;
int listCount = 0;
 
mutex listMutex;
mutex listCountMutex;
 
void func()
{
    lock(listMutex);
    Node* newNode = new Node();
    newNode->next = list;
    list = newNode;
    unlock(listMutex);
 
    lock(listCountMutex);
    listCount++;
    unlock(listCountMutex);
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Book/โœ Game Server' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 2์žฅ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (2)
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 2์žฅ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (1)
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (2)
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (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] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (3)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”