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 ๋ณ์๋ฅผ ์ ๊ทผํ๋ฉด ๋ณ๋์ ๋ณ์์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค. ์ ์ญ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ํจ์ ๋ฐ์์ ์ ์ธ์ ํด์ผ ํ๋ค.