상세 컨텐츠

본문 제목

1 - 2) 스레드 (thread)?

네트워크

by 부레두 2023. 10. 12. 00:57

본문

스레드란?

2023.10.11 - [이론/네트워크] - 1 - 1) 멀티스레딩 개요

어떤 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위


컨텍스트 스위치 (Context switch)

여러 프로세스와 여러 스레드를 동시에 실행하는 운영체제는 여러 프로세스와 프로세스 안에 있는 스레드들을 일정 시간마다 번갈아 가면서 실행
기본적으로 기계어 명령 단위로 발생

스레드를 실행하다가 다른 스레드를 마다 실행하는 과정
CPU 개수와 스레드 개수가 같거나 스레드 개수가더 적으면 컨텍스트 스위치가 발생하지 않음

 

●  과정

  1. 실행 중이던 스레드의 상태(호출 스택 등)을 저장
  2. 과거에 실행하다 그만둔 다른 스레드를 선택
  3. 고른 스레드의 상태를 복원, 실행하던 지점으로 강제 이동

※ 과정의 연산량이 많아 동시에 실행하는 스레드가 여럿이라 해도 컨텍스트 스위치가 많으면 비효율적

비고 )

  • 타임 슬라이스 : 컨텍스트 스위치가 발생할 때 '사람 입장에서 쾌적할 수 있는' 긴 시간 단위

 

●  주의사항

  • 컨텍스트 스위칭 발생 타이밍
    • 프로그램이 어디까지 실행된 후 컨텍스트 스위치가 일어나는지 알 수없어 구문을 실행하다 스위치할 가능성이 있음
  • 데이터 레이스 (data race) / 경쟁 상태
    • 스레드 2개가 값 하나에 동시에 접근하는 경우
    • 두 스레드가 접근하는 경우 어떤 상태가 될지 예상 불가능

●  문제 해결방안

예상하지 못한 결과 발생을 없애기 위해 다른 스레드가 절대 건드리지 못하게 하는 "원자성", 원자성을 유지해야 변수의 상태가 항상 같은 상태임을 뜻하는 "일관성" 을 유지해야함
-> 해결 방법의 통칭 : 동기화


뮤텍스(Mutex)

상호 배제(mutual exclusion)의 줄인 말

  • 과정
    1. X, Y를 보호하는 뮤텍스 MX를 생성
    2. 스레드가 X, Y를 수정하기 전에 MX에 사용권을 요청
    3. 스레드가 X, Y에 엑세스
    4. 엑세스가 끝나면 MX에 사용권을 반환

 

 

멀티스레드로 만든 프로그램 예시

 > 소수를 구하는 프로그램
#include <vector>
#include <iostream>
#include <thread>
#include <memory>
#include <mutex>

using namespace std;

const int MaxCount = 150000;
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 Main()
{
    int num = 1;
    recursive_mutex num_mutex;

    vector<int> primes;
    recursive_mutex primes_mutex;

    vector<shared_ptr<thread>> threads;

    for(int i = 0; i < ThreadCount; i++)
    {
        shared_ptr<thread> thread(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(thread);
}

for(auto thread : threads)
{
    thread->join();
}

메모리 바운드 시간

CPU의 수 만큼 스레드가 늘어나도 프로그램의 실행 시간은 순수하게 코어의 수가 늘어난 만큼 빨라지지 않음.
멀티스레드로 작동하더라도 메모리에 접근하는 메모리 바운드 시간 동안은 CPU 개수보다 더 작은 CPU가 처리.

 

뮤텍스를 잘게나누면 발생하는 문제

  • 뮤텍스 액세스 과정이 무겁기 때문에 프로그램의 성능이 저하 
  • 프로그램이 복잡해져 작성 중 교착 상태 발생 가능성 증가 

'네트워크' 카테고리의 다른 글

1 - 3) UDP/TCP 네트워킹  (0) 2024.05.17
1 - 1) 멀티스레딩 개요  (1) 2023.10.11

관련글 더보기