2 ๋ถ„ ์†Œ์š”

19์žฅ Windows์—์„œ์˜ ์“ฐ๋ ˆ๋“œ ์‚ฌ์šฉ

์šด์˜์ฒด์ œ๊ฐ€ ๋งŒ๋“œ๋Š” ๋ฆฌ์†Œ์Šค์˜ ์œ ํ˜•

  • ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰๊ณผ ๊ด€๋ จ๋œ ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ
  • ์ž…์ถœ๋ ฅ์ด ๋„๊ตฌ๊ฐ€ ๋˜๋Š” ์†Œ์ผ“๊ณผ ํŒŒ์ผ
  • ์“ฐ๋ ˆ๋“œ๊ฐ„ ๋™๊ธฐํ™”์˜ ๋„๊ตฌ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์„ธ๋งˆํฌ์–ด ๋ฎคํ…์Šค

์ปค๋„ ์˜ค๋ธŒ์ ํŠธ

: ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์šด์˜์ฒด์ œ๊ฐ€ ๋งŒ๋“œ๋Š” ๋ฐ์ดํ„ฐ ๋ธ”๋ก

  • ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์˜ ์ •๋ณด๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ์Œ
  • ๋ฆฌ์†Œ์Šค์˜ ์ข…๋ฅ˜์—๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ์ƒ์„ฑ
  • ์ƒ์„ฑ, ๊ด€๋ฆฌ, ์†Œ๋ฉธ์€ ์šด์˜์ฒด์ œ๊ฐ€ ๋‹ด๋‹น (์†Œ์œ ์ž = ์šด์˜์ฒด์ œ)

์œˆ๋„์šฐ ๊ธฐ๋ฐ˜์˜ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ

์“ฐ๋ ˆ๋“œ์™€ ํ”„๋กœ์„ธ์Šค์˜ ๊ด€๊ณ„

  • main ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์“ฐ๋ ˆ๋“œ์— ์˜ํ•ด ์‹คํ–‰
  • ๋‹จ์ผ ์“ฐ๋ ˆ๋“œ : ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋งŒ ์‹คํ–‰ (์ถ”๊ฐ€๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑx)
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ : ์ถ”๊ฐ€๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ -> ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ

ํ”„๋กœ์„ธ์Šค : ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ์ž์›์„ ํ• ๋‹น๋ฐ›์€ ์ž‘์—…์˜ ๋‹จ์œ„

์“ฐ๋ ˆ๋“œ : ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ• ๋‹น๋ฐ›์€ ์ž์›์„ ์ด์šฉํ•˜๋Š” ์‹คํ–‰ ํ๋ฆ„์˜ ๋‹จ์œ„


CreateThread : ์œˆ๋„์šฐ์—์„œ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ

  • lpStartAddress : ์“ฐ๋ ˆ๋“œ์˜ main ํ•จ์ˆ˜์ •๋ณด ์ „๋‹ฌ
  • lpParameter : ์“ฐ๋ ˆ๋“œ์˜ main ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌํ•  ์ธ์ž์ •๋ณด ์ „๋‹ฌ

C/C++ ํ•จ์ˆ˜์˜ ํ˜ธ์ถœ์ด ํ•„์š”ํ•œ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์‹œ -> beginthreadex ์‚ฌ์šฉ

์œˆ๋„์šฐ์˜ ์“ฐ๋ ˆ๋“œ๋Š” ์“ฐ๋ ˆ๋“œ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‹œ ์ž๋™ ์†Œ๋ฉธ

์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ๋‘๊ฐ€์ง€ ์ƒํƒœ

non-signaled ์ƒํƒœ : ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ์ƒํƒœ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ํŠน์ • ์ƒํ™ฉ์— ์ด๋ฅด์ง€ ์•Š์€ ์ƒํƒœ

signaled ์ƒํƒœ : ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์ƒํƒœ, ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ํŠน์ • ์ƒํ™ฉ ๋„๋‹ฌ ์ƒํƒœ

-> ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒํƒœ ์ •๋ณด๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค์˜ ์ƒํ™ฉ์„ ์ธ์‹ํ•จ

ex. ํ”„๋กœ์„ธ์Šค๋‚˜ ์“ฐ๋ ˆ๋“œ์˜ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๋Š” ํ”„๋กœ์„ธ์Šค, ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ์‹œ non-signaled ์ƒํƒœ์— ์žˆ๋‹ค๊ฐ€, ์ข…๋ฃŒ ์‹œ์— signaled ์ƒํƒœ

์ปค๋„ ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒํƒœ ํ™•์ธ

์ „๋‹ฌ๋œ ํ•ธ๋“ค์˜ ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ signaled ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜

์ƒํƒœ ํ™•์ธ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’

  • WAIT_OBJECT_0: ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ signaled ์ƒํƒœ์ผ ๋•Œ ๋ฐ˜ํ™˜
  • auto-reset ๋ชจ๋“œ: signaled ์ƒํƒœ์—์„œ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ํ›„ ์ž๋™์œผ๋กœ non-signaled๋กœ ์ „ํ™˜
  • manual-reset ๋ชจ๋“œ: ์ˆ˜๋™์œผ๋กœ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ




20์žฅ Windows์—์„œ์˜ ์“ฐ๋ ˆ๋“œ ๋™๊ธฐํ™”

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

์œ ์ €๋ชจ๋“œ

  • ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๊ธฐ๋ณธ ๋ชจ๋“œ
  • ๋ฌผ๋ฆฌ์ ์ธ ์˜์—ญ์œผ๋กœ์˜ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ
  • ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์˜์—ญ์—๋„ ์ œํ•œ
  • ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์— ์ œํ•œ์„ ๋‘๊ธฐ ์œ„ํ•œ ๋ชจ๋“œ

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

  • ์šด์˜์ฒด์ œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ์˜ ๋ชจ๋“œ
  • ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ํ•˜๋“œ์›จ์–ด์˜ ์ ‘๊ทผ์—๋„ ์ œํ•œ์ด ์—†์Œ


๊ฐ™์€ ์šด์˜์ฒด์ œ์— ์˜ํ•ด์„œ ์™„์„ฑ๋˜๋Š” ์—ฐ์‚ฐ์„ ์œ„ํ•ด์„œ๋Š” ์œ ์ €๋ชจ๋“œ์—์„œ ์ปค๋„๋ชจ๋“œ๋กœ์˜ ์ „ํ™˜, ์ปค๋„๋ชจ๋“œ์—์„œ ์œ ์ €๋ชจ๋“œ๋กœ์˜ ์ „ํ™˜์ด ํ•„์š”ํ•จ

์œ ์ €๋ชจ๋“œ ๋™๊ธฐํ™”์™€ ์ปค๋„๋ชจ๋“œ ๋™๊ธฐํ™”

์œ ์ €๋ชจ๋“œ ๋™๊ธฐํ™”

  • ์šด์˜์ฒด์ œ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ๋™๊ธฐํ™”๊ฐ€ ์•„๋‹Œ, ์ˆœ์ˆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•ด์„œ ์™„์„ฑ๋˜๋Š” ๋™๊ธฐํ™” ๊ธฐ๋ฒ•
  • ์šด์˜์ฒด์ œ์— ์˜ํ•ด ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ปค๋„๋ชจ๋“œ๋กœ์˜ ์ „ํ™˜์ด ๋ถˆํ•„์š”
  • ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ€๋ณ๊ณ  ์†๋„๊ฐ€ ๋น ๋ฆ„
  • CRITICAL_SECTION
    • ์ž„๊ณ„์˜์—ญ์„ EnterCri~ ํ•จ์ˆ˜์™€ LeaveCri~ ํ•จ์ˆ˜๋กœ ๊ฐ์‹ผ๋‹ค
    • InitializerCriticalSection : ์ƒ์„ฑ
    • DeleteCriticalSection : ์†Œ๋ฉธ
    • EnterCriticalSection : ํš๋“
    • LeaveCriticalSection : ๋ฐ˜๋‚ฉ

์ปค๋„๋ชจ๋“œ ๋™๊ธฐํ™”

  • ์ปค๋„์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” ๋™๊ธฐํ™” ๊ธฐ๋ฒ•
  • ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต (ex. ํƒ€์ž„์•„์›ƒ ์ง€์ • ๊ฐ€๋Šฅ)
  • Mutex
    • auto-reset ๋ชจ๋“œ
    • ์˜ค๋ธŒ์ ํŠธ์˜ ์†Œ๋ฉธ ์‹œ CloseHandle ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • WaitForSingleObject ํ•จ์ˆ˜ ์ด์šฉ
    • ํš๋“ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด, signaled ์ƒํƒœ
    • ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ True์ „๋‹ฌ ์‹œ non-signaled, False์‹œ signaled
    • WaitForSingleObject ~ ReleaseMutex
  • Semaphore
    • ์„ธ๋งˆํฌ์–ด ๊ฐ’์ด 0์ธ ๊ฒฝ์šฐ non-signaled ์ƒํƒœ, 0๋ณด๋‹ค ํฐ ๊ฒฝ์šฐ signaled ์ƒํƒœ
    • ์„ธ๋งˆํฌ์–ด ๊ฐ’์€ 0๋ณด๋‹ค ์ž‘์•„์งˆ ์ˆ˜ ์—†๋‹ค
    • ์˜ค๋ธŒ์ ํŠธ์˜ ์†Œ๋ฉธ ์‹œ CloseHandle ํ•จ์ˆ˜ ํ˜ธ์ถœ
    • ์„ธ๋งˆํฌ์–ด์˜ ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • -> ์ž„๊ณ„์˜์—ญ์— ์ ‘๊ทผ๊ฐ€๋Šฅ ํ•œ ์“ฐ๋ ˆ๋“œ์˜ ์ˆ˜ ์ œํ•œ
      • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ -> ์„ธ๋งˆํฌ์–ด ์ดˆ๊ธฐ ๊ฐ’
      • ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ -> ์„ธ๋งˆํฌ์–ด ์ตœ๋Œ€ ๊ฐ’
    • WaitForSingleObject ํ•จ์ˆ˜ ์ด์šฉ
    • WaitForSingleObject ~ ReleaseSemaphore
  • Event
    • manual-reset + auto-reset ๋ชจ๋“œ ๊ฐ€๋Šฅ
    • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ True -> manual-reset / False -> auto-rest
    • ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ True -> auto-reset / False -> manual-reset
    • manual-reset ๋ชจ๋“œ๋กœ ์ƒ์„ฑ ์‹œ ์ƒํƒœ ๋ณ€๊ฒฝ
      • ResetEvent -> non-signaled
      • SetEvent -> signaled

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: