2021-02-16(화)
이해를 돕기 위한 영상 - 얄팍한 코딩사전, Process vs Thread, Introduction to Threads
이해를 돕기 위한 자료 - 개발장, Heee's Development Blog, goodGid
쓰레드를 들어가기 전에 프로세스란?
프로그램(Program)이란?
- 프로그램이란 어떤 작업을 위해 실행할 수 있는 파일을 의미한다.
- 파일이 저장 장치에 저장되어 있지만
메모리에는 올라가 있지 않은
정적인 상태
즉, 독립적인 메모리 공간을 할당해주지 않았다는 뜻이다. 메모리 공간을 할당해야 실행이 가능하다. 정적인 상태란 아직 실행되지 않고 가만히 있다는 뜻이다.
코드 덩어리 상태의 파일
프로세스(Process)란?
- 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
- 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 운영체제로 부터 시스템 자원을 할당받는 작업의 단위
할당 받는 시스템 자원의 예
- CPU시간
- 운영되기 위해 필요한 주소 공간
- Code, Data, Stack, Heap 구조로 되어있는 독립된 메모리 영역
동적인 상태의 실행되고 있는 프로그램
프로세스의 특징
- 프로세스는 각각 독립된 메모리 영역을 할당 받는다.
- 기본적으로 프로세스는 최소 1개의 쓰레드를 가지고 있다.(메인 쓰레드)
- 프로세스에 여러개의 쓰레드로 구성이 가능하다.
- 각 프로세스는 별도의 주소 공간에서 실행되고, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC 등)을 사용해야 한다.
파이프, 파일, 소켓 등을 이용한 통신 방법을 이용한다.
쓰레드(Thread)란?
- 프로세스 내에서 실행되는 여러 흐름의 단위
- 프로세스가 할당받은 자원을 이용하는 실행 단위
- 프로세스의 특정한 수행 경로
프로세스 보다 더 작은 실행 단위
예를들어 프로세스가 코드라면 쓰레드는 코드 내의 함수라고 생각하면 이해가 쉽다.
쓰레드의 특징
- 쓰레드들은 프로세스 내에서 각각 Stack과 PC Register만 따로 할당 받고 Code,Data,Heap 영역은 공유한다.
쓰레드는 메모리를 공유한다?
프로세스 내의 주소 공간이나 자원들을 같은 프로세스 내에 쓰레디 끼리 공유하면서 실행되는데, 이때 어떤 쓰레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 쓰레드 모두가 강제로 종료된다.
스택(Stack)메모리를 왜 쓰레드마다 독립적으로 할당하는가?
스택 메모리는 함수 호출시 전달되는 인자, 되돌아갈 주소값 및 함수내에서 선언한 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 독립적으로 스택 메모리를 가진다는 것은 독립적인 함수의 호출이 가능하다는 것이고, 독립적인 실행 흐름을 가능하게 만든다.
독립적인 실행 흐름을 위한 최소 조건으로 독립된 스택을 할당하는 것이다.
프로그램 카운터 레지스터(PC Register)도 쓰레드마다 독립적이라구?
프로그램 카운터(PC)값은 명령어의 주소를 가지고있어 실행할 코드의 위치를 지정하여 명령어를 어디까지 수행했는지를 알수 있다. 쓰레드는 CPU를 할당받았다가 스케줄러에 의해 다시 선점당한다.
그렇기 때문에 명령어가 연속적으로 수행되지 못하고 어느 부분까지 수행했는지 기억할 필요가 있다.
그래서 PC 레지스터를 독립적으로 할당하는 것이다.
싱글 쓰레드와 멀티 쓰레드?
싱글 쓰레드(Single-Thread)
말 그대로 하나의 프로세스에 하나의 메인 쓰레드만 실행되는 것을 말한다.
싱글 쓰레드의 특징
- 문맥교환(Context Switching)으로 인해 발생되는 시간지연이 없어서 멀티 쓰레드보다 빠를수도 있다.
※ 프로세스간의 전환, 쓰레드간의 전환을 문맥교환(Context Switching)이라고 한다.
- 자원 공유에서 발생하는 동기화 문제를 신경쓰지 않아도 된다.
멀티 쓰레드(Multi-Thread)
하나의 프로세스에 여러개의 쓰레드가 실행되는 것을 말한다.
멀티 쓰레드의 특징
- 컨텍스트 스위칭할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
- 프로세스 내의 공유하는 메모리가 있어 통신의 부담이 적어서 응답시간이 빠르다.
- 쓰레드 하나가 프로세스 내 자원을 망가뜨린다면 모든 쓰레드가 종료될 수 있다.
- 자원을 공유하기 때문에 동기화 문제가 발생한다.
※ 여러 쓰레드가 함께 전역 변수를 사용할 경우 발생할 수 있는 충돌을 동기화 문제라고 한다.
쓰레드의 스케줄링은 운영체제가 자동으로 해주지 않기 때문에 프로그래머가 적절한 기법을 직접 구현해야 하므로 어렵고, 디버깅 과정도 까다롭다.
그렇다면 싱글 코어와 멀티 코어에서의 성능차이는 어떨까?
- 싱글 코어에서는 싱글 스레드로 두개의 작업을 하는 것이 멀티 스레드보다 빠르다.
- 멀티 코어에서는 멀티 스레드로 두개의 작업을 하는 것이 싱글 스레드보다 빠르다.