※ 이 글을 작성하기 전에 본인은 이 분야의 전문성을 가진 전문가가 아님을 미리 밝힙니다. ※


#1. 프로세스(Process) 란?

프로세서(CPU)에 의해 처리되는 사용자 프로그램 혹은 시스템 프로그램을 의미한다.

프로그램은 실행되기 위해서는 CPU로부터 필요한 자원을 할당 받아야 하는데, 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 실행중인 프로그램을 프로세스라고 한다.

즉 ! 명령에 의해 자원을 할당받아 실행되는 작업의 단위를 프로세스라고 한다.

여러 개의 프로세스가 동시에 실행되어질 때, 각각의 프로세스들은 독립된 메모리 영역을 할당받게 된다. 또한, 별도의 주소공간에서 각각의 프로세스가 실행되므로 서로 다른 프로세스의 변수나 자료구조에 접근할 수가 없다.


#1 - 2. PCB(Process Control Block : 프로세스 제어 블록)

PCB는 특정 프로세스에 대한 중요한 정보를 저장하고 있는 운영체제의 자료구조이다.

운영체제는 프로세스들을 관리하기 위해서 프로세스의 생성과 동시에 고유한 PCB를 생성하게 된다.

PCB가 필요한 이유는 다음과 같다.

CPU를 할당받어 작업을 진행하다가도 작업이 덜 끝난 채로 프로세스가 전환되는 경우가 발생하게 된다. 이 때 CPU를 반환해 주어야 하는데, 반환하기 전에 지금까지 했던 작업을 저장하고 PCB에 저장하게 된다. 그리고 이 다음 턴에 다시 작업을 이어서 진행하게 될 때, PCB에 저장되어 있던 내용들을 불러와 이전에 종료됐던 시점부터 다시 작업을 진행할 수 있게 하기 위해서 PCB가 필요하다.

PCB에 저장되는 정보들은 다음과 같다.

1. 프로세스 식별자(Process ID : PID) : 프로세스의 고유의 식별번호이다.

2. 프로세스 상태 : Ready , Running , Waiting , Terminated 등의 프로세스의 상태를 저장하기 위한 정보이다.

3. 프로그램 카운터(Program Counter) : 프로세스가 다음에 실행할 명령어의 주소이다.

4. CPU 스케쥴링 정보 : 프로세스의 우선순위 및 스케쥴링 큐에 대한 정보이다.

이 외에도, CPU 레지스터 , 메모리 관리 정보 , 입출력 상태 정보 등의 정보들이 저장되어 진다.


#2. 쓰레드(Thread)란 ?

쓰레드는 프로세스 내에서 실행되는 여러 실행 흐름의 단위로써 프로세스의 특정한 수행 경로를 의미한다.

쓰레드는 프로세스가 할당받은 자원을 이용해서 실행되어진다. 여러 개의 쓰레드가 동시에 동작할 경우, 각각의 쓰레드들은

메모리 영역 중, Stack영역만 따로 할당받게 되고 나머지 메모리 영역인 Code , Date , Heap 영역은 공유하게 된다.


#2 - 1. 쓰레드의 Stack 영역

#2에서 쓰레드는 프로세스가 할당 받은 메모리 영역을 그대로 사용하지만, Stack영역만 고유한 영역으로 따로 할당받는다고 했었다. 지금부터는 이 이유에 대해서 알아보자.

먼저, 쓰레드의 정의와 가지는 의미에 대해서부터 다시한번 이야기를 해보자.

쓰레드는 프로세스 내에서 실행되는 여러 실행 흐름의 단위이다. 즉, 여러가지 역할을 수행하기 위한 특정한 수행 경로가 쓰레드가 되는 것이다. 즉 ! 여러가지 역할을 수행하기 위해서는 독립적인 실행 흐름이 가능해야 한다는 것을 의미하고, 이를 만족해야 쓰레드가 갖는 정의를 부합시킬 수 있게 된다.

두 번째로는 Stack영역에 대해서 이야기를 해보자.

메모리 영역에 관한 부분은 이 다음 글에서 구체적으로 다루도록 하겠지만, 여기서 Stack영역에 대해서만 간단하게 설명하자면, Stack영역에는 지역변수 , 함수의 매개변수 , 함수 실행 시 되돌아갈 주소값(Return 값) 등이 저장되는 메모리 영역이다.

즉 ! 독립적인 함수가 호출되어지고 그 내에서 사용되는 지역변수 및 매개변수들이 저장되는 영역이 Stack영역이다.

그럼 이 2개의 이야기를 종합해보면, 쓰레드는 여러 역할을 수행하기 위해서는 독립적인 실행 흐름이 가능해야 하고, 독립적인 실행 흐름이 가능하기 위해서는 독립적인 함수 호출이 가능해야 하기 때문에 다른 메모리 영역은 모두 공유하더라도 Stack영역만큼은 각각의 쓰레드가 독립적으로 할당받게 되어 진다는 것이다.

즉 ! 쓰레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소조건으로 독립된 Stack영역을 할당하게 되는 것이다.











+ Recent posts