프로세스(Process)
In computing, a process is the instance of a computer program that is being executed by one or many threads.
컴퓨터에서, 프로세스란 하나 또는 그 이상의 스레드에 의해 실행되고 있는 컴퓨터 프로그램의 인스턴스
프로세스를 이해하기 위해서는 프로그램을 먼저 이해해야 한다.
프로그램: 어떤 작업을 수행하기 위해 실행되는 일련의 동작을 모아놓은 파일
프로세스: 프로그램이 실행되면 생성되는 인스턴스. 메모리(Ram)에 적재되고, CPU 자원을 할당받아 프로그램이 실행되고 있는 상태
운영체제를 통해 이런 프로세스를 동시에 여러개 실행하고 관리하는 것을 '멀티태스킹'이라 한다.
(사실 엄밀히 말하면 "동시에" 실행하는 것은 아니다. CPU는 한번에 한 가지 명령어 밖에 수행하지 못한다. 다만 명령어를 처리하는 속도가 어마어마하게 빠르기 때문에 한 프로세스의 명령어를 처리한 뒤 다른 프로세스의 명령어를 처리함으로써 마치 여러개의 프로세스가 동시에 실행되는 것처럼 보이게 만든다. 이를 Context Switching(문맥교환)이라고 부른다. 후에 스케쥴러를 설명할 때 다시 언급할 예정)

프로세스 내부를 살펴보자. 하나의 프로세스는 위 그림과 같이 각각 독립된 4가지 메모리 영역을 할당받는다.
- 코드(Code) 영역
프로그램의 코드 및 상수가 기계어 형태로 저장되는 영역
프로그램이 컴파일 되고 난 뒤에는 바뀌지 않기 때문에 읽기 전용 공간이다. (다른 영역은 읽고 쓰기가 가능)
CPU는 이 코드 영역에 저장된 명령어를 하나씩 수행한다. - 데이터(Data) 영역
코드에서 선언한 전역(Global) 변수와 정적(Static) 변수가 저장되는 영역
이 데이터 영역은 프로그램이 시작될 때 할당되어 종료될 때 소멸된다.
전역(Global) 변수와 정적(Static) 변수
- 전역 변수: 해당 프로그램의 어느 파일, 어느 함수에서도 접근 가능한 변수
- 정적 변수: 변수가 선언된 파일내에서만 접근 가능한 변수. 초기화가 단 한 번만 가능하다.
두 변수 모두 프로그램이 시작될 때 할당되고, 프로그램이 종료될 때 소멸된다.
- 스택(Stack) 영역
지역 변수, 매개 변수, 리턴 값, 등이 저장되는 영역
함수 호출 시 할당되며, 함수 종료 시 소멸된다.
스택(Stack)이라는 이름에서 알 수 있듯이 후입선출(LIFO) 메커니즘을 따른다. - 힙(Heap) 영역
프로세스 실행 중에 동적으로 할당되는 영역
프로그램이 실행되는 순간 프로그램이 사용할 메모리 크기를 고려하여 할당이 이뤄지는 다른 영역과 달리 동적으로 할당된다.
힙 영역의 크기는 프로그램이 실행된 뒤 런타임에 확인 가능하다.
각각이 어째서 독립적인 메모리 영역을 갖는지 생각해보면 이해하고 외우기 쉽다.
프로세스 제어 블록(Process Control Block)
특정 프로세스를 관리하기 위해 필요한 중요 정보를 포함하고 있는 운영체제의 자료구조
운영체제는 프로세스를 관리하기 위해 프로세스가 생성됨과 동시에 고유한 PCB를 생성한다.
PCB는 Context Switching(문맥교환)에 있어서 굉장히 중요한 역할을 한다.
CPU의 자원을 할당받아 작업을 처리하다가 프로세스 전환이 발생하면 진행하던 작업을 중단하고 진행 상황을 PCB에 저장한다. 그리고 후에 다시 CPU를 할당받으면 PCB에 저장되어있던 내용을 불러와 이전 종료 지점부터 다시 프로세스의 작업을 수행한다.
PCB에 저장되는 정보들
- 프로세스 식별자(Process ID): 프로세스 식별번호
- 프로세스 상태
- new(프로세스 생성)
- ready(프로세스가 CPU에 할당, 처리 대기 중)
- running(프로세스가 CPU에 할당, 명령어 실행 중)
- waiting(어떤 이벤트의 발생으로 인해 처리 대기 중)
- terminated(프로세스 종료)
- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
레지스터란?
컴퓨터의 프로세서 내에서 자료를 보관하는 아주 빠른 기억 장소. 일반적으로 현재 계산을 수행중인 값을 저장하는 데 사용된다.
- CPU 스케쥴링 정보 : 우선 순위, 최종 실행시각, CPU 점유시간 등
- 메모리 관리 정보 : 해당 프로세스의 주소 공간 등(위 그림에서 언급한 4가지 독립된 메모리 공간)
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치, 열린 파일 목록 등
- 프로세스 계정 정보 : 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등
스레드(Thread)
In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system.
컴퓨터에서, 운영체제의 일부인 스케쥴러에 의해 독립적으로 관리될 수 있는, 프로그래밍된 명령어의 가장 작은 시퀀스
프로세스를 구성하는 가장 작은 실행 단위
한 프로세스 내에서 실행되는 여러개의 스레드는 부모 프로세스의 주소 공간이나 자원 등을 공유할 수 있다.
스레드는 같은 프로세스 내의 다른 스레드끼리도 자원을 공유한다.

각 스레드에 독립적으로 할당되는 자원에는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택이 있다.
스레드에 독립적인 자원이 할당되는 이유는 각각의 스레드가 독립적인 작업을 수행해야하기 때문이다.
▶︎ 스택을 독립적으로 할당하는 이유
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언된 변수 등을 저장하기 위해 사용되는 메모리 공간이다. 독립적인 함수 호출을 하기 위해서는 해당 함수와 관련된 정보들이 필요하므로, 스레드에 스택을 독립적으로 할당하여 함수 호출이 가능하게 해준다.
▶︎ 레지스터를 독립적으로 할당하는 이유
스레드는 스케쥴러에 의해 CPU를 할당받았다가 전환되기를 반복하는데, 다시 CPU를 할당받았을 때 레지스터가 다음에 수행할 명령어의 위치를 기억하기 때문에 명령어를 이어서 수행할 수 있다.
'Computer Science' 카테고리의 다른 글
[네트워크] HTTP에 관하여 (0) | 2021.10.17 |
---|---|
[자료구조] 스택(Stack)과 큐(Queue), 배열(Array)과 연결 리스트(Linked List) (0) | 2021.10.14 |
객체 지향 프로그래밍(OOP) (0) | 2021.10.07 |