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

[OS / ์šด์˜์ฒด์ œ] POSIX PThreads, Windows Threads,

by UKHYUN22 2022. 4. 7.
728x90

Thread Libraries

ํ•˜๋‚˜๋Š” Kernel Scheduler ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Kernel์ด ์“ฐ๋ ˆ๋“œ๋ฅผ ์ œ๊ณต์•ˆํ•ด๋„ User Level์—์„œ ์ œ๊ณตํ•˜๋Š” User level library๊ฐ€ ์กด์žฌํ•œ๋‹ค. POSIX Pthreads๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์–ด๋– ํ•œ ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ธฐ๋กํ•œ ๋ช…์„ธ์„œ ๋Š๋‚Œ์ด๋‹ค. LinuxThreads, NPTL ์“ฐ๋ ˆ๋“œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. 

 

POSIX PThreads

์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์จ์•ผ ํ•˜๋Š”๊ฐ€? ์ œ์ผ ์ค‘์š”ํ•œ ํ•จ์ˆ˜๋Š” pthread_create ์ด๋‹ค. ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค. ์„ธ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ œ์ผ ์ค‘์š”ํ•˜๋‹ค. function pointer์ด๋‹ค. C์–ธ์–ด์—์„œ ์ž˜ ๋ณด์ง€ ๋ชปํ–ˆ๋˜ ๋ฌธ๋ฒ•์ฒ˜๋Ÿผ ๋Š๊ปด์งˆ ๊ฒƒ์ด๋‹ค. ํ•จ์ˆ˜๋Š” ํŠน์ •ํ•œ ์œ„์น˜๋กœ ๋›ฐ์–ด๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ์ฃผ์†Œ๋ผ๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค. %p๋กœ ์ถœ๋ ฅํ•˜๋ฉด ์ฃผ์†Ÿ๊ฐ’์ด ๋‚˜์˜ค๊ณ  ๊ทธ ๊ณณ์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ํƒ€์ž…์ด function pointer๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. start_routine ์•ž์— ๋ณ„์ด ํ•˜๋‚˜ ์žˆ๊ณ  ์•ž์—๋„ void *๊ฐ€ ์žˆ๊ณ  ๋’ค์—๋„ void *๊ฐ€ ์žˆ๋‹ค. return type๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ void * ๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ void *๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ์˜ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ํŽธ๋ฆฌํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด void * ์ด ๋œ๋‹ค Struct ๋ณ€์ˆ˜์— ๋‹ค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ์ฑ„์›Œ์„œ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— void *๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. 

 ์ € ์„ธ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ƒˆ๋กœ์šด ์“ฐ๋ ˆ๋“œ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๊ฐ’์ด ๋œ๋‹ค.

 ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ฑ„์›Œ์„œ ์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ ธ ์ฑ„์›Œ์ ธ์•ผ ํ•  Thread์˜ ID๊ฐ€ ๋‚˜์ค‘์— ํ• ๋‹น๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด์„œ Kernel, User๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ์ง€, ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ Structure๊ฐ€ ๋œ๋‹ค. 

wait function์˜ ์“ฐ๋ ˆ๋“œ ๋ฒ„์ „์ด join ํ•จ์ˆ˜์ด๋‹ค. ๋‚ด๊ฐ€ ์–ด๋–ค ์“ฐ๋ž˜๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆด์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ๊ทธ๊ฒƒ์ด ์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ํ•ด๋‹นํ•œ๋‹ค. ์ด ์“ฐ๋ ˆ๋“œ ์•„์ด๋””๋Š” Create ํ•จ์ˆ˜์—์„œ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์“ฐ๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ๋‚˜์„œ report value๋ฅผ ๋ฐ›์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌํ„ดํ•˜๊ณ  ์‹ถ์€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์•„์™€์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฏธ void * ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ค‘ ํฌ์ธํ„ฐ ํƒ€์ž…์œผ๋กœ ๋ฐ›๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. exit ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” functioin์ด๋‹ค. ๊ทธ๋ƒฅ exitํ•˜๊ณ  ์–ด๋–ค ์ ์ด ๋‹ค๋ฅผ๊นŒ? pthread_exit์€ ์“ฐ๋ž˜๋“œ ํ•˜๋‚˜๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ด๊ณ  ๊ทธ๋ƒฅ exit์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

 

Example

sum์€ ์ „์—ญ ๋ณ€์ˆ˜์ด๊ณ  ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ์—์„œ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. runner๋ผ๋Š” ํ”„๋กœํ†  ํƒ€์ž…์ด void *์ด๊ณ  ์ด ํ•จ์ˆ˜๊ฐ€ ์“ฐ๋ ˆ๋“œ์˜ ์‹œ์ž‘์ ์„ ๋ฐ›์•„์ค„ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค. ์ฒ˜์Œ atoiํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ string์„ Integer๋กœ ๋ณ€ํ™˜์„ ํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค. 1๋ถ€ํ„ฐ upper๊นŒ์ง€ ๋‹ค ๋”ํ•˜๊ฒŒ ๋˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•œ๋‹ค. pthread_exit์„ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ return NULL์„ ํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค. pthread_t_tid๋Š” TID๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜. pthread_join์„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด sum ์ด ๊ณ„์‚ฐ๋˜๊ธฐ ์ „์— ์ถœ๋ ฅ๋  ํ™•๋ฅ ์ด ๋†’์•„์ง„๋‹ค. 

 

Windows Threads

CreateThread Structure์•ˆ์— ipStartAddress๊ฐ€ ์žˆ๋Š”๋ฐ ์ƒˆ๋กœ ์ƒ๊ธฐ๊ฒŒ ๋˜๋Š” Thread์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ipParamter๋Š” LpStartAddress์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉ์ด ๋˜๊ณ  LpThreadID๋Š” ๋งŒ๋“ค์–ด์ง„ TID๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค. WaitForSingleObject..? ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆด๋•Œ์™€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ๋„ ์‚ฌ์šฉ์„ ํ•œ๋‹ค. 

CloseHandle๋„ Thread Exit์„ ํ•  ๋•Œ ์‚ฌ์šฉ์ด ๋œ๋‹ค. ์ด ํ•จ์ˆ˜..! ์ค‘์š”ํ•˜๋‹ค. ์“ฐ๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„ ํ• ๋‹น๋œ ์ž์›์ด ์–ด๋”˜๊ฐ€์— ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค. Thread๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ CloseHandle์„ ๊ผญ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. CreateThread๋ฅผ ๋งŒ๋“ค ๋•Œ๋งˆ๋‹ค ColseHandle์„ ์จ๋†“๊ณ  ์‹œ์ž‘์„ ํ•ด์•ผ ํ•œ๋‹ค. (๊ผญ ๊ธฐ์–ตํ•  ๊ฒƒ!!!!!!!!!)

 

 

Windows Multithreaded C Program

Window์—์„œ Thread๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •

 

Java Thread

Thread Class๋ฅผ ์ƒ์†๋ฐ›๋Š”๋‹ค. ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋‹จ์ ์ด ํ•˜๋‚˜ ์กด์žฌํ•œ๋‹ค. Child๋Š” ๋”ฑ ํ•˜๋‚˜์˜ Parent๋งŒ ๊ฐ€์ ธ์•ผ ํ•˜๊ณ  ๊ทธ๋•Œ ์ œํ•œ์ ์ธ ์‚ฌํ•ญ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ์‹์€ Runnable Interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Public Interface Runnable์˜ Body๊ฐ€ ์—†์„ ๋•Œ abstract์ด๊ณ  ์ด๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ•จ์ˆ˜๊ฐ€ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค.

 

Java Thread using Thread Class

Thread๋ฅผ ์ƒ์†๋ฐ›๊ณ  run์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ Overloadํ•˜๊ฒŒ ๋œ๋‹ค. PrimeThread๋ฅผ new ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  p.start()๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด run ๋ฉ”์†Œ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.  p.start()๋ฅผ ํ•˜๋ฉด ์ƒˆ๋กœ์šด Thread๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  run()์„ ํ•˜๋ฉด ๊ธฐ์กด์˜ Thread๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. run์„ ํ•˜๋ฉด ๊ธฐ์กด์˜ single Thread๋ฅผ ๊ทธ๋ž˜๋„ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

 

Java Thread using Running Interface

PrimeRun์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  new Thread(p)๋ฅผ ๋งŒ๋“ค๊ณ  start๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค. implements Runnable์„ ํ–ˆ์„๋•Œ ์ข‹์€ ์ ์€ PrimeRun์ด ๋‹ค๋ฅธ Parent CLass๋ฅผ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

Java Multithreaded Program

 

Java Multithreaded Program

new Thread(new Summation(())๋กœ Thread๋ฅผ ๋งŒ๋“ค๊ณ  start()๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ Thread๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

HW4

2๋ฒˆ

child์—์„œ 4๊ฐœ๋งŒ ๋Œ๋ฆฌ์ง€ ๋ง๊ณ  ๋นˆ String์„ ๋งŒ๋‚˜๋ฉด LOOP๋ฅผ ํƒˆ์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด๋ผ

๊ทธ๋ฆฌ๊ณ  unlink๋ฅผ ํ•ด์„œ ํ•ด์ œํ•˜๊ฒŒ ๋œ๋‹ค.

3๋ฒˆ

3๋ฒˆ์งธ์˜ ๊ฐ’์„ ๋„ฃ๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ ๋„ฃ์—ˆ๋˜ ๊ฐ’๋“ค์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

4๋ฒˆ์งธ์˜ ๊ฐ’์„ ๋„ฃ์œผ๋ฉด 2 ๋ฒˆ์งธ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ 2์นธ ์ฐจ์ด๋ฅผ ์ฃผ๋ฉด์„œ ์ถœ๋ ฅ์„ ํ•˜๊ฒŒ ํ•œ๋‹ค.

User๊ฐ€ ESC(27๋ฒˆ)๋ฅผ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด Producer Terminate๋ฅผ ํ•˜๊ณ  ๋‚จ์•„์žˆ๋Š” 2๊ฐœ์˜ Key๋ฅผ ๋งˆ์ € ๋ฝ‘์•„์„œ ์ถœ๋ ฅํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค.

Shared Memory๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ปดํŒŒ์ผ ์‹œ -lrt๋ฅผ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

 

๊ทธ์•ˆ์— ์žˆ๋Š” ๊ฐ’๋“ค์ด 3๊ฐœ ์•„๋ž˜์ธ ๊ฒฝ์šฐ ๊ธฐ๋‹ค๋ ค๋ผ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ๋„ฃ๊ฒŒ ๋œ๋‹ค. getCount๋ฅผ ํ†ตํ•ด์„œ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. out = out + 1์˜ ๋ฐฉ๋ฒ•์€ ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„์„ ํ•  ๊ฒƒ์ด๋‹ค. wait์˜ ์˜๋ฏธ๋Š” ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉํ•˜๋ผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ while๋กœ ๊ตฌํ˜„ํ•˜๋ผ๋Š” ์˜๋ฏธ. 

 

KeyBuffer ๊ตฌํ˜„

GetKeyCount๋Š” in out์„ ํ†ตํ•ด์„œ ํ˜„์žฌ ๋ช‡ ๊ฐœ์˜ key ๊ฐ€ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค. ๋ช‡ ๊ฐœ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•„์š”

ํ•œ ๋‘์ค„์ด๋ฉด ๋‹ค ๋๋‚˜๋Š” ํ•จ์ˆ˜๋“ค

 

Consumer์—์„œ wait์€ while loop ์‚ฌ์šฉ