Thread์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณธ๋‹ค.

์“ฐ๋ ˆ๋“œ(Thread)

์“ฐ๋ ˆ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ **๋‚ด๋ถ€์˜ ํ๋ฆ„(๋งฅ)**์ด๋‹ค.

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
  int n = 1;
  int m = 10;
  cout << n * m;
  while(n < m)
    n++;
  cout << "end" << endl;
}

์ด๋Ÿฐ ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ํ๋ฆ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์ด๊ฒƒ์„ ์“ฐ๋ ˆ๋“œ๋ผ ๋ถ€๋ฅธ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์€ ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฐ–๋Š”๋‹ค.

๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ(Mulitithreads)

ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์— ์“ฐ๋ ˆ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•œ ํ”„๋กœ๊ทธ๋žจ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ ์ฆ‰, ํ๋ฆ„์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋น ๋ฅธ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์Šค์œ„์นญ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋™์ž‘์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

์ด ๋•Œ, ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ์„ concurrent, ์‹ค์ œ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ simultaneous๋ผ๊ณ  ํ•œ๋‹ค.

  • concurrent
    • CPU๊ฐ€ ํ•˜๋‚˜์ธ ํ™˜๊ฒฝ์—์„œ ์Šค์œ„์นญ์— ์˜ํ•ด ๋™์‹œ์— ์ˆ˜ํ–‰
  • simultaneous
    • ์—ฌ๋Ÿฌ๊ฐœ์˜ CPU ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ๋กœ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๊ฒฝ์šฐ

์˜ˆ์‹œ

๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋Š” Web browser ์ด๋‹ค. ํ™”๋ฉด์„ ์ถœ๋ ฅํ•˜๋Š” ์“ฐ๋ ˆ๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ค๋Š” ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋”ฐ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ ์™ธ์—๋„ Word processor, Media player ๋“ฑ ํ˜„์žฌ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํ˜„๋Œ€ ์šด์˜์ฒด์ œ์˜ Switching ๋‹จ์œ„

์ด์ „์˜ CPU ์Šค์ผ€์ค„๋ง์—์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐ„๋‹ค๊ณ  ํ•˜์˜€๋Š”๋ฐ, ์ด๋Š” ์˜ˆ์ „์˜ ๋ฐฉ์‹์ด๋‹ค. ํ˜„์žฌ ์šด์˜์ฒด์ œ์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ ๋‹ค์ค‘ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ ๋„˜์–ด๊ฐ€์„œ ๊ทธ ํ”„๋กœ์„ธ์Šค์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํ˜„๋Œ€ ์šด์˜์ฒด์ œ์˜ context switching ๋‹จ์œ„๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋‹Œ ์“ฐ๋ ˆ๋“œ ๋‹จ์œ„์ด๋‹ค.

Thread VS Precess

์ด ๋ถ€๋ถ„์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด process๋ฅผ ๋ณด๊ณ ์˜ค์ž.
๊ฐ€๋ณ๊ฒŒ ์ดํ•ดํ•˜๋Š” ์ปดํ“จํ„ฐ 07: ์šด์˜ ์ฒด์ œ๊ฐ€ ํ•˜๋Š” ์ผ
์šด์˜์ฒด์ œ ์ •๋ฆฌ 05: ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ

ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด๋‹ค. ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ๋กœ๋Š” Code, Data, Heap, Stack์ด ์žˆ๋‹ค. ์ด ๋•Œ ์“ฐ๋ ˆ๋“œ๋Š” ์ž๊ธฐ๊ฐ€ ์†ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์ง‘์ด๋ผ๋ฉด ๊ฐ ๊ฐœ์ธ ๊ตฌ์„ฑ์›์ด ๊ฑฐ์‹ค์„ ๊ณต์œ ํ•˜๋Š” ์…ˆ์ด๋‹ค.

|๊ณต์œ |๋…๋ฆฝ| |::----|::----| |Code|Stack| |Data|PC(program counter)| |Heap|SP(stack pointer)| ||Registers|

Thread๊ฐ€ ๋…๋ฆฝ์  ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์•ผ ํ•˜๋Š” ์ด์œ 

ํ˜„๋Œ€ ์šด์˜์ฒด์ œ๋Š” ๊ฒฐ๊ตญ Context Switching์˜ ์ตœ์†Œ๋‹จ์œ„๋ฅผ thread๋กœ ์žก๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฒฐ๊ตญ CPU๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ thread์ด๊ณ , ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์‹คํ–‰ ํ๋ฆ„์„ ๋…๋ฆฝ์ ์œผ๋กœ ๊ธฐ๋กํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Reference