๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŒฑ CS/์šด์˜์ฒด์ œ(OS)

[์šด์˜์ฒด์ œ ๊ณต๋ฃก์ฑ…] Ch4. Threads & Concurrency

๐Ÿ“ ๊ณต๋ฃก์ฑ… ๊ธฐ๋ฐ˜์œผ๋กœ ํ•™๊ต์—์„œ ์ˆ˜์—…ํ–ˆ๋˜ ์šด์˜์ฒด์ œ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1๏ธโƒฃ Thread

(1) ๊ฐœ๋…

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์Šค๋ ˆ๋“œ๋ž€ ๋ญ˜๊นŒ?

  • Thread : CPU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋‹จ์œ„ (Basic Unit of CPU utilization)
  • ์Šค๋ ˆ๋“œ = ์‹ค = Execution flow(์‹คํ–‰ ํ๋ฆ„)

์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ํ•˜์ง€ ์•Š์„ ๋•Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•˜๋Š” ๋ฐฉ์‹๋„ ์•„์˜ˆ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค!

 

Single-Threaded์ผ ๋•Œ

: ๊ฐ™์€ ๊ณต๊ฐ„์—์„œ(= ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค, ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ) task1() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ ๋‚œ ๋‹ค์Œ์— task2() ํ•จ์ˆ˜ ์‹คํ–‰ํ•œ๋‹ค

 

Multi-Threaded์ผ ๋•Œ

: ์ฝ”๋“œ ์ž์ฒด๋Š” ๊ฐ™์€ ๊ณต๊ฐ„์— ์žˆ์ง€๋งŒ(= ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค์— ์žˆ์ง€๋งŒ), ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰ → task1()๊ณผ task2()๊ฐ€ ๋™์‹œ์— ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ ์‹œ์ž‘ 

 

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ™์€ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋”๋ผ๋„, ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅผ๊นŒ?

  • ์Šค๋ ˆ๋“œ ๊ฐ๊ฐ ๊ฐœ๋ณ„๋กœ ๊ฐ–๋Š” ๋ถ€๋ถ„
    • ๊ฐ์ž Thread ID
    • ๊ฐ์ž์˜ execution flow : flow์˜ ์ง„ํ–‰ ํ‘œ์‹œ → PC
    • ๊ฐ์ž ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฆ„ : Register
    • ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ : Stack
  • ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ํ•˜๋Š” ๋ถ€๋ถ„
    • ์ฝ”๋“œ, ์ „์—ญ ๋ณ€์ˆ˜, open files …

์ „์—ญ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•œ buffer์™€ count๋Š” ๋‘ ์Šค๋ ˆ๋“œ์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค

 

์ฆ‰, ๋‘ ํ•จ์ˆ˜๋ฅผ ๋™์‹œ์— ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ 

์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ (= Multi-Process)๊ณผ

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ(= Multi-Thread)์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค!

→ ์ฝ”๋“œ์™€ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ฑฐ๋‚˜ ํ•˜๋Š” ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค!


(2) Process in Memory

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

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์ผ ๋•Œ๋ฅผ ๋ณด๋ฉด ์Šค๋ ˆ๋“œ๋งˆ๋‹ค stack์„ ๊ฐ๊ฐ ๊ฐ€์ง€๊ณ  ๊ทธ ์•ˆ์—์„œ ๊ฐ ํ•จ์ˆ˜ ๋ถ€๋ถ„์ด ์ €์žฅ๋˜์ง€๋งŒ, ์ „์—ญ ๋ณ€์ˆ˜ ๋ถ€๋ถ„(data)์€ ๊ณต์œ ํ•œ๋‹ค!

 

  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ–ˆ์„ ๋•Œ์˜ ์žฅ์ ์€ ๋ฌด์—‡์ผ๊นŒ?
    • Responsiveness(๋ฐ˜์‘์„ฑ) : execution flow๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ → ํ•˜๋‚˜๊ฐ€ block ๋˜์–ด๋„ ๋‹ค๋ฅธ ๊ฒƒ์€ ์‚ด์•„์žˆ๋‹ค = ๋” ์ข‹์€ ๋ฐ˜์‘์„ฑ ์ œ๊ณต
    • Resource sharing
    • Economy : ์ง์ ‘ ์–ด๋“œ๋ ˆ์Šค๋ฅผ ๊ณต์œ ํ•˜๋‹ˆ๊นŒ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๊ฒฝ์ œ์ ์ด๋‹ค
    • Scalability : ๋ชจ๋“  ์ฝ”์–ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ(์‹ฑ๊ธ€์ด๋ฉด ์ฝ”์–ด๊ฐ€ ๋ช‡๊ฐœ์ด๋“  1๊ฐœ ์ฝ”์–ด๋งŒ ์“ธ ์ˆ˜๋ฐ–์— ์—†์œผ๋‹ˆ๊นŒ)

(3) Use Cases

1. Multithreaded Server

: ์–ธ์ œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†ํ•  ์ง€ ๋ชจ๋ฅธ๋‹ค → ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์†์„ ํ–ˆ์„ ๋•Œ client๋ฅผ handlingํ•˜๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.

→ ์‹ฑ๊ธ€์ด๋ฉด ํ•˜๋‚˜์˜ ํด๋ผ์ด์–ธํŠธ๋งŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฉด ์—ฌ๋Ÿฌ๋ช… concurrent ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

2. Loop Pararellization

: Matrix Multiplication(ํ–‰๋ ฌ๊ณฑ)์„ ํ•  ๋•Œ ํ•˜๋‚˜์˜ ์—ด๊ณผ ํ–‰์„ ๊ณฑํ•ด์„œ ๋™์‹œ์— parallel ํ•˜๊ฒŒ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌํ•œ๋‹ค.

์Šค๋ ˆ๋“œ๋ฅผ 2๊ฐœ๋งŒ ํ•ด๋„ T → T/2 ๋กœ ์ ˆ๋ฐ˜์˜ ์‹œ๊ฐ„์ด ์ ˆ์•ฝ ๊ฐ€๋Šฅํ•˜๋‹ค.


2๏ธโƒฃ Parallelism vs Concurrency โญ๏ธโญ๏ธ

๋‘˜์ด ๋‹ค๋ฅธ ๊ฐœ๋…์ด๋‹ค! ์˜๋‹จ์–ด๋ผ์„œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ผญ ์ฐจ์ด๋ฅผ ๊ธฐ์–ตํ•ด๋‘์ž!

  • Parallelism : ์‹ค์ œ๋กœ(physically) ๋‹ค๋ฅธ ์ฝ”์–ด์—์„œ ๋‹ค๋ฅธ ํ…Œ์Šคํฌ๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ
  • Concurrency : ํ•˜๋‚˜์˜ ์ฝ”์–ด์ง€๋งŒ, ์Šค๋ ˆ๋“œ๊ฐ€ ์ฝ”์–ด๋ฅผ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ

์œ„(=concurrent)๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ฝ”์–ด๋งŒ ์‹คํ–‰๋˜์ง€๋งŒ, ํ…Œ์Šคํฌ๋Š” 4๊ฐœ์ด๋‹ค.

 

Parallelism์€ ๋‹ค์‹œ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • data : ํ•˜๋Š” ์ž‘์—…์€ ๋˜‘๊ฐ™๋‹ค. ํ–‰๋ ฌ๊ณฑ์ฒ˜๋Ÿผ row์™€ col์„ ๊ณฑํ•˜๋Š” ์ž‘์—…์€ ๋˜‘๊ฐ™์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„๋ฆฌ๋œ ๊ฒฝ์šฐ.
  • task : ํ•˜๋Š” ์ผ์ด ์„œ๋กœ ๋‹ค๋ฅผ ๋•Œ. ๋‚˜๋ˆ ์„œ ์ฒ˜๋ฆฌ. (e.g server application์—์„œ ๋‹ค๋ฅธ ๊ณ ๊ฐ ๋™์‹œ์—)


3๏ธโƒฃ Multicore Processing

Single-core์—์„œ ์„ฑ๋Šฅ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ Logical core์˜ ์ˆ˜ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹(hyperthreading)์œผ๋กœ ํ–ˆ์ง€๋งŒ, ํ–ฅ์ƒ์— ํ•œ๊ณ„๊ฐ€ ์žˆ์—ˆ๋‹ค.

๋”ฐ๋ผ์„œ, Multi-core๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด parallel ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ด ๋ฐฉ์‹์ด ๋ฐœ์ „ํ•˜๊ณ  ์žˆ๋‹ค!

  • Multi-core๋‚˜ Multi-Process๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์—์„œ์˜ ์–ด๋ ค์›€
    • Identifying tasks (ํƒœ์Šคํฌ ์ธ์‹)
    • Balance
    • Data Splitting
    • Data Dependency ; Synchronization(๋™๊ธฐํ™”), Data sharing(๋ฐ์ดํ„ฐ ๊ณต์œ )
    • Testing and Debugging

+ ์Šค๋ ˆ๋“œ library๋กœ๋Š” low level library์ธ  POSIX Pthread๊ฐ€ ์žˆ๋‹ค!


4๏ธโƒฃ Amdahl’s Law โญ๏ธโญ๏ธ

: ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ํ•œ์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ์ ํ™” ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์— ๋”ฐ๋ผ์„œ ์ฝ”์–ด ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ ์–ผ๋งˆ๋‚˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋นจ๋ผ์งˆ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์‹

  • S : serial portion = ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋น„์œจ
  • N : processing cores ( N์ด ๋ฌดํ•œ์ด๋ฉด, 1 / S ์— ๊ฐ€๊นŒ์›Œ์ง„๋‹ค.)

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์ „๋ถ€ ๋ณ‘๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด (ํ•˜๋‚˜์˜ ์ฝ”์–ด์—์„œ ๋œ ๊ฑฐ๋ฅผ 2๊ฐœ์˜ ์ฝ”์–ด์—์„œ→ ์‹œ๊ฐ„์ด ์ •ํ™•ํžˆ ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค.)

speed up๊ฐ’์€ 2๊ฐ€ ๋œ๋‹ค. ์ฆ‰, ์ฝ”์–ด ์ˆ˜๊ฐ€ 1๊ฐœ ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค 2๋ฐฐ์”ฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋นจ๋ผ์ง„๋‹ค. 

 

์ ˆ๋ฐ˜๋งŒ ๋ณ‘๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด 1๊ฐœ์˜ ์ฝ”์–ด์—์„œ 2๊ฐœ์˜ ์ฝ”์–ด๊ฐ€ ๋์„ ๋•Œ speed up ๊ฐ’์€ 100/75๊ฐ€ ๋œ๋‹ค.

์ฆ‰, 1๊ฐœ์˜ ์ฝ”์–ด์—์„œ 100์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋˜ ์ผ์„ 2๊ฐœ์˜ ์ฝ”์–ด์—์„œ๋Š” 75์‹œ๊ฐ„ ๊ฑธ๋ ค์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

๋”ฐ๋ผ์„œ ์ตœ๋Œ€ํ•œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„, ๋งŽ์€ ๋ถ€๋ถ„์„ ์ตœ์ ํ™”ํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•˜๊ณ , ์ตœ์ ํ™” ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ด ์–ด๋А์ •๋„์ธ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค!


5๏ธโƒฃ User and Kernel Threads

  • user thread : ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ์Šค๋ ˆ๋“œ
  • kernel thread : ์‹ค์ œ๋กœ ์ฝ”์–ด์— ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์€ ์ปค๋„์ด ์Šค์ผ€์ค„๋งํ•œ๋‹ค

์ฆ‰, OS์—์„œ ์–ด๋–ค kernel thread๊ฐ€ ๋Œ์•„๊ฐˆ์ง€ ๊ฒฐ์ •ํ•ด์„œ, user์—์„œ mappingํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์ด mapping์„ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž


(1) Many-to-One

  • user thread ์—ฌ๋Ÿฌ๊ฐœ ↔ kernel thread 1๊ฐœ
  • ํ•œ ์ปค๋„์—๋Š” ํ•œ ์Šค๋ ˆ๋“œ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ์•„๊ฐ€๋ฉด์„œ kernel thread์— mappingํ•œ๋‹ค
  • BUT ํ•œ ์Šค๋ ˆ๋“œ์˜ ๋ฌธ์ œ๋กœ ์ „์ฒด๊ฐ€ ๋ธ”๋ฝ์ด ๋˜๋ฏ€๋กœ ์“ฐ๋ ˆ๋“œ์˜ ์žฅ์ ์„ ์‚ด๋ฆด ์ˆ˜ ์—†๋Š” ๋ฐฉ์‹์ด๋‹ค

(2) One-to-One

  • ์œ ์ € - ์ปค๋„์„ 1 ๋Œ€ 1๋กœ ๋งตํ•‘
  • ํ•˜๋‚˜์˜ ์ปค๋„์ด block๋˜์–ด๋„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค (Many-to-One์˜ ๋ฌธ์ œ ํ•ด๊ฒฐ)
  • BUT ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ปค๋„ ์Šค๋ ˆ๋“œ ํ•„์š”ํ•˜๋ฏ€๋กœ...
    1. ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ overhead๊ฐ€ ์ƒ๊ธด๋‹ค (kernel์— data structure ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ)
    2. ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜ ์ œํ•œ : ๋ฆฌ๋ˆ…์Šค pthread_create()์—์„œ๋Š” ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ œํ•œ๋˜์–ด์žˆ๋‹ค

(3) Many-to-Many Model

  • ์—ฌ๋Ÿฌ๊ฐœ to ์—ฌ๋Ÿฌ๊ฐœ, ์ž์œ ๋„๊ฐ€ ๋†’๋‹ค
  • ๊ตฌํ˜„์ด ๋„ˆ๋ฌด ์–ด๋ ค์›Œ์„œ ์ž˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค (์–ด๋ ค์šด ์ด์œ  = ์–ด๋””์— ๋ฐฐ์น˜? ์„ฑ๋Šฅ ์˜ํ–ฅ? → ๋ณต์žกํ•ด!!)

6๏ธโƒฃ Pthreads

(1) ๊ฐœ๋…

๊ฒฐ๊ตญ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ ๋ชซ์ด๊ธฐ ๋•Œ๋ฌธ์— API๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์ด๊ฒƒ์ด Thread Library์ด๋‹ค.

Thread Library๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” 2๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. ์œ ์ € ์ŠคํŽ˜์ด์Šค( =ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ž…์žฅ์—์„œ) → Pthreads๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘
  2. ์ปค๋„ ๋ ˆ๋ฒจ์—์„œ OS์— ์˜ํ•ด

์ด ์ค‘์—์„œ Pthreads๋Š” ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ๋ฐ ๋™๊ธฐํ™”์™€ ๊ด€๋ จ๋œ POSIX ์ธํ„ฐํŽ˜์ด์Šค ํ‘œ์ค€ API์ด๋‹ค

  • ๊ตฌํ˜„๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค! (NOT implementation, Specification์ด๋‹ค!!)
  • ์ด๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๋˜‘๊ฐ™์•„์„œ(์œ„์˜ user/kernel ๋‘˜ ๋‹ค ๊ฐ€๋Šฅ), OS์— ์ƒ๊ด€์—†์ด ๊ฐ€๋Šฅํ•˜๋‹ค

(2) Pthreads ํ•จ์ˆ˜

์ด์ œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์•ผํ•˜๋Š”๋ฐ, ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

Pthreads๋Š” ์šฐ์„  ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋Š” ์ž‘์—…์„ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์ด๋ฅผ function pointer๋กœ ์ „๋‹ฌํ•ด์„œ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ์™€ ๋งค์šฐ ๋น„์Šทํ•˜๋‹ค

(1) Task๋ฅผ ํ•จ์ˆ˜๋กœ ์ •์˜

  • `void* task (void* arg);`  → ๋ชจ๋“  ํƒ€์ž…์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด type์€ void pointer๋กœ ๊ณ ์ •ํ•œ๋‹ค

(2) Thread ์ƒ์„ฑ ํ•จ์ˆ˜

: ์‹ค์ œ๋กœ ํ•  ์ž‘์—…์„ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์„œ `pthread_create()`์— function pointer๋กœ ์ „๋‹ฌํ•œ๋‹ค

int pthread_create(pthread_t *restrict thread, 
					const pthread_attr_t *restrict attr,
					void *(*start_routine) (void*),
					void *restrict arg);

 

(3) Thread Join

: main์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์—ญํ• ์ด๋‹ค (process ์ƒ์„ฑ์—์„œ Parent ํ”„๋กœ์„ธ์Šค์˜ wait์™€ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค)

  • `int pthread_join(pthread_t thread, void **retval);`
    • `pthread_t thread` : ์Šค๋ ˆ๋“œ ID
    • `void **retval` : ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๋ฐ˜ํ™˜๊ฐ’์ด ์ด ๊ณณ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜์— ์ €์žฅ๋œ๋‹ค.

(4) Thread Termination(์ข…๋ฃŒ)

  • `noreturn void pthread_exit(void *retval);`

(3) Example

์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ Pthreads์˜ ๋™์ž‘์„ ์ง์ ‘ ํ™•์ธํ•ด๋ณด์ž

  • `pthread_t tid` : `pthread_create()`ํ•  ๋•Œ ์ดˆ๊ธฐํ™”๋œ๋‹ค.
  • create์™€ join ์‚ฌ์ด์— ๋†€์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์œ ์šฉํ•œ ์ž‘์—…์„ ํ•˜๊ณ  ์Šค๋ ˆ๋“œ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค.
  • exit ํ•  ๋•Œ ๋“ค์–ด์˜ค๋Š” ๊ฐ’ = join ํ•  ๋•Œ ๋“ค์–ด์˜ค๋Š” ๊ฐ’ ๋™์ผํ•˜๋‹ค!
    • sum์„ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ๋ฐฉ๋ฒ•(์œ„ ๊ทธ๋ฆผ์—์„œ ํŒŒ๋ž‘์ƒ‰ ๊ธ€์”จ) : task function์„ defineํ•  ๋•Œ pthread.exit()์— ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ณ€์ˆ˜(sum)๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , pthread_join()์˜ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์—(๊ทธ๋ฆผ์—์„œ๋Š” NULL๋กœ ์ง€์ •๋˜์–ด์žˆ์Œ) ๊ฐ™์€ ๋ณ€์ˆ˜(sum)๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—…ํ•œ ๋‚ด์šฉ์ด ๋ฐ˜์˜๋˜์–ด ์ €์žฅ๋œ๋‹ค. 

7๏ธโƒฃ Thread Cancellation

Cancellation = ์Šค๋ ˆ๋“œ๊ฐ€ ๋๋‚˜๊ธฐ์ „์— ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ

  • `pthread_cacel(tid);` ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค.

cancellation์—๋„ ์–ธ์ œ ์ข…๋ฃŒ๋˜๋Š”์ง€์— ๋”ฐ๋ผ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค

  • Asynchronous : ์ฆ‰์‹œ ์ข…๋ฃŒ
  • deferred : ๋ฐ”๋กœ ์ข…๋ฃŒ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ญ”๊ฐ€ ์„ธ์ด๋ธŒํฌ์ธํŠธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๊ฒƒ์ด cancel๋˜์–ด์•ผํ•˜๋Š”์ง€ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•œ๋‹ค
    • `pthread_testcancel()` ์— ๋„๋‹ฌํ•ด์•ผ๋งŒ cancel์ด ๋ฐœ์ƒํ•œ๋‹ค

์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•œ ๊ทธ๋ฆผ..

  • Off : cancel ๋ถˆ๊ฐ€๋Šฅ. State๊ฐ€ Enabled๋ ๋•Œ๊ฐ€์ง€ ๋ณด๋ฅ˜ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์–ด๋А๊ฑธ ์“ธ์ง€ Mode๋ฅผ ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋‘ฌ์•ผ ํ•œ๋‹ค!

  •