프로세스 Process
프로세스를 부르는 말은 여러가지가 있다. 메모리에 올라간 프로그램, 실행 중인 프로그램, PCB가 있는 프로그램, 프로그램 카운터가 있는 프로그램. 여기서 말하는 메모리, 프로그램과 차이점, PCB, 프로그램 카운터에 대해 자세히 알아볼 수 있다.
실행 중인 프로그램? 프로그램 vs 프로세스
프로그램은 실행할 수 있는 정적인 상태를 의미한다. 우리가 '어떤 프로그램을 사용하고 있다'고 말하는 건 프로그램을 실행하는 것을 의미한다. 프로그램이 실행이 되면 그때는 동적인 상태의 프로세스가 된다.
프로그램을 클릭해서 실행하면 그 프로그램은 메모리에 올라와 사용할 수 있는 상태가 되는데 그걸 프로세스라고 한다.
메모리에 올라간 프로그램
프로그램의 실행 상태를 프로세스라고 하고, 프로세스는 메모리에 올라간 프로그램이라고도 부른다." 프로그램이 실행되면 메모리에 올라가서, 사용할 수 있는 프로세스가 되는 구나!" 같이 붙여서 이해할 수 있다.
여기서 더 나아간다면, 위 문장에서 실행과 메모리의 위치를 바꿔보자. "실행되기 위해서 반드시 메모리에 올라가야 한다"
메모리, 주기억장치에 로드되지 않으면 프로그램은 실행할 수 없다. 실행이 돼서 메모리가 올라간다고 이해하기 보다는 실행되기 전에 반드시 메모리에 올려서 실행상태를 만든다고 정확히 이해해야 한다.
PCB: Prcess Control Block
프로세스 제어 블록으로 Process Descriptor라고도 한다. 운영체제가 프로세스에 관한 정보를 유지하기 위해 이용하는 테이블 형태의 자료구조이다. 프로세스가 생성이 될 때 프로세스 1개에 PCB 1개가 할당 된다. 프로세스가 수행 완료 되면 삭제 된다. 프로세스의 생성과 완료에 따라 함께 생성되고 사라진다.
PCB는 프로세스의 정보를 담고 있어, PCB를 통해 해당 프로세스를 알아볼 수 있다.
PCB 구성 형태
- 프로세스 현재 상태
- 프로세스의 실행과 함께 만들어지고, 프로세스가 사라지면 같이 사라진다.
프로세스가 준비상태, 실행상태, 대기상태 중 어느 상태인지 PCB는 알아야 한다.
- 프로세스의 실행과 함께 만들어지고, 프로세스가 사라지면 같이 사라진다.
- 프로세스 고유 ID
- OS가 임의로 지정한 프로세스의 ID를 가지고 있다.
- 프로세스 우선 순위
- 실시간 처리를 요구하는 경우, 더 빨리 처리하기 위해 그 우선순위를 가지고 있다
- 적재된 기억 장치 주소를 가리키는 포인터
- 프로세스는 실행을 위해 메모리에 올라간다. 여기서 말하는 메모리는 주기억장치를 말하며, PCB는 주기억장치에서 어느 위치에 프로세스가 위치해 있는지 그 주소를 가지고 있다.
- 할당된 자원을 가리키는 포인터
- 프로세스는 실행을 위해 자원을 할당받는다. PCB는 프로세스가 사용할 수 있는 할당된 자원 주소를 가지고 있다.
- 각종 레지스터 상태 정보를 위한 공간
- 레지스터는 CPU 내부 자체적 메모리를 의미한다. 메인 메모리보다 속도가 빠르지만, 많이 생성될 수 없다.
- 프로그램 카운터
프로그램 카운터 Program Counter, PC
프로세스는 프로그램 카운터를 가지고 있는 프로그램이라고 부른다. 프로그램 카운터는 PCB가 가지고 있는 정보이이며, PCB는 프로세스를 제어하기 위한 블록이다. PCB에 포함되어 있으니 프로세스 제어에 필요한 내용이 담겨있을 것이다.
프로그램 카운터는 실행 상태에서 준비 상태로 돌아갔을 때, 다시 실행을 하기 위한 정보가 저장되어 있다.
프로세스에서 다음에 실행해야 할 명령어의 주소가 들어있는 것이다.
프로세스 상태 전환
프로세스 안의 트래픽 제어기 Traffic Controller가 프로세스 상태를 전환한다.
프로세스의 상태는 PCB가 가지고 있는 정보이기도 하다.
- 준비(완료) 상태 Ready State
- CPU 사용이 가능한 상태로 CPU를 할당받을 수 있는 상태
CPU는 프로세스를 기다리고 있다.
- CPU 사용이 가능한 상태로 CPU를 할당받을 수 있는 상태
- 실행 상태 Running State
- 프로세스가 CPU를 할당 받아 사용하고 있는 상태
- 대기 상태 Block State
- 프로세스가 CPU를 양도하고, 입출력을 처리하고 있는 상태
프로그램 카운터는 이와 같은 프로세스 상태에서 [실행] → [준비] 가 되었을 때, 그 다음 [실행]을 위한 정보를 가지고 있다.
일반적으로 PC(프로그램 카운터)는 CPU내부의 레지스터로 구현된다. 프로그램이 실행될 때마다 다음에 실행할 명령어의 주소로 업데이트 된다.
프로세스 구성 요소
프로세스가 무엇인지 알았으니 그 프로세스를 이루는 구성 요소에 대해 알아보자.
프로세스 실행을 위한 코드Code와 각종 데이터를 위한 영역Data, Stack, Heap이 있다.
코드 영역 Code
CPU가 해석할 수 있는 바이너리 코드, 실행 명령어 코드를 의미한다.
main메소드와 같이 최초 실행이 되는 곳이 이와 같은 코드 영역이다.
데이터 영역 Data
프로그램 전역 변수, 정적 변수가 할당되는 공간이다. 프로그램이 실행 중에 저장할 수 있는 데이터들이다.
메모리의 스택 영역 Stack
지역 변수와 매개 변수를 위한 공간으로 전체적으로 사용하는 변수가 아닌 지역적으로 사용하는 변수가 이 스택 영역에 저장된다.
메모리의 힙 영역 Heap
메모리 동적 할당을 위한 공간으로 자바에서 new를 통해 인스턴스화 시킨 객체는 이 힙 영역에 저장된다.
스레드 Thread
프로세스 내에서 실행되는 작은 단위로 할당된 자원을 이용해 일을 하는 일꾼 역할을 한다. 프로세스 안에서 독립적으로 실행되며, 하나의 프로세스 내에서 코드, 데이터, 자원을 공유하여 여러 스레드가 실행 될 수도 있다.

프로세스와 스레드 비교
프로세스가 포함하는 정보
주소 공간, 전역 변수, 개방된 파일, 자식 프로세스, 시그널, 세마 포어, 계정 정보 등
스레드가 포함하는 정보
스레드 식별자, 프로그램 카운터, 스택 포인터, 레지스터, 자식 스레드, 스레드 상태 정보
스레드의 특징
- 서로 독립적으로 수행된다.
- 프로세스 내에 여러 개의 스레드가 존재한다.
- 프로세스 안에서 메모리를 스레드가 공유해서 사용할 수 있다. → Data, Heap
- 스레드는 프로세스의 일부분으로 프로세스 자원을 공유하지만, 자신만의 처리 시간 · 스택 · 레지스터가 할당된다.
스레드가 프로세스 안에서 서로 공유할 수 있는 건 Data와 Heap영역에 있는 데이터.
Stack영역에 있는 것은 지역적으로 사용하는 변수로 자기 자신만 독립적으로 사용한다.
- 스레드끼리 전환 속도가 빠르다.
- 프로세스-프로세스는 서로 다른 프로그램으로 전환 속도가 느리지만, 스레드-스레드는 같은 프로세스 안에서 움직이는 것으로 그 사이 전환 속도가 빠르다.
- 실행/종료 순서 예측이 불가능하다.
- 서로 독립적이지만 다른 스레드에 영향을 미친다
- 두 개 이상의 스레드에서 공유 변수를 사용할 때 문제가 발생할 위험이 있다.
다중 스레드 Multi Threads
위에서 알아본 스레드의 특징에서 특이한 점이 있다. 여러 개의 스레드가 존재한다. 서로 메모리를 공유한다. 스레드끼리 전환할 수 있다. 다른 스레드에 영향을 미친다.

이것들을 보면 스레드가 한번에 여러 개가 동시에 사용될 수 있다는 것을 예측할 수 있다.
이렇게 프로세스 내에서 여러 개의 스레드가 동시에 실행하는 것을 다중 스레드, 멀티 스레드라고 한다.
단일 스레드보다 더 빠르고 경제적이며, 통신과 공유 자원 관리에도 용이하다.
프로세스가 관리하는 자원 중 Code, Data, Heap 영역은 모든 스레드가 공유하고 있다.
Stack과 Register는 스레드 별로 관리하고 있으며, 만약 공유하고 있는 변수를 잘못 건드리면 프로그램이 이상하게 동작할 수 있다. 동기화 문제가 발생하거나 교착 상태에 빠질 수 있어 이를 잘 관리하는 것이 중요하다.