Skip to content

Latest commit

ย 

History

History
156 lines (101 loc) ยท 8.3 KB

multithread-programming.md

File metadata and controls

156 lines (101 loc) ยท 8.3 KB

Multithread Programming

์ž‘์„ฑ์ž : ๋ฐ•์žฌ์šฉ

๋ณธ ์ž๋ฃŒ๋Š” ์ž‘์„ฑ์ž์ธ '๋ฐ•์žฌ์šฉ'์˜ ๊ฐœ์ธ Repository์˜ ๊ธ€์„ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ž๋ฃŒ๋ฅผ ๊ณต๋ถ€ํ•˜๊ธฐ ์ด์ „์— ์ตํ˜€๋‘์–ด์•ผ ํ•˜๋Š” ๋‘๊ฐ€์ง€ ๊ธฐ์ˆ ์„ ๋จผ์ € ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜๊ธฐ
  • ์Šค๋ ˆ๋“œ์™€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ๋ถ„ํ•ด๋ณด๊ธฐ
Table of Contents

ํ”„๋กœ์„ธ์Šค

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

ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

  • Code : ์‹คํ–‰๋  ๋ช…๋ น์–ด๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ตฌ์—ญ
  • Data : ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ตฌ์—ญ
  • Stack : ์ง€์—ญ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜ ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ตฌ์—ญ
  • Heap : malloc์ด๋‚˜ New๋กœ ํ• ๋‹น๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ๊ตฌ์—ญ
  • PCB : Process Control Block

ํ”„๋กœ์„ธ์Šค๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์„ ์„ธ๊ทธ๋จผํŠธ๋ผ ํ•œ๋‹ค.

์Šค๋ ˆ๋“œ

ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ์˜ ์‹คํ–‰๋˜๋Š” ํ๋ฆ„์˜ ๋‹จ์œ„
ํ”„๋กœ์„ธ์Šค์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด๋‹ค. ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ์ž์‹  ๊ณ ์œ ์˜ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  Data, Heap, Code ์˜์—ญ์€ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ์˜ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ ํž™ ์˜์—ญ์€ ์Šค๋ ˆ๋“œ๊ฐ„ ๊ณต์œ ๊ฐ€ ๋œ๋‹ค. ๋˜‘๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ณ  ํ•œ ์žฅ์†Œ์— ์žˆ๋Š” ๊ฒƒ์„ ์ž์‹๊ณผ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.


ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ ๊ด€๋ จ

  • ์Šคํƒ์˜์—ญ๋งŒ ์ƒˆ๋กœ ํ•˜๋‚˜ ํŒŒ์ฃผ๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑ ์‹œ overhead๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ์ž‘๋‹ค.
  • ์บ์‹œ ๋ฏธ์Šค๊ฐ€ ๋น„๊ต์  ์ ๊ฒŒ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋Š” Context Switching ๋น„์šฉ์˜ overhead๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ์ ๋‹ค.
  • ์Šค๋ ˆ๋“œ๊ฐ„์˜ ํ†ต์‹ ์ด ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ ์€ overhead๊ฐ€ ํผ
  • ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉˆ์ถ”๊ฒŒ ํ•œ๋‹ค.
  • ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์—ฌ๋Ÿฌ๊ตฐ๋ฐ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋ฏ€๋กœ ์Šค๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ ๋””๋ฒ„๊น…์ด ๋„ˆ๋ฌด๋‚˜๋„ ์–ด๋ ต๋‹ค.

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‚ฌ์šฉ ์ด์œ 

  • ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU์—์„œ์˜ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•˜์—ฌ
  • ๋ฉ€ํ‹ฐ CPU ์ปดํ“จํ„ฐ, ๋ณ‘๋ ฌ์ปดํ“จํ„ฐ์—์„œ์˜ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•˜์—ฌ

ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋” ๋น ๋ฅด๊ฒŒ ๋Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
10 FPS ๊ฒŒ์ž„์„ 20 FPS๋กœ ์˜ฌ๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ, ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ด๊ธฐ ์œ„ํ•˜์—ฌ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ๋‹ค.

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๋ญ์•ผ?

  • ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์œ ์ผํ•œ ๊ตฌํ˜„ ์ˆ˜๋‹จ
  • ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค ์•ˆ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณ‘๋ ฌ์„ฑ์„ ์–ป๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•

์„ฑ๋Šฅ์„ ์œ„ํ•˜์—ฌ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š”๊ฐ€?

์ •๋‹ต์€ ์•„๋‹ˆ๋‹ค. ๊ฒŒ์ž„์€ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€์€ ์žˆ์ง€๋งŒ ๊ฒŒ์ž„์ด ๋Š๋ฆฌ๊ฑฐ๋‚˜, ํ”„๋กœ๊ทธ๋žจ์ด ๋Š๋ฆฌ๋‹ค๋ฉด ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ์šฐ์„ ์‹œ ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด์„œ ์„ฑ๋Šฅ๊ฐœ์„ ์„ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๊ณ  ์ตœํ›„์˜ ๋ณด๋ฃจ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง„ํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.
์ฃผ์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด ๋” ๋Š๋ ค์งˆ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํž˜๋“  ์ด์œ 

๋งค๋ฒˆ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•จ์—๋„ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์„œ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฉด ๊ณ„์† ๊ฐ™์€ ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ ํ•˜๋Š”๋ฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฐ’์ด ๋งค๋ฒˆ ๋‹ค๋ฅด๋‹ค. ์ด๊ฒƒ์€ ์ž˜๋ชป ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋””๋ฒ„๊น…์ด ์‰ฝ์ง€ ์•Š๊ณ  Data Race์— ๋ถ€๋”ชํž ์ˆ˜ ์žˆ๋‹ค. Data Race๋ž€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‘๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ฝ๊ณ  ์“ฐ๊ณ  ํ•  ๋•Œ์— ๋ชจ๋“  ์ „์—ญ ๋ณ€์ˆ˜๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์ด๋ฏ€๋กœ ์ฝ๊ณ  ์“ฐ๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ  ์ด ์ƒํƒœ๋ฅผ ๊ฒฝ์Ÿ ์ƒํƒœ๋ผ๊ณ  ํ•œ๋‹ค. ํ•˜์ง€๋งŒ C++11์—์„œ lock๊ณผ unlock์„ ์ง€์›ํ•ด์ฃผ๋ฏ€๋กœ ๋ณต์ˆ˜๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ์ฝ”๋”ฉ์„ ์ง„ํ–‰ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

#include <thread>
#include <iostream>
#include <mutex>

std::mutex mtx_lock;

int main(){

    std::thread Threads1([&] (){
        for(int i=0;i<5;++i){
            mtx_lock.lock();
            std::cout << "Thread Num : " << i << std::endl;
            mtx_lock.unlock();
        }
    });

    std::thread Threads2;
    Threads2 = std::thread([&](){
        for(int i=10;i<15;++i){
            mtx_lock.lock();
            std::cout << "Thread Num : " << i << std::endl;
            mtx_lock.unlock();
        }
    }
    return 0;
}

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ mutex ๊ฐ์ฒด๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ฝ”๋”ฉํ•˜์—ฌ์•ผ ํ•˜๊ณ  ๊ฐ™์€ ๊ฐ์ฒด ์‚ฌ์ด์—์„œ๋งŒ lock๊ณผ unlock์ด ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ฃผ์˜ํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์„œ๋กœ ๋™์‹œ์— ์‹คํ–‰๋˜์–ด๋„ ๊ดœ์ฐฎ์€ Critical Section (lot reader, 0 writer)์—์„œ๋Š” ๋‹ค๋ฅธ mutex ๊ฐ์ฒด๋กœ ๋ณดํ˜ธํ•˜๋Š”๊ฒƒ์ด ์„ฑ๋Šฅ์— ์ข‹๋‹ค.

๋ฉ€ํ‹ฐ์ฝ”์–ด CPU

ํ•œ ๊ฐœ ์ด์ƒ์˜ ์ฝ”์–ด๋กœ ๊ตฌ์„ฑ๋œ CPU. i3, i5, i7
2021๋…„ ํ˜„์žฌ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค ๋ฉ€ํ‹ฐ์ฝ”์–ด ex) Xbox, ๋‹Œํ…๋„ ์Šค์œ„์น˜

C++ ์–ธ์–ด์— ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ‘œ์ค€์œผ๋กœ ์กด์žฌ

๊ณผ๊ฑฐ์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ๋ฒ•: Window์—์„œ๋Š” Win32 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ง€์›๋˜๋Š” API ์‚ฌ์šฉํ–ˆ์—ˆ๊ณ , ์œˆ๋„์šฐ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ์— ํŠนํ™”๋œ OS์ด๊ณ  ๋ฆฌ๋ˆ…์Šค๋Š” pthread API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋Šฅํ–ˆ๋‹ค.

Windows์—์„œ์˜ thread =>
ํ”„๋กœ์„ธ์Šค์˜ ํ•˜์œ„ ๊ฐœ๋… ํ”„๋กœ์„ธ์Šค๋Š” ์ฒ˜์Œ ์‹œ์ž‘ ์‹œ ํ•œ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ–๊ณ  ์‹œ์ž‘๋˜๊ณ  ์šด์˜์ฒด์ œ๊ฐ€ ์ง์ ‘ ์Šค์ผ€์ฅด๋งํ•˜๊ฒŒ ๋œ๋‹ค.


๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋žจ

๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์ง•

  • ์‹คํ–‰๋œ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์˜ ์—ฌ๋Ÿฌ๊ณณ์ด ๋™์‹œ์— ์‹คํ–‰๋œ๋‹ค.
  • ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฐ์ฒด ์‚ฌ์ด์˜ ๋™๊ธฐํ™”๊ฐ€ ํ•„์ˆ˜์ด๋‹ค. (synchronization)
  • ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ๋ฉ”์„ธ์ง€ํŒจ์‹ฑ ๋ชจ๋ธ์ด ์žˆ๋‹ค.

๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์š”๊ตฌ์‚ฌํ•ญ

  • ์ •ํ™•์„ฑ : ๋‹ค์–‘ํ•œ ํ๋ฆ„์—์„œ ๋™์‹œ๋‹ค๋ฐœ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด๋„ ๋ฌธ์ œ ์—†์ด ์‹คํ–‰๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”
  • ์„ฑ๋Šฅ : Context ์ฆ๊ฐ€์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๋†’์•„์•ผ ํ•จ

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

  1. ๋ฉ€ํ‹ฐ์ฝ”์–ด ํ”„๋กœ์„ธ์„œ๋ฅผ ๋งŒ๋“œ๋Š” ์ด์œ ?

CPU์˜ ์„ฑ๋Šฅ์„ ์˜ฌ๋ ค์•ผํ•˜๊ณ , ํด๋Ÿญ ์†๋„๋ฅผ ๋†’์—ฌ์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ํด๋Ÿญ ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์—†์Œ. ํ•œ๊ณ„๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๋‹ค. => ํด๋Ÿญ ์†๋„๊ฐ€ 4GHz๊ฐ€ ๋˜๋ฉด ์ปดํ“จํ„ฐ๊ฐ€ ๋ถˆ์— ํƒ€๊ฒŒ ๋œ๋‹ค. ์šฐ์ฃผ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ์Œ. 4Ghz์˜ ๋ฒฝ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•ก์ฒด์งˆ์†Œ๋ฅผ ๋“ค์ด๋ถ€์–ด์•ผ ํ•จ. ๋‚จ์€ ๊ฒƒ์€ ๋ฉ€ํ‹ฐ์ฝ”์–ด ๋ฟ์ด์˜€๊ณ , ์‹ฑ๊ธ€๋กœ๋Š” ๋„์ €ํžˆ ์•ˆ๋˜๋‹ˆ๊นŒ ์ฝ”์–ด ๊ฐœ์ˆ˜๋กœ ์‹ธ์šฐ๊ณ  ์žˆ๋‹ค. ๋“€์–ผ์ฝ”์–ด CPU 2๊ฐœ, ์ฟผ๋“œ์ฝ”์–ด CPU 1๊ฐœ ์ฐจ์ด๋Š” ํฌ์ง€ ์•Š๋‹ค. ์—ฌ๋Ÿฌ ์ฝ”์–ด๊ฐ€ ๋Šฆ๊ฒŒ ๊ฐœ๋ฐœ๋œ ์ด์œ ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์‹œ ์งœ์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋””๋ฒ„๊น…๋„ ์–ด๋ ต๊ณ  ์ด๋ฏธ ์ž‘์„ฑํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  1. ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜์™€ ์ฝ”์–ด์˜ ๊ฐœ์ˆ˜๋Š” ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ์ƒ๊ด€์ด ์—†๋Š” ์ด์œ ?

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ๋ถ„ํ• ๋กœ ๋Œ์•„๊ฐ€๋ฉด์„œ ์‹คํ–‰๋˜๋“ฏ ์Šค๋ ˆ๋“œ๋„ ์‹œ๋ถ„ํ• ๋กœ ์šด์˜๋˜์–ด ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค. ์‰ฝ๊ฒŒ ์ฝ”์–ด์˜ ๊ฐœ์ˆ˜๋Š” CPU ๋‚ด ๋ฌผ๋ฆฌ์  ์—ฐ์‚ฐ๋ถ€์˜ ๊ฐœ์ˆ˜์ด๊ณ , ์Šค๋ ˆ๋“œ๋Š” ์ž‘์—…๋‹จ์œ„์ด๋ฏ€๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

  1. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋ณด๋‹ค ๋Š๋ ค์กŒ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

์‚ฌ์šฉํ•˜๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋งŽ์•„์งˆ์ˆ˜๋ก bottleneck์˜ ๊ฐ€๋Šฅ์„ฑ๊ณผ ์“ฐ๋ ˆ๋“œ๋งˆ๋‹ค ์ฐธ์กฐํ•˜๋Š” ์บ์‹œ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ ํ•˜๋‚˜๋งŒ์œผ๋กœ๋„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋กœ ์ง„ํ–‰์‹œ์ผœ๋„ race condition์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ„์ด ์‚ฌ์šฉ๋˜๊ณค ํ•œ๋‹ค. ์ ์žฌ์ ์†Œ์— ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.