์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ๊ฐ๋ฐํ๋ก์ ํธ ํนํ
- Node.js ์ค์น
- 2017 Do it! Node.js ํ๋ก๊ทธ๋๋ฐ(๊ฐ์ ํ) #Node.js๊ฐ์ #Node.js
- ํ์ด์
- node.js
- IT ํนํ
- Today
- Total
Odds and Ends
์ด์์ฒด์ ๊ต์ Chap 05 ์ค๋ ๋ ๋ณธ๋ฌธ
[Overview - 1]
๐ ์ค๋ ๋๋? > ์คํ๋๋ ํ๋ฆ
: CPU ์ด์ฉ์ ๊ธฐ๋ณธ ๋จ์
- ์ ์ด ํ๋ฆ ํํ
- ์ค๋ ๋ ID, ํ๋ก๊ทธ๋จ ์นด์ดํฐ (PC), ๋ ์ง์คํฐ ์งํฉ, ์คํ์ผ๋ก ๊ตฌ์ฑ
- ๊ฐ์ ํ๋ก์ธ์ค์ ์ํ ๋ค๋ฅธ ์ค๋ ๋์ ์ฝ๋, ๋ฐ์ดํฐ ์น์ , ๊ทธ๋ฆฌ๊ณ ์ด๋ฆฐ ํ์ผ์ด๋ ์ ํธ์ ๊ฐ์ ์ด์์ฒด์ ์์๋ค์ ๊ณต์
- Single threaded program: 1 process์ 1 thread (ํ๋์ ํ๋ก์ธ์ค์ ์คํํ๋ฆ์ ํ๋, main thread 1๊ฐ)
[์ฑ๊ธ ์ค๋ ๋ > ๋ฉํฐ์ค๋๋]
- ์คํ ๊ณต์ ์ํจ : ์คํ ์ ๋ก์ปฌ ๋ณ์๊ฐ ๋ฐ๋ก๋ฐ๋ก ๋ง๋ค์ด ์ฃผ์ด์ผํจ
- ํจ์ ๋จ์๋ก ์ค๋ ๋ ๋ง๋ฆ. > 3ํจ์ 3์ค๋ ๋(์คํํ๋ฆ 3๊ฐ)
- ์ค๋ ๋ ๊ฐ ์๋ก ๊ณต์ ํ๋ ๊ฒ : ์ฝ๋, ๋ฐ์ดํฐ, ํ์ผ, ์ ์ญ๋ณ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณต์ .
* ํ๋ก์ธ์ค๋ ๋๋ต์ ์ผ๋ก ์์์ ์๋๋ก [ํจ์ > ๋ฐ์ดํฐ > ์คํ๋ฉ๋ชจ๋ฆฌ] ๋ก ๊ตฌ์ฑ๋จ.
๐ ๋ฉํฐ ์ค๋ ๋ (multihread)
- Multiprogramming์ Multithread๊ฐ ์๋
[๋ฉํฐ ์ค๋ ๋ ์ฅ์ ]
* ์๋ต์ฑ
- ๋ํํ ์์ฉ์ ๋ค์ค ์ค๋ ๋ํํ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ถ์ด ๋ด์๋๊ฑฐ๋, ์์ฉ ํ๋ก๊ทธ๋จ์ด ๊ธด ์์
์ ํ๋๋ผ๋ ํ๋ก๊ทธ๋จ์ด ๊ณ์๋๋ ๊ฒ์ ํ์ฉ => ์ฌ์ฉ์์๊ฒ ์๋ต์ฑ ์ฆ๊ฐ ex. ๋จ์ผ ์ค๋ ๋ -> ์ฐ์ฐ์ด ์๋ฃ๋ ๋๊น์ง ์๋ต x
* ์์ ๊ณต์
- ์๋์ผ๋ก ํ๋ก์ธ์ค์ ์์๋ค๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ค. ํ๋ก์ธ์ค๋ ์๋ X
- ์ฝ๋์ ๋ฐ์ดํฐ ๊ณต์ ์ ์ด์ ์ ํ ์์ฉ์ด ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ ๋ด์ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฅธ ์์ ์ ํ๋ ์ค๋ ๋๋ฅผ ๊ฐ์ง ์ ์๋ค.
* ๊ฒฝ์ ์ฑ
- ์์ ๊ณต์ ๋๋ฌธ์ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๋ฌธ๋งฅ ๊ตํํ๋ ๊ฒ์ด ๋์ฑ๋ ๊ฒฝ์ ์
- ์ค๋ ๋ ์์ฑ์ ํ๋ก์ธ์ค ์์ฑ๋ณด๋ค ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋ ์๋น
- ๋ฌธ๋งฅ ๊ตํ์ ํ๋ ์ธ์ค ์ฌ์ด๋ณด๋ค ์ค๋ ๋ ์ฌ์ด์์ ๋ ๋น ๋ฅด๋ค.
* ๊ท๋ชจ ์ ์์ฑ (Utilization of MP Architecture)
- ๋ค์ค ์ฒ๋ฆฌ๊ธฐ ๊ตฌ์กฐ์์ ์คํํ์ฌ ๊ฐ๊ฐ์ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ฒ๋ฆฌ๊ธฐ์์ ๋ณ๋ ฌ๋ก ์ํ๋ ์ ์๋ค.
๐ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์
๐ก1 ์์ฒญ ๋น 1 ์ค๋ ๋
ex. 1000๋ช ์ ์ฌ์ฉ์ ? > 1000๊ฐ ์ค๋ ๋๋จ > ์คํ๋ 1000๊ฐ ๋ง๋ค์ด์ง(2k์ ๋)
> 1000๊ฐ ์ค 5๊ฐ๊ฐ ์ฃฝ์ผ๋ฉด ๋ค๋ฅธ ์ค๋ ๋์ ์ํฅ์ด ์๋ ๊ฐ? > ์๋ค! 955๊ฐ๋ ๊ทธ๋๋ก ์ ์์ ์ผ๋ก ์คํ๋จ.
* ์ค๋ฅ ๋๋ ๋ค๋ฅธ๊ฑด ๊ด์ฐฎ์ > ์์ ์ฑ์ด ๋๋ค!
๋ฉํฐ ์ค๋ ๋ vs ๋ฉํฐ ํ๋ก์ธ์ค
: ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ๋ก๋ถํฐ ์์์ ํ ๋น๋ฐ๋ ์์ ์ ๋จ์์ด๊ณ ์ค๋ ๋๋ ํ๋ก์ธ์ค๊ฐ ํ ๋น๋ฐ์ ์์์ ์ด์ฉํ๋ ์คํ์ ๋จ์์ด๋ค.
- ๋ฉํฐ ์ค๋ ๋๋ ๋ฉํฐ ํ๋ก์ธ์ค๋ณด๋ค ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ Context Switching์ด ๋น ๋ฅธ ์ฅ์ ์ด ์์ง๋ง, ๋๊ธฐํ ๋ฌธ์ ์ ํ๋์ ์ค๋ ๋ ์ฅ์ ๋ก ์ ์ฒด ์ค๋ ๋๊ฐ ์ข ๋ฃ ๋ ์ํ์ ๊ฐ๊ณ ์๋ค.
- ๋ฉํฐ ํ๋ก์ธ์ค๋ ํ๋์ ํ๋ก์ธ์ค๊ฐ ์ฃฝ๋๋ผ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ํฅ์ ์ฃผ์ง ์์ ์์ ์ฑ์ด ๋์ง๋ง, ๋ฉํฐ ์ค๋ ๋๋ณด๋ค ๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ๊ณผ CPU ์๊ฐ์ ์ฐจ์งํ๋ ๋จ์ ์ด ์๋ค.
- ๋ ๋ฐฉ๋ฒ์ ๋์์ ์ฌ๋ฌ ์์ ์ ์ํํ๋ ์ ์์ ๋์ผํ์ง๋ง, ๊ฐ๊ฐ์ ์ฅ๋จ์ด ์์ผ๋ฏ๋ก ์ ์ฉํ๋ ์์คํ ์ ๋ฐ๋ผ ์ ํฉํ ๋์ ๋ฐฉ์์ ์ ํํ๊ณ ์ ์ฉํด์ผ ํ๋ค.
๐ ์ฌ์ฉ์ ์ค๋ ๋
: ์ฌ์ฉ์ ์ค๋ ๋๋ ์ปค๋ ์์ญ์ ์์์์ ์ง์๋๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์ ๋ ๋ฒจ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๊ตฌํ๋๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ค๋ ๋์ ์์ฑ ๋ฐ ์ค์ผ์ค๋ง ๋ฑ์ ๊ดํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ์ค๋ ๋๊ฐ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋๋ฏ๋ก ์๋๊ฐ ๋น ๋ฅธ ์ฅ์ ์ด ์๋ ๋ฐ๋ฉด, ์ฌ๋ฌ ๊ฐ์ ์ฌ์ฉ์ ์ค๋ ๋ ์ค ํ๋์ ์ค๋ ๋๊ฐ ์์คํ ํธ์ถ ๋ฑ์ผ๋ก ์ค๋จ๋๋ฉด ๋๋จธ์ง ๋ชจ๋ ์ค๋ ๋ ์ญ์ ์ค๋จ๋๋ ๋จ์ ์ด ์๋ค. ์ด๋ ์ปค๋์ด ํ๋ก์ธ์ค ๋ด๋ถ์ ์ค๋ ๋๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ฉฐ ํด๋น ํ๋ก์ธ์ค๋ฅผ ๋๊ธฐ ์ํ๋ก ์ ํ์ํค๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ์ ์์ : POSIX Pthreads, Mach C-threads, Solaris threads
๐ ์ปค๋ ์ค๋ ๋
: ์ปค๋ ์ค๋ ๋๋ ์ปค๋(์ด์์ฒด์ )์ด ์ง์ํ๋ ์ค๋ ๋ ๊ธฐ๋ฅ์ผ๋ก ๊ตฌํ๋๋ฉฐ, ์ปค๋์ด ์ค๋ ๋์ ์์ฑ ๋ฐ ์ค์ผ์ค๋ง ๋ฑ์ ๊ด๋ฆฌํ๋ค. ์ค๋ ๋๊ฐ ์์คํ ํธ์ถ ๋ฑ์ผ๋ก ์ค๋จ๋๋๋ผ๋, ์ปค๋์ ํ๋ก์ธ์ค ๋ด์ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์ค๋จ์ํค์ง ์๊ณ ๊ณ์ ์คํ์์ผ์ค๋ค. ๋ฉํฐํ๋ก์ธ์ฑ ํ๊ฒฝ์์ ์ปค๋์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์์ ํ ๋นํ ์ ์๋ค. ๋ค๋ง, ์ฌ์ฉ์ ์ค๋ ๋์ ๋นํด ์์ฑ ๋ฐ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋๋ฆฌ๋ค.
๐ POSIX๋?
: ๋ค๋ฅธ ์ด์์ฒด์ ๋ค ์ฌ์ด์ ํธํ์ฑ์ ์ํด IEEE์์ ๋ง๋ ํ์ค, Unix์ ๊ธฐ๋ฐ
> ๊ฐ ํ์ฌ๋ผ๋ฆฌ ํธํ์ด ์๋ผ์ ์ ๋์ค๋ก ์๋ก ํธํ๋๋๋ก ํ์ค์์ผ๋ก ๋ง๋ ๊ฒ์
๐ Many to One
: ๋ณ๋ ฌ์ฑ ๊ฐ์ฅ ๋จ์ด์ง, ํจ์จ์ฑ ์ข์
- ๋ง์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ํ๋์ ์ปค๋ ์ค๋ ๋๋ก ์ฌ์
- ์ปค๋์ ์ ๊ทผ ์ ONE ์ค๋ ๋๋ก ์ ๊ทผ ๊ฐ๋ฅ
- ์ค๋ ๋ ๊ด๋ฆฌ : ์ฌ์ฉ์ ๊ณต๊ฐ์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ > ์ปค๋ ์ค๋ ๋์์ ์ฌ์ฉ ์๋จ!
๐ One to One
: ๋ณ๋ ฌ์ฑ ๊ฐ์ฅ ์ข์,์ปค๋ ๋ญ๋น ์ฌํจ ํจ์จ์ฑ ๋จ์ด์ง
- ๊ฐ ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ๊ฐ๊ฐ ํ๋์ ์ปค๋ ์ค๋ ๋ ๋์๋จ > ์ฌ์ง ์ฐธ๊ณ
- ํ๋์ ์ค๋ ๋๊ฐ ๋ด์์ ์์คํ ์ฝ์ ํธ์ถํ๋๋ผ๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ๋ณ๋ ฌ์ฑ ์ ๊ณต
- ๋ค์ค ์ฒ๋ฆฌ๊ธฐ์์ ๋ค์ค ์ค๋ ๋๊ฐ ๋ณ๋ ฌ๋ก ์ํ๋๋ ๊ฒ์ ํ์ฉ
๋จ์ : ์ฌ์ฉ์ ์ค๋ ๋๋ฅผ ๋ง๋ค๋ ค๋ฉด ํด๋น ์ปค๋ ์ค๋ ๋๋ฅผ ๋ง๋ค์ด์ผ๋๋๋ฐ ๋ง์ ์์ ์ปค๋ ์ค๋ ๋๊ฐ ์์คํ ์ฑ๋ฅ์ ๋ถ๋ด
๐ Many to Many
: ์ค์ฌ, ๋ณด์ํ ๊ฒ. ์ฑ๋ฅ์ ์ธ ์ธก๋ฉด์์ ๋ฐ๋์ง.
- ์ฌ๋ฌ ๊ฐ์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ๊ทธ๋ณด๋ค ์์ ์, ํน์ ๊ฐ์ ์์ ์ปค๋ ์ค๋ ๋
- ํ์ํ ๋งํผ ๋ง์ ์ฌ์ฉ์ ์์ค ์ค๋ ๋๋ฅผ ์์ฑํ ์ ์๋ค.
- ์์ํ๋ ์ปค๋ ์ค๋ ๋๊ฐ ๋ค์ค ์ฒ๋ฆฌ๊ธฐ์์ ๋ณ๋ ฌ๋ก ์ํ๋ ์ ์๋ค.
๋จ์ :
- ์ค์ ๋ก ๊ตฌํํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
๐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ
: ํ๋ก์ธ์ค๊ฐ ๋๋๋ค = ๋ฉ์ธ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ค. child ์ค๋ ๋๋ ์ข ๋ฃ๋จ > ๋ชจ๋ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋๋ค.
- ์ฆ ํ๋ก์ธ์ค๊ฐ ๋๋๋ฉด ํด๋น ํ๋ก์ธ์ค๋ด์์ ์์ฑ๋ ๋ชจ๋ ์ค๋ ๋๋ ์๋ฉธ๋๋ค.
- ํ ํ๋ก์ธ์ค ๋ด์์ ์์ฑ๋ ๋ชจ๋ ์ค๋ ๋๋ ์ ์ญ๋ณ์๋ฅผ ๊ณต์ ํ๋ค. (์ง์ญ๋ณ์๋ ์ ๊ฐ๊ธฐ ์์ ํจ)
- ํ๋ก์ธ์ค ์์ฑ์ ๋นํด ์ค๋ ๋ ์์ฑ์ ์๋์ ์ผ๋ก ๋น์ฉ(cpu, memory)์ด ๋ฎ๋ค.
๐ ๋ฆฌ๋ ์ค ์ค๋ ๋
* ๋ฆฌ๋ ์ค์์ ์ค๋ ๋ ๋ง๋๋ ๋ฒ
- ๋ฆฌ๋
์ค๋ ์ด๋ค์ ์ค๋ ๋๋ณด๋ค๋ ํ์คํฌ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ค๋ ๋๋ clone() ์์คํ
ํธ์ถ์ ํตํด ์์ฑ๋ฉ๋๋ค.
- clone()๋ฅผ ํตํด ํ์ ์์
์ด ์์ ์์
(ํ๋ก์ธ์ค)์ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
๐ JAVA ์ค๋ ๋
* ์๋ฐ์์ ์ค๋ ๋ ๋ง๋๋ ๋ฒ
: Thread(์ค๋ ๋)๋ฅผ ์์๋ฐ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์์ run() ํจ์๋ฅผ ๊ตฌํํ๋ค.
- ๋ฐ ํจ์๋ ๋ณ๋์ ์ค๋ ๋๋ก ๋์๊ฐ. runner.start(); > ์ค๋ ๋ ์คํ
๐ ์ค๋ ๋ creation - posix (์ ๋์ค ๋ณํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(?) > ์ด์์ฑ ์ข์)
int pthread_create(pthread_t *t_id, pthread_attr_t *attr,
void *(start_function)(void *), void *arg); # input ํ์
์ด void ํฌ์ธํฐ
– Header files
• #include<pthread.h>
– Parameters
- t_id:์์ฑ๋thread’sID๋ฅผ์ ์ฅ
- attr:์์ฑํ thread์ํน์ฑ์์ค์ ,ํน๋ณํ์ค์ ํ ๊ฒ์ด์๋ค๋ฉด NULL
- start_function:์์ฑ๋ thread๊ฐ์ฒ์์คํํ๋ํจ์์ด๋ฆ์ผ๋ก, ์ด ํจ์๊ฐ ์ข ๋ฃ์ ๋์์ thread๋ ์๋ฉธ๋๋ค.
- arg:start_function์ด์ํ๋ ๋์ ๋ฌ๋๋์ธ์ – Returns
- • ์ฑ๊ณต์0,์คํจ์์ด์ธ์๊ฐ
๐ Pthreads
- POSIX๊ฐ ์ค๋ ๋ ์์ฑ๊ณผ ๋๊ธฐํ๋ฅผ ์ํด ์ ์ ํ ํ์ค API
- ์ค๋ ๋์ ๋์ฅ์ ๊ดํ ๋ช ์ธ(Implementation)์ผ ๋ฟ์ด์ง ๊ทธ๊ฒ ์์ฒด๋ฅผ ๊ตฌํ(Specification)ํ ๊ฒ์ ์๋๋ค.
- ์ด ๋ช ์ธ๋ฅผ ๊ฐ์ง๊ณ ์ด์์ฒด์ ์ค๊ณ์๋ค์ ๊ทธ๋ค ๋๋ฆ๋๋ก ๊ตฌํํ ์ ์๋ค.
- Unix(Linux, macOS)์ด Pthreads ๋ช ์ธ๋ฅผ ๊ตฌํํ๊ณ ์๋ค. โ์์
๐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ - POSIX (1)
: ์คํ ์์ ํ์ ํ๊ธฐ
[์ถ๋ ฅ ๊ฒฐ๊ณผ ์์]
1. ์์ฑ๋ thread ID ~
(2์ด ํ)
2. ์ฐ๋ ๋ ์คํ์ค
(1์ด ํ)
3. main() ์ข ๋ฅ
* 2๋ฒ ๋ค์ ์คํํ๋ ค๊ณ ๋๊ธฐ ์ค์ธ๋ฐ ๋๋๋ฒ๋ฆผ > child ์ค๋ ๋ ์ข ๋ฃ๋จ
* ๋ฆฌ๋ ์ค์์ ์ปดํ์ผ ํ๋ ๋ฒ
: > gcc -D_REENTRANT thread1.c -0 thread1 -lpthread
D_REENTRANT: ๋์ํธ์ถ ๊ฐ๋ฅ (์๋ฏธ๋ ๋ชจ๋ฆ, ํต์๊ธฐํด)
๐ ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ - POSIX (2)
* pthread_join() : ์ค๋ ๋๊ฐ ์ข ๋ฃํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค.
* phread_create() : ์ค๋ ๋ ์๋ณ์ & ์ค๋ ๋ ์์ฑ + ์๋ก์ด ์ค๋ ๋๊ฐ ์คํ์ ์์ํ ํจ์์ ์ด๋ฆ ๋ฃ์ด์ค
- pthread_join() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ for ๋ฐ๋ณต๋ฌธ์ผ ๋ก ๋๋ฌ์ธ๋ ๊ฒ์ด๋ค.
'์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด์์ฒด์ 6์ฅ CPU ์ค์ผ์ค๋ง (0) | 2022.10.28 |
---|---|
์ด์์ฒด์ ๊ต์ : Chap 04 Process (0) | 2022.10.22 |
์ด์์ฒด์ ๊ต์ : Chap03 ์ด์์ฒด์ ๊ตฌ์กฐ (0) | 2022.10.18 |
์ด์์ฒด์ ๊ต์ Chap02 ์ปดํจํฐ ๊ตฌ์กฐ (0) | 2022.10.09 |
์ด์์ฒด์ ๊ต์ Chap01 (0) | 2022.09.26 |