이 글의 내용은 프로세스와 쓰레드에 대해
갓썬더제너럴임팩트최고코드의신이세상에서제일설명쉽게하는백엔드11년차개발자미친대존잘우주대제일똑똑한
쉬운코드님의 영상을 보고 적은 벨로그입니다.
프로세스는 컴퓨터에서 실행 중인 프로그램이라고 말 할 수 있는데요.
각각의 프로세스는 독립된 메모리 공간을 할당받고, 명령어들과 데이터를 가져요.
프로세스가 독립된 메모리 공간을 할당받는다는 것은 가상메모리에 대해서 먼저 공부하고 오시면 이해가 가실거예요.
가장 초기의 시스템은 단일 프로세스 시스템이었어요.
이건 한 번에 하나의 프로그램만 실행될 수 있었다는 뜻입니다.
또 다른 프로그램을 실행하려면 먼저 프로그램을 종료한 후 다른 프로그램을 실행해야 했어요.
이렇게 단일 프로세스 시스템을 사용할 경우는 CPU 사용률이 좋지 않았어요.
P1 이라는 CPU가 프로세스를 처리하고 있을 때, I/O 입출력이 들어오면 예외가 발생해서 I/O입출력을 처리하게 되는데 그 동안은 CPU가 프로세스 관련 연산을 하지 않기 때문에 쉬고 있어요.
이런 문제를 해결하기 위해서 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자! 라는 생각이 등장했어요.
- I/O 작업이 발생하면 CPU가 쉬니까 그동안 다른 프로세스를 CPU에서 실행하자!
CPU가 작업을 시간별로 나열했을 때, P1이 실행되다가 P1이 I/O 입출력 처리를 해야 하는 순간이 오면 그 때, CPU에게 P2가 해야할 일을 할당해 주는거예요.
이런 여러개의 프로그램을 동시에 실행시키는 로직을 멀티 프로그래밍이라고 합니다.
멀티 프로그래밍은 CPU의 사용률을 극대화시키려는 목적이 있어요.
이런 멀티 프로그래밍에도 단점이 있었는데요. 만약 P1 프로세스에 입출력이 안온다면, 다른 프로세스는 계속 대기합니다.
이런 문제를 해결하기 위해서 프로세스는 한 번 CPU를 사용할 때,
아주 짧은 시간 ( = quantum ) 만 CPU 에서 실행되도록 하자! 고 약속합니다.
프로세스 P1,P2는 한 번 CPU를 점유할 때, 최대 quantum 시간 단위 만큼만 사용할 수 있게 스케쥴링 해요.
이런 방식을 멀티 태스킹이라고 합니다.
멀티 프로그래밍과 비슷하지만 멀티 프로그래밍은 프로세스가 CPU를 사용하지 않을 때 넘겨주는 거라면
멀티 태스킹은 CPU 사용시간을 아주 잘게 쪼개서 CPU를 넘겨줘요.
이런 멀티태스킹은 프로세스의 응답시간을 최소화시키는데에 목적이 있어요.
프로세스의 응답시간을 최소화시킨다는건, 마치 정말로 여러 프로그램이 동시에 실행되는 것처럼 느껴지기 위해서예요.
하나의 프로세스가 동시에 여러 작업을 수행하지는 못한다 ( 동시에 실행하는 것 처럼 보일 뿐 )
이유:
이 해결책이 바로 쓰레드 입니다.
프로세스는 한 개 이상의 쓰레드를 가질 수 있습니다.
당연합니다. 쓰레드가 나온 등장배경이 한 프로세스 안에서 여러개의 프로그램을 실행시키고 싶기 때문이잖아요?
그래서 프로세스는 한 개 이상의 쓰레드 ( 프로그램을 실행할 수 있는 ) 을 가져야 합니다.
또한, 쓰레드는 이제 CPU에서 실행되는 단위가 되었어요.
옛날에는 프로세스가 CPU에서 실행되는 단위였다면 이제는 쓰레드가 CPU 에서 실행되는 단위가 된거예요.
그리고 쓰레드는 프로세스 내부에 있기 때문에, 같은 프로세스의 쓰레드들끼리의 컨텍스트 스위칭은 가볍습니다. 같은 가상메모리를 공유하니까요.
프로세스가 싱글스레드일 때와, 멀티쓰레드 일 때의 메모리 구조를 비교해볼게요.
출처 : 유튜브 쉬운코드 화면캡쳐
지금까지 CSAPP책을 보면서 봤던 메모리는 하나의 스택을 가졌었는데
이제는 쓰레드 별로 스택을 가지고 있습니다.
하지만 힙 영역은 공유해요.
또한 .text 영역의 코드 세그먼트에 PC for thread 1이라고 되어있는데
PC는 ProgramCounter 로 다음에 어떤 명령어가 실행되어야 할지 나타내고 있잖아요?
그게 쓰레드별로 각각 가지고 있는거예요!
만약 CPU에 core가 하나만 있고 P1 프로세스에 thread1과 thread2가 실행되었어요.
그럼 이제 실행단위가 쓰레드로 바뀌었고 CPU의 core가 하나이기 때문에 마치 멀티태스킹처럼 동작합니다. CPU CORE의 시간을 잘게 쪼개서 쓰레드가 나눠 작업해요.
만약 CPU에 CORE가 두개라면 어떻게될까요?
CORE 가 두 개이기 때문에, 정말로 두 쓰레드 작업이 동시에 실행됩니다.
그리고 이건 프로세스하나에 쓰레드가 두개인거지만
만약 정말 여러 프로세스가 실행되고 그 안에있는 쓰레드들을 실행한다면
그거는 "멀티 프로세싱"이라고 한답니다.
마무리
핀토스 딱 기다려..내가 너 부순다.
갓썬더제너럴임팩트최고코드의신이세상에서제일설명쉽게하는백엔드11년차개발자미친대존잘우주대제일똑똑한 진성님 감사합니다