[Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (2)

2021. 12. 31. 21:49ยท๐Ÿ“ Book/โœ Game Server

1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ

 

6. ์ž„๊ณ„ ์˜์—ญ๊ณผ ๋ฎคํ…์Šค

๊ฒฝ์Ÿ ์ƒํƒœ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š”

๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋Š” X๋ฅผ ๊ฑด๋“œ๋ฆฌ๋ ค๊ณ  ํ•˜๋ฉด ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ X๋ฅผ ๋‹ค ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฎคํ…์Šค(mutex)์ด๋‹ค.

  • ๋ฎคํ…์Šค๋Š” ์ƒํ˜ธ ๋ฐฐ์ œ(mutual exclusion)์˜ ์ค„์ž„๋ง์ด๋‹ค.
  • ๋ฎคํ…์Šค๋Š” ๋‹ค๋ฅธ ๋ง๋กœ ์ž„๊ณ„ ์˜์—ญ(critical section)์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

 

C++์—์„œ ๋ฎคํ…์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

C++ std::mutex ์‚ฌ์šฉ ์˜ˆ

  • ์Šค๋ ˆ๋“œ 1์ด โ‘ก์—์„œ ๋ฎคํ…์Šค ์‚ฌ์šฉ๊ถŒ์„ ์–ป๋Š” ๋ฐ ์„ฑ๊ณตํ•˜๋ฉด โ‘ข์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ 2๊ฐ€ ์ด๋ฏธ ๋ฎคํ…์Šค ์‚ฌ์šฉ๊ถŒ์„ ์–ป์€ ์ƒํƒœ๋ฉด ์Šค๋ ˆ๋“œ 1์€ ๋” ์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ •์ง€๋œ๋‹ค.
  • ํ•œํŽธ ์Šค๋ ˆ๋“œ 2๋Š” โ‘ข์„ ์‹คํ–‰ ํ›„ โ‘ฃ๋ฅผ ํ†ต๊ณผํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ๊ทธ์ œ์•ผ ์Šค๋ ˆ๋“œ 1์€ ๋ฎคํ…์Šค ์‚ฌ์šฉ๊ถŒ์„ ์–ป์–ด ์‹คํ–‰ ์ง€์ ์ด โ‘ข์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, ๋งค๋ฒˆ lock()๊ณผ unlock()์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ž‘์„ฑ๋„ ์–ด๋ ต๋‹ค.

โ‘ข์—์„œ read()์„ ์‹คํ–‰ํ•˜๋‹ค ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋ฉด ๋‹ค์Œ โ‘ข~โ‘ฃ ๊ณผ์ •์€ ์‹คํ–‰๋˜์ง€ ๋ชปํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ unlock()์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.

 

C++ std::lock_guard ์‚ฌ์šฉ ์˜ˆ

C++์€ ๋ฎคํ…์Šค ์ž ๊ธˆ ์ƒํƒœ๋ฅผ ๋กœ์ปฌ ๋ณ€์ˆ˜๋กœ ์ €์žฅํ•˜๊ณ  ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์ž๋™์œผ๋กœ ์ž ๊ธˆ ํ•ด์ œ๊ฐ€ ๋˜๊ฒŒ ํ•˜๋Š” lock_guard ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด lock ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์ž๋™์œผ๋กœ unlock()์ด ์‹คํ–‰๋œ๋‹ค.

 

C#์—์„œ๋Š” ๋ณดํ˜ธํ•˜๋ ค๋Š” ๋ณ€์ˆ˜ ์ž์ฒด๋ฅผ ๋ฎคํ…์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์—ฌ ์ž ๊ทธ๊ณ  ๋‹ค ์“ฐ๊ณ  ๋‚˜๋ฉด ์ž ๊ธˆ์„ ํ•ด์ œํ•œ๋‹ค.

C# lock ์‚ฌ์šฉ ์˜ˆ
lock ๊ตฌ๋ฌธ ๋ธ”๋ก์„ ์ด์šฉํ•˜๋ฉด ๋ณ„๋„์˜ unlock()์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๊ตฌ๋ฌธ ๋ธ”๋ก์„ ๋‚˜๊ฐˆ ๋•Œ ์ž๋™์œผ๋กœ ์ž ๊ธˆ ํ•ด์ œ๊ฐ€ ๋œ๋‹ค.

 

C++ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ตฌํ˜„ ์ฝ”๋“œ ์˜ˆ์ œ (์†Œ์ˆ˜ ๊ตฌํ•˜๊ธฐ)

๋”๋ณด๊ธฐ
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <chrono>
#include <thread>
#include <memory>
#include <mutex>

using namespace std;

const int MaxCount = 15000000;
const int ThreadCount = 4;

bool IsPrimeNumber(int number)
{
    if (number == 1)
        return false;
    if (number == 2 || number == 3)
        return true;
    for (int i = 2; i < number - 1; i++)
    {
        if ((number % i) == 0)
            return false;
    }
    return true;
}

void PrintNumbers(const vector<int>& primes)
{
    for (int v : primes)
    {
        cout << v << endl;
    }
}

int main()
{
    // ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์—ฌ๊ธฐ์„œ ๊ฐ’์„ ๊บผ๋‚ด์˜จ๋‹ค.
    int num = 1;
    recursive_mutex num_mutex;

    vector<int> primes;
    recursive_mutex primes_mutex;

    auto t0 = chrono::system_clock::now();

    // ์ž‘๋™ํ•  ์›Œ์ปค ์Šค๋ ˆ๋“œ
    vector<shared_ptr<thread> > threads;

    for (int i = 0; i < ThreadCount; i++)
    {
        shared_ptr<thread> thread1(new thread([&]() {
            // ๊ฐ ์Šค๋ ˆ๋“œ์˜ ๋ฉ”์ธ ํ•จ์ˆ˜.
            // ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฃจํ”„๋ฅผ ๋ˆ๋‹ค.
            while (true)
            {
                int n;
                {
                    lock_guard<recursive_mutex> num_lock(num_mutex);
                    n = num;
                    num++;
                }
                if (n >= MaxCount)
                    break;

                if (IsPrimeNumber(n))
                {
                    lock_guard<recursive_mutex> primes_lock(primes_mutex);
                    primes.push_back(n);
                }
            }
        }));
        // ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ์ผ๋‹จ ๊ฐ–๊ณ  ์žˆ๋Š”๋‹ค.
        threads.push_back(thread1);
    }

    // ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ผ์„ ๋งˆ์น  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.
    for (auto thread : threads)
    {
        thread->join();
    }
    // ๋

    auto t1 = chrono::system_clock::now();

    auto duration = chrono::duration_cast<chrono::milliseconds>(t1 - t0).count();
    cout << "Took " << duration << " milliseconds." << endl;

    //PrintNumbers(primes);
    return 0;
}

 

์œ„ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๊ตฌํ˜„ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ ์‹คํ–‰ ์‹œ๊ฐ„์ด 3900๋ฐ€๋ฆฌ ์ดˆ ์ •๋„์ธ๋ฐ, ์Šค๋ ˆ๋“œ๊ฐ€ 4๊ฐœ์ผ ๋•Œ๋Š” 1300๋ฐ€๋ฆฌ ์ดˆ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด๋ก ์ ์œผ๋ก  4๋ฐฐ๊ฐ€ ๋นจ๋ผ์ ธ์•ผ ํ•  ๊ฒƒ ๊ฐ™์€๋ฐ ์™œ 3๋ฐฐ ๋ฐ–์— ๋นจ๋ผ์ง€์ง€ ์•Š์•˜์„๊นŒ?

  • lock์— ๊ฑธ๋ ค ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.
  • CPU๋Š” ๋ฉ”๋ชจ๋ฆฌ ์•ก์„ธ์Šค ์‹œ๊ฐ„์ด ๊ธธ๋‹ค. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค ํ•˜๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ๋™์•ˆ์—๋Š” CPU ๊ฐœ์ˆ˜๋ณด๋‹ค ๋” ์ ์€ ์ˆ˜์˜ CPU๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฎคํ…์Šค๋ฅผ ์ตœ๋Œ€ํ•œ ๋‚˜๋ˆ„๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

  • ๋ฎคํ…์Šค๋ฅผ ์•ก์„ธ์Šค ํ•˜๋Š” ๊ณผ์ •์ด ๋ฌด๊ฒ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
  • ๊ต์ฐฉ ์ƒํƒœ๊ฐ€ ์‰ฝ๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.

ํŠนํžˆ ๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ์‹ฌ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฎคํ…์Šค๋Š” ์–ด๋А ์ •๋„ ๊ตต์งํ•˜๊ฒŒ ์ž ๊ธˆ ๋ฒ”์œ„๋ฅผ ์žก์•„์•ผ ํ•œ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ ๋ฎคํ…์Šค๊ฐ€ ๋ณดํ˜ธํ•˜๋Š” ์˜์—ญ์ด ๋„ˆ๋ฌด ๋„“์œผ๋ฉด ์Šค๋ ˆ๋“œ๊ฐ€ ์—ฌ๋Ÿฟ์ด๋ผ ํ•˜๋”๋ผ๋„ ํ•˜๋‚˜์ผ ๋•Œ์™€ ๋ณ„๋ฐ˜ ์ฐจ์ด๊ฐ€ ์—†์–ด์ง„๋‹ค.

๋”ฐ๋ผ์„œ ๋™์‹œ์— ์—ฐ์‚ฐํ•˜๋ฉด ์œ ๋ฆฌํ•œ ๋ถ€๋ถ„์„ ์ž ๊ธˆ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„๊ณ  ๋ณ‘๋ ฌ๋กœ ํ•˜์ง€ ์•Š์•„๋„ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ๋ถ€๋ถ„๋“ค์€ ์ž ๊ธˆ ๋‹จ์œ„๋ฅผ ๋‚˜๋ˆ„์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

7. ๊ต์ฐฉ ์ƒํƒœ

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ต์ฐฉ ์ƒํƒœ๋ž€ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ์„œ๋กœ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋‘ ์Šค๋ ˆ๋“œ๋Š” ์˜์›ํžˆ ๋ฉˆ์ถฐ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

๊ต์ฐฉ ์ƒํƒœ

 

๋ฎคํ…์Šค๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ž ๊ธˆ ์ˆœ์„œ์˜ ๊ทœ์น™์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

8. ์ž ๊ธˆ ์ˆœ์„œ์˜ ๊ทœ์น™

๊ต์ฐฉ ์ƒํƒœ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋ ค๋ฉด

  • ๊ฐ ๋ฎคํ…์Šค์˜ ์ž ๊ธˆ ์ˆœ์„œ๋ฅผ ๋จผ์ € ๊ทธ๋ž˜ํ”„๋กœ ๊ทธ๋ฆฐ๋‹ค.
  • ์ž ๊ธˆ์„ ํ•  ๋•Œ๋Š” ์ž ๊ธˆ ์ˆœ์„œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด์„œ ๊ฑฐ๊พธ๋กœ ์ž ๊ทผ ๊ฒƒ์ด ์—†๋Š”์ง€ ์ฒดํฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์ž ๊ธˆ์„ ํ•ด์ œํ•˜๋Š” ์ˆœ์„œ๋Š” ๊ต์ฐฉ ์ƒํƒœ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฎคํ…์Šค A, B, C๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์ด๋“ค์˜ ์ž ๊ธˆ ์ˆœ์„œ๋Š” A->B->C์ด๋‹ค.

 

์•„๋ž˜ ์ƒํ™ฉ์€ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์ž ๊ฐ”๊ธฐ ๋•Œ๋ฌธ์— ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค.

 

A > B > C
A > B
B > C
A > C

 

๋ฎคํ…์Šค ํ•˜๋‚˜๋งŒ ์ž ๊ทธ๋Š” ๊ฒƒ๋„ ์•ˆ์ „ํ•˜๋‹ค.

 

B, C

 

๋ฐ˜๋Œ€ ์ˆœ์„œ๋กœ ์ž ๊ทธ๋ฉด ๊ทธ์ œ์•ผ ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ์ผ์œผํ‚จ๋‹ค.

 

B > A

 

์ด๋•Œ ๋ฎคํ…์Šค๋Š” ์žฌ๊ท€์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฒƒ๊ณผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.

 

์žฌ๊ท€ ๋ฎคํ…์Šค

 

์žฌ๊ท€ ๋ฎคํ…์Šค๋Š” ํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฎคํ…์Šค๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์ž ๊ทธ๋Š” ๊ฒƒ์„ ํ—ˆ๋ฝํ•œ๋‹ค.

์—ฌ๋Ÿฌ ๋ฒˆ ์ž ๊ธ€์ˆ˜๋ก ๊ทธ๋งŒํผ ์ž ๊ธˆ ํ•ด์ œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

  • ์ฒซ ์ž ๊ธˆ์—์„œ ์ˆœ์„œ๋ฅผ ์–ด๊ธด๋‹ค๋ฉด ๊ต์ฐฉ ์ƒํƒœ๋ฅผ ์ผ์œผํ‚จ๋‹ค.
  • ์ด๋ฏธ ์ž ๊ทผ ๊ฒƒ์— ๋Œ€ํ•œ ์žฌ๊ท€ ์ž ๊ธˆ์€ ์ž ๊ธˆ ์ˆœ์„œ ๊ทธ๋ž˜ํ”„์™€ ์ƒ๊ด€์—†๋‹ค.

 

9. ๋ณ‘๋ ฌ์„ฑ๊ณผ ์‹œ๋ฆฌ์–ผ ๋ณ‘๋ชฉ

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

 

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

 

CPU 1๊ฐœ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋…ธ๋Š” CPU๋“ค

 

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

 

์•”๋‹ฌ์˜ ์ €์ฃผ๋ฅผ ์ค„์ด๋ ค๋ฉด ์‹œ๋ฆฌ์–ผ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ตฌ๊ฐ„์„ ์ตœ์†Œ๋กœ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.

 

Concurrency Visualizer

 

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

  • ๋””๋ฒ„๊ฑฐ ์—†์ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ํ›„ Analyze > Concurrency Visualizer > Attach to Process ๋กœ ๋ถ„์„์„ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๊ณ  ๋ช‡ ์ดˆ ํ›„ ์ค‘์ง€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ์ƒˆ๋กœ์šด ์ฐฝ์ด ๋œจ๋ฉด โ‘ ์„ ๋ˆ„๋ฅธ๋‹ค.
  • โ‘ก๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด์Šจ ์ผ์„ ํ–ˆ๋Š”์ง€ ๊ทธ๋ž˜ํ”„๋กœ ๋ณด์—ฌ์ค€๋‹ค.
  • โ‘ข์€ ํ•ด๋‹น ๊ตฌ๊ฐ„ ๋™์•ˆ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ํ•œ ์ผ์˜ ํ†ต๊ณ„๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
    • 94%๊ฐ€ Execution์ด๋ž€ ์˜๋ฏธ๋Š” ์ผํ•œ ์‹œ๊ฐ„์˜ 94%๊ฐ€ CPU ์—ฐ์‚ฐ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ๋งค์šฐ ์–‘ํ˜ธํ•œ ์ƒํƒœ์ด๋‹ค.
    • Synchronization์ด๋ž€ ๋ฎคํ…์Šค๋ฅผ ์ด๋ฏธ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ์ž ๊ทผ ์ƒํƒœ๋ผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ์˜ ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค.
  • โ‘ฃ๋Š” ์Šค๋ ˆ๋“œ 4๊ฐœ๊ฐ€ ๊ฐ๊ฐ ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ค€๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ๋ณ‘๋ ฌ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•˜๋Š” ํ”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์•Œ์•„๋ณด์ž.

 

๋จผ์ € ๋””๋ฐ”์ด์Šค ํƒ€์ž„๊ณผ CPU ํƒ€์ž„์„ ์•Œ์•„์•ผ ํ•˜๋Š”๋ฐ, ๋””๋ฐ”์ด์Šค ํƒ€์ž„์€ ๊ธฐ๊ธฐ์— ์žˆ๋Š” ์žฅ์น˜์— ๋ญ”๊ฐ€๋ฅผ ์š”์ฒญํ•ด์„œ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋•Œ ์Šค๋ ˆ๋“œ๋Š” ์ž ์ž๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ๋””๋ฐ”์ด์Šค ํƒ€์ž„ ๋™์•ˆ์—๋Š” CPU๊ฐ€ ์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๊ณ  ์ž๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ๋‚ญ๋น„๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ์œ„ํ•œ CPU ์—ฐ์‚ฐ์„ ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๋‹ค.

 

๋””๋ฐ”์ด์Šค ํƒ€์ž„ ์˜ˆ

 

๋””๋ฐ”์ด์Šค ํƒ€์ž„ ๋™์•ˆ(ReadFromDisk)์—๋Š” ๋ฎคํ…์Šค ์ž ๊ธˆ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ, ๋””๋ฐ”์ด์Šค ํƒ€์ž„ ๋™์•ˆ X๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ ๋ฎคํ…์Šค ์ž ๊ธˆ ํ›„ A์˜ ์ƒํƒœ ์ฒดํฌ๋ฅผ ๋‹ค์‹œ ํ•ด์•ผ ํ•œ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Book/โœ Game Server' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 2์žฅ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (2)
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 2์žฅ ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (1)
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (3)
  • [Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (1)
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Book] ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ต๊ณผ์„œ - 1์žฅ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ (2)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”