๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš— Major Study (Bachelor)/๐ŸŸง Operating System

[ OS / ์šด์˜์ฒด์ œ] Thread Pools, fork() and exec(), Thread Local Storage in pthread, Signal Handling

by UKHYUN22 2022. 4. 11.
728x90

Windows์—์„œ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š” ์ง€๋„ ์ž˜ ์ตํ˜€ ๋†“์„ ๊ฒƒ

 

 

Implicit Thread

๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ MultiThread๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. THread Pools, OpenMP, Grand Central Dispatch์˜ ๋ฐฉ๋ฒ• 3๊ฐ€์ง€ ์กด์žฌํ•œ๋‹ค. ์•ž์˜ ๋‘ ๊ฐ€์ง€๋งŒ ์„ค๋ช…ํ•  ์˜ˆ์ •

 

 

Thread Pools

์š”์ฒญ์„ ํ•  ๋•Œ๋งˆ๋‹ค Thread๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—†์• ๊ณ  ์ฒ˜๋ฆฌํ•˜๊ณ  ์—†์• ๊ณ ์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์‹œ๊ฐ„์€ ์งง์ง€๋งŒ ๊ณ„์† ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ž‘์—… ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋งŒ๋“ค๊ณ  ์—†์• ๋Š” ๊ฒƒ์˜ Overhead๊ฐ€ ๋” ์ปค์ ธ๋ฒ„๋ฆฐ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด Thread Pool์ด๋ผ๊ณ  ํ•œ๋‹ค. ์‚ด์•„์žˆ๋Š” Thread๋ฅผ ๋ช‡ ๊ฐœ ๋งŒ๋“ค๊ณ  ์‚ด๋ ค์„œ ์ด๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ œ์ผ ์ค‘์š”ํ•œ ์ ์€ Thread๋ฅผ Createํ•˜๊ณ  ์—†์• ๊ณ  ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•  ์ผ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ๋ถˆ๋Ÿฌ์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ œ์ผ ์ค‘์š”ํ•œ ์ ์€ Create Delete ํ•จ์ˆ˜ Overhead๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ต‰์žฅํžˆ ๋งŽ์€ ์ˆ˜์˜ Thread๋ฅผ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ํ˜„์žฌ ์กด์žฌํ•˜๋Š” Thread์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋กœ ํ™œ์šฉ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์žฅ์ ์ด๋‹ค. 

 

 

Windows Thread Pool

์–ด๋–ป๊ฒŒ WIndow์—์„œ ์‚ฌ์šฉ์„ ํ•˜๋Š”๊ฐ€. 

CALLBACK_ENVIRON์€ ์›ํ•˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ. ํ™˜๊ฒฝ์„ initializeํ•  ์ˆ˜ ์žˆ๋‹ค.

Thread Pool์„ ์‚ฌ์šฉํ•  ๋•Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Thread ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ท€์ฐฎ์Œ์ด ์กด์žฌํ•œ๋‹ค. loop๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ณผ์ •์„ ํ•ด์•ผ ํ•œ๋‹ค. ์–ด๋–ค ์“ฐ๋ ˆ๋“œ๋ฅผ ํ†ต์งธ๋กœ ์ง€์ •ํ•˜๊ณ  ๊ทธ๋ฃน์„ ๋‹จ์œ„๋กœ Wait๋„ ํ•˜๊ณ  ๋ช…๋ น์„ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด CLEANUP_GROUP ์ด๋‹ค. 

 

Windows Thread Pool

CreateThreadpoolWork๋Š” Callback function์„ ๋ฐ›์•„์„œ callback function์ด workingํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ๊ฒฐํ•ฉํ•ด์„œ work๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  SubmitThreadpoolWork ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์ด ThreadPool์— ๋‚ด๊ฐ€ ์š”์ฒญํ•œ ์ž‘์—…์„ ํ•ด๋‹ฌ๋ผ๋Š” ๋ช…๋ น์ด ์ˆ˜ํ–‰๋˜๋Š” ๋‹จ๊ณ„์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  Callback์ด ์ˆ˜ํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ CleanUpGroup์— ์žˆ๋Š” ๋ชจ๋“  Callback์„ ๊ธฐ๋‹ค๋ฆฌ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 

OpenMP

๋ช…์‹œ์ ์œผ๋กœ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋‹ค. Compiler Pragma๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. #์€ ์ „์ฒ˜๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌํ•œํ…Œ ์ฃผ๋Š” ๋ช…๋ น์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. parallel์ด๋ผ๊ณ  ์ ํ˜€์žˆ์œผ๋ฉด ๋‹ค์Œ ์ ํ˜€ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ชจ๋“  CPU์—์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. Quard Core์˜ ๊ฒฝ์šฐ ํ•ด๋‹น print ๋ฌธ์ด 4๋ฒˆ ์‹คํ–‰๋˜๊ฒŒ ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ์˜ ๊ฒฝ์šฐ for๋ผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ for๋ฌธ์„ ๋ชจ๋“  CPU์— ๋‚˜๋ˆ ์„œ ํ•ด๋‹น ์ž‘์—…์„ ์‹œํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค. 

 

fork() and exec()

 Process ๋ฅผ ๋ณต์‚ฌํ•ด์„œ Process ๋ฅผ ๊ทธ๋Œ€๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ์„ fork๋ผ๊ณ  ํ•œ๋‹ค. ์กด์žฌํ•˜๋Š” Thread๋ฅผ ๋ชจ๋‘ Fork๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ํ•˜๋‚˜์˜ Thread๋งŒ Fork๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. UNIX๋Š” ๋‘˜ ๋‹ค ์ง€์›์„ ํ•œ๋‹ค. fork1์€ Thread๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ fork ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.  exec(), ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ํ•จ์ˆ˜. ๋ชจ๋“  Thread์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค. 

 

Cancellation

Parent ์ž…์žฅ์—์„œ child๋Š” ๋” ์ด์ƒ ํ•„์š”์—†๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•  ๋•Œ ์ฃฝ์ด๋Š” ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ํ•จ์ˆ˜๊ฐ€ pthread_cancel ํ•จ์ˆ˜์ด๋‹ค. Parent Process์™€ Child Process๋Š” ๋…๋ฆฝ์ ์ธ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Child๋ฅผ ์•„๋ฌด ๋ฌธ์ œ ์—†์ด ์ฃฝ์ผ ์ˆ˜ ์žˆ๋‹ค. Thread์˜ ๊ฒฝ์šฐ๋Š” ํ•˜๋‚˜์˜ Thread๊ฐ€ ์ฃฝ์œผ๋ฉด ๋‹ค๋ฅธ Thread์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ฃฝ์ผ ๋•Œ๋Š” ์˜ต์…˜์„ ๊ฐ€์ง€๊ณ  ์‹คํ–‰์„ ํ•ด์•ผ ํ•œ๋‹ค. 

 

Cancellation

๋‚ด๊ฐ€ ์ฃฝ์„ ์ˆ˜ ์žˆ์„์ง€ ์—†์„์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค. PTHREAD_CANCEL_DISABLE ์˜ต์…˜์ด๋‹ค. PTHREAD_CANCEL_ENABLE์€ ๋‚ด๊ฐ€ ์ฃฝ์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‚ด๊ฐ€ ์ฃฝ๋Š” ๋ฐฉ์‹๋„ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ์ฃฝ์œผ๋ผ๊ณ  ํ•˜๋Š” ๋ช…๋ น์„ ํ–ˆ์„ ๋•Œ ๋ฐ”๋กœ ์ฃฝ์œผ๋ ค๋ฉด PTHREAD_CANCEL_ASTNCHRONOUS ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. PTHREAD_CANCEL_DEFFERRED๋Š”.... (์ฐพ์•„๋ณด๊ธฐ) pthread_testcancel()์€ ๋‚ด๊ฐ€ ์ฃฝ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๋” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

pthread.cancel()์€ ๋‚จ์„ ์ฃฝ์ด๋Š” ๋ช…๋ น์–ด

pthread.exit()์€ ๋‚ด๊ฐ€ ์ฃฝ๊ฒ ๋‹ค๋Š” ๋ช…๋ น์–ด

 

 

Signal Handling

Signal์ด ๋ญ”๊ฐ€? ์™ธ๋ถ€์—์„œ ์‹ ํ˜ธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด signal์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. Interrupt์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ Handler๊ฐ€ User mode์—์„œ ๋Œ์•„๊ฐ„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. User Process๋ฅผ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฉ”์นด๋‹ˆ์ฆ˜์ด๋‹ค. Unix <-> Window

 

Example of UNIX Signals

#define SIGINT ๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ctrl c  ๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด 2๋ฒˆ ์‹ ํ˜ธ๋ฅผ ๋‚ ๋ฆฌ๊ฒŒ ๋œ๋‹ค. Signal Handler๊ฐ€ ์ž‘๋™์„ ํ•œ๋‹ค. ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์—๋Š” Default hanlder๊ฐ€ ์กด์žฌํ•˜๊ณ  2๋ฒˆ signal์€ ์ž๊ธฐ ์ž์‹ ์„ terminateํ•˜๋Š” handler๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋œ๋‹ค. signal handler๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. 

 

Installing Signal Handler

signalํ•จ์ˆ˜๋Š” signal handler๋ฅผ ๋“ฑ๋กํ•˜๋ผ๋Š” ๋ช…๋ น์–ด์˜ ํ•จ์ˆ˜์ด๋‹ค. signal์„ ๋ณด๋‚ด๋ผ๋Š” ์‹ ํ˜ธ๊ฐ€ ์•„๋‹ˆ๋‹ค(***********************)

๋‘ ๋ฒˆ์งธ argument๊ฐ€ function pointer์ด๋‹ค. sig_handler์˜ ๊ฒฝ์šฐ ๋‚ด๊ฐ€ ์ง€์ •ํ•œ handler์˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. 1์ดˆ๋งˆ๋‹ค ์ˆซ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ์„ธ๋Š” loop์ด๋‹ค. ์–ด๋–ป๊ฒŒ ์ฃฝ์—ฌ์•ผ ํ•˜๋Š”๊ฐ€? SIGNAL HANDLER ์ค‘์—๋Š” override ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋งŒ๋“  ๊ฒƒ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๊ฒƒ์ด 9๋ฒˆ SIGNAL์ด๋‹ค. 9๋ฒˆ์€ ๋ฐ”๊ฟ”์น  ์ˆ˜ ์—†๋Š” SIGNAL์„ ์˜๋ฏธํ•œ๋‹ค. ctrl + \ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

 

Signal Handling

Multithread ํ™˜๊ฒฝ์—์„œ Signal์ด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜๋Š”๊ฐ€!! ๋ฐฉ๋ฒ•์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กด์žฌํ•œ๋‹ค. signal handler๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ๋ช…๋ นํ•˜๋Š” ํ•จ์ˆ˜๋Š”  signal์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด signal์€ ์–ด๋–ป๊ฒŒ ๋ณด๋‚ด๋Š”๊ฐ€. pthread_kill ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. 

 

Thread-Local Storage

Thread ๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ. Local์ด ์•„๋‹ˆ๋ผ Global ๋ณ„๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค. Local variable์€ ๋”ฐ๋กœ ๋”ฐ๋กœ ์กด์žฌํ•œ๋‹ค. ๋ฐ˜๋ฉด Global์€ ๋ชจ๋“  Thread๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. 

 

Thread Local Storage in pthread

__thread int tls๋Š” modifier์ด๋‹ค. tls ๋ณ€์ˆ˜๊ฐ€ Thread local Storage์— ๋“ค์–ด๊ฐ„๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ Thread๊ฐ€ ๊ฐ๊ฐ tls ๋ณ€์ˆ˜๋ฅผ ์ ‘๊ทผํ•˜๋ฉด ๋ณ„๋„์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์„ ์–ธ์„ ํ•ด์•ผ ํ•œ๋‹ค. 

 

Thread-Local Storage in pthread

์ฝ”๋“œ ์ง์ ‘ ๋Œ๋ ค๋ณด๊ธฐ.