본문 바로가기
IT 및 프로그래밍

프로세스와 스레드 중 프로세스의 개념에 대하여

by 데이터 석사 2024. 10. 21.

초기에 사용하던 컴퓨터는 프로그램을 한 번에 하나씩 수행했고, 실행 중인 프로그램에 컴퓨터 자원을 독점했다. 병행 실행하는 프로그램들은 컴퓨터 자원을 공유하므로 이를 통제하는 방법이 필수인데, 이 과정에서 해당 글의 주제인 프로세스가 나타난 것이다. 다중 프로그래밍 환경에서는 여러 프로그램을 메모리에 적재하여 병행 실행할 수 있어 컴퓨터의 효율을 높일 수 있다.

프로세스와 스레드의 프로세스의 개념에 대하여

프로세스의 개념

프로세스 용어는 1960년대 멀틱스 운영체제에서 가장 먼저 사용했는데, IBM 운영체제에서는 이를 작업이라고 칭하기도 한다. 프로세스는 다음과 같이 다양하게 설명할 수 있다.

 

- 실행 중인 프로시저

- 실행 중인 프로시저의 제어 추적

- 수행 중인 프로그램

- 비동기적 행위

- 프로세서에 할당하여 수행할 수 있는 개체 디스패치가 가능한 대상

- 운영체제에 들어 있는 프로세스 제어 블록

 

이 중 가장 정석인 프로세스 정의는 '실행 중인 프로그램'이다. 프로그램이 실행 중이라는 뜻은 디스크에 있던 프로그램을 메모리에 적재하여 운영체제의 통제를 받는 상황이 되었다는 것이다. 이는 자신만의 메모리 영역이 있음을 뜻한다. 프로세스가 수행 중인 프로그램이 되려면 프로세서 점유 시간, 메모리, 파일, 입출력장치 같은 자원이 필수인데, 프로세스를 만들거나 실행할 때 이 자원을 할당한다. 그리고 프로세스는 현재의 활동 상태를 나타내는 프로그램 카운터, 프로세서의 현재 활동도 포함한다. 프로세스는 프로그램 실행의 인스턴스도 된다. 그래서 웹 브라우저 창을 한 개 열면 프로세스 한 개를 만들고, 웹 브라우저 창을 2개 열면 프로세스 2개를 만든다.

 

프로세스는 메모리 구조를 이루고, 프로그램 카운터나 레지스터처럼 현재 어떤 자원을 이용하는지 연관 정보가 들어 있는 동적인 개체이다. 반면에 프로그램은 컴파일한 코드와 초기화 전역변수, 문자열과 문자열 상수 등 정적 데이터를 포함하는 정적인 개체이다.

 

스택은 데이터를 일시적으로 저장하는 영역이다. 지역변수에 이용하고, 변수가 범위 밖으로 이동하면 공간을 해제한다. 보통 힙과 근접한 방향으로 점점 커져 스택 포인터와 힙 포인터를 만나면 메모리가 소진되었다는 의미이다. 호출한 함수의 반환 주소, 바꾼 값, 매개변수 등에 이용하고, 함수를 호출할수록 커지고 반환하면 줄어든다.

 

힙은 코드 영역과는 별도로 유지되는 자유 영역이다. 프로세스의 공유 라이브러리와 동적으로 적재된 모듈이 서로 공유하는데, 동적 메모리 할당이 일어나면 일반적으로 위쪽으로 커진다. 동적으로 메모리를 나눠주라고 프로그램 실행 중 시스템 호출을 이용했다가 해제하는 수단으로 활용한다.

 

데이터는 프로그램의 가상 주소 공간이다. 정적변수는 0으로 초기화하거나 초기화하지 않아도 된다. 초기화하지 않은 데이터는 데이터 영역의 끝에서 시작한다. 전역변수나 정적변수를 저장하거나 나눠주고 수행하기 전에 초기화한다. 그런데 변숫값은 실행 시간에 변경할 수 있어 읽기 전용 영역은 아니지만 읽기 전용 영역이나 읽기와 쓰기 영역으로 초기화할 수 있다.

 

코드는 실행 명령을 포함하는 메모리이거나 목표 파일에 있는 프로그램 영역이다. 코드 영역은 공유할 수 있으므로 자주 실행하는 워드 프로세서, C 컴파일러, 셸 같은 프로그램의 사본 하나는 메모리에 존재한다. 프로그램을 시작할 때 프로세서가 디스크에서 읽어 수행하는 컴파일한 프로그램을 저장한다. 프로세스로 변경할 수 없고, 읽기 전용이므로 프로그램이 코드 영역을 침범하여 쓰기를 시도하면 결함이 생겨나서 프로그램을 종료한다.

 

데이터베이스, 문서 편집기처럼 여러 사용자가 메모리에 있는 똑같은 사본을 공유할 수 있는 프로그램을 재진입 프로그램이라고 한다. 이들은 프로세스 수행 중에 이용할 데이터를 보관하는 스택 영역과 공통 데이터를 보관하는 데이터 영역으로 나뉘어 있다. 따라서 프로세스 2개가 똑같은 문서 편집기를 이용하고 데이터 영역이 같더라도 스택 영역은 서로 달라 별개의 프로세스로 인지한다. 스택과 힙 사이는 서브루틴을 수행하는 영역으로 운영체제로 매핑되지 않는다.

 

실행 순번을 결정하는 스케줄러는 디스크에 저장된 프로그램에 프로세서를 나누어줘 장치나 메모리 같은 파일 자원을 참조한다. 그리고 프로세스를 보조하고 협력하여 교착 상태, 보호, 동기화 같은 정보를 교환한다. 사용자 관점에서 프로세스는 주소 공간을 가지고 수행하는 프로그램이다.

 

프로세스는 실행하는 역할에 따라 시스템 프로세스와 사용자 프로세스로 구별하고, 병행 실행 방법에 따라 독립 프로세스와 협력 프로세스로 구별한다.

 

프로세스의 종류

프로세스의 종류는 시스템 프로세스, 사용자 프로세스, 독립 프로세스, 협력 프로세스 네 가지 존재한다.

 

시스템(커널) 프로세스는 프로세스 실행 순번을 통제하거나 다른 사용자 및 커널(운영체제) 영역을 침범하지 못하게 감시하고, 사용자 프로세스를 생성하는 기능을 하며, 모든 시스템 메모리와 프로세서의 명령에 액세스할 수 있는 프로세스이다.

 

사용자 프로세스는 사용자 코드를 실행하는 프로세스이다.

 

독립 프로세스는 다른 프로세스의 영향을 받지 않거나 다른 프로세스에 영향을 주지 않으면서 실행하는 병행 프로세스이다.

 

협력 프로세스는 다른 프로세스에서 영향을 받거나 다른 프로세스에 영향을 주는 병행 프로그램이다.

 

결론 및 요약

• 컴퓨터는 초기에 프로그램을 한 번에 하나씩 실행했고, 병행 실행하는 프로그램들은 컴퓨터 자원을 공유하므로 이를 제어하는 방법이 필요했다. 

• 프로세스는 실행 중인 프로그램을 의미하며, 메모리 구조를 이루고 현재 어떤 자원을 사용하는지 연관 정보가 들어 있는 동적인 개체이다. 

• 프로세스는 시스템 프로세스와 사용자 프로세스, 독립 프로세스와 협력 프로세스로 구분된다. 

• 시스템 프로세스는 프로세스 실행 순서를 제어하거나 다른 사용자 및 커널 영역을 침범하지 못하게 감시하고, 사용자 프로세스를 생성하는 기능을 한다. 

• 사용자 프로세스는 사용자 코드를 실행하는 프로세스이다. 

• 독립 프로세스는 다른 프로세스의 영향을 받지 않거나 다른 프로세스에 영향을 주지 않으면서 실행하는 병행 프로세스이다. 

• 협력 프로세스는 다른 프로세스에서 영향을 받거나 다른 프로세스에 영향을 주는 병행 프로그램이다.