검수요청.png검수요청.png

프로세스

위키원
이동: 둘러보기, 검색

프로세스(Process)는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램으로, 종종 스케줄링의 대상이 되는 작업(Job), 태스크(Task)라는 용어와 거의 같은 의미로 쓰인다. 일반적으로 중앙처리장치(CPU)에 의해 처리되는 사용자 프로그램 또는 시스템 프로그램 즉, 실행 중인 프로그램을 의미한다.

개요[편집]

프로세스는 여러 형태로 정의할 수 있다. 프로세스 제어블록(PCB)을 가진 프로그램, 실기억장치에 저장된 프로그램, 프로세서가 할당되는 실체로서, 디스패치(Dispatch)가 가능한 단위, 프로시저가 활동 중인 것, 비동기적 행위를 일으키는 주체, 지정된 결과를 얻기 위한 일련의 계통적 동작, 목적 또는 결과에 따라 발생하는 사건들의 과정, 운영체제가 관리하는 실행 단위가 있다.[1] 프로그램(Program)은 보조 기억장치에 존재하며 실행되기를 기다리는 명령어와 정적인 데이터의 묶음이다. 이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 프로세스가 된다.[2]

특징[편집]

프로세스는 병행 실행이 가능하지만, 프로세스 간의 통신이 필요하고, 하나의 프로그램이 여러 프로세스를 생성할 수 있으며, 각각 독립된 메모리 영역과 주소 공간을 운영체제로부터 할당받는다.[3] 시분할 시스템에서 볼 때, 분할 시간마다 그 처리 대상이 되는 작업 단위를 가지고 있다. 운영체제의 커널 관점에서, 프로세스의 표현은 프로세스 제어블록(Process Control Block, PCB)으로 표현되고, 프로세스의 구성은 저마다 분리된 메모리 공간으로 구성된다. 또한, 프로세스별로 메모리 공간이 격리된다. 각 프로세스가 독립된 메모리 공간을 가지도록 보장되어야 한다. 즉, 프로세스는 타 프로세스, 커널로부터 격리되어, 이들 메모리에 읽기와 쓰기가 제한된다.[4]

구성[편집]

프로세스에 대한 정보는 프로세스 제어블록(PCB) 또는 프로세스 기술자(Process Descriptor)라고 부르는 자료구조에 저장된다. 프로세스 제어블록(PCB)은 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영체제 커널의 자료구조이다. 운영체제에서 프로세스를 프로세스 제어 블록으로 나타내며, 각 프로세스가 생성될 때마다 고유의 프로세스 제어 블록이 생성되고, 프로세스가 완료되면 프로세스 제어 블록이 제거된다.[5] 운영체제가 각 프로세스를 식별하기 위해 부여된 프로세스 식별번호(Process IDentification, PID), 중앙처리장치가 프로세스를 빠르게 교체하면서 실행하기 때문에 실행 중인 프로세스와 대기 중인 프로세스가 있는데, 이 프로세스의 상태, 중앙처리장치가 다음으로 실행할 명령어를 가리키는 값으로, 중앙처리장치가 기계어를 한 단위씩 읽어서 처리하는데 프로세스를 실행하기 위해 다음으로 실행할 기계어가 저장된 메모리 주소를 가리키는 값인 프로그램 카운터(Program Counter), 운영체제가 여러 개의 프로세스가 중앙처리장치에서 실행되는 순서를 결정하는 것을 스케줄링이라고 한다. 이 스케줄링에서 우선순위가 높으면 먼저 실행될 수 있는 스케줄링 우선순위, 프로세스가 접근할 수 있는 자원을 결정하는 정보인 권한이 저장되어있다. 또한, 최초로 생성되는 init 프로세스를 제외하고, 모든 프로세스는 부모 프로세스를 복제하여 생성되고, 트리를 형성한다. 따라서 각 프로세스는 프로세스의 부모와 자식 프로세스에 대한 정보를 가지고 있다. 프로세스는 실행 중인 프로그램으로, 프로그램에 대한 정보를 가지고 있어야 한다. 프로그램에 대한 정보는 프로세스가 메모리에 가지는 자신만의 주소 공간에 저장되는데, 이 공간에 대한 포인터 값을 가진다. 즉, 프로세스의 데이터와 명령어가 있는 메모리 위치를 가리키는 포인터 값이 저장되어 있다. 그리고 프로세스에 할당된 자원들을 가리키는 포인터 또한 저장되어있고, 프로세스가 실행상태에서 마지막으로 실행한 프로세서의 레지스터 내용을 담고 있는데, 중앙처리장치에 의해 실행되는 프로세스는 운영체제에 의해 계속 교체되면서 자신의 차례가 다시 되어 실행될 때 중단된 적이 없고, 연속적으로 실행된 것처럼 하기 위해 레지스터 정보를 가지고 있다.

메모리 위치를 가리키는 포인터

프로세스의 데이터와 명령어가 있는 메모리 공간은 텍스트(Text), 데이터(Data), BSS, (Heap), 스택(Stack) 영역으로 구성된다. 텍스트(Text)는 작성된 코드가 저장되는 영역이다. 데이터(Data)는 프로그램이 실행될 때 생성되고, 프로그램이 종료되면서 시스템에 반환된다. 전역변수, 정정변수, 배열, 구조체 등이 저장된다. 이때 초기화된 데이터는 데이터(Data) 영역에 저장되고, 초기화되지 않은 데이터는 BSS(Black Stated Symbol)에 저장된다. 함수 내부에서 선언된 정적(Static) 변수는 프로그램이 실행될 때 공간만 할당되고, 그 함수가 실행될 때 초기화된다. BSS(Black Stated Symbol)는 초기화되지 않은 데이터가 저장되는 공간으로, 전역 변수와 정적 변수가 저장된다. 힙(Heap)은 메모리를 동적으로 생성할 경우 저장된다. C언어의 경우, malloc 함수를 이용하여 힙(Heap)에 동적으로 메모리를 생성할 수 있다. 힙(Heap)은 낮은 주소에서 높은 주소로 크기가 증가한다. 스택(Stack)은 지역변수 할당과 함수 호출 시 전달되는 인자값, 리턴 어드레스를 저장하기 위한 공간이다. 스택은 높은 주소에서 낮은 주소로 크기가 증가한다. 텍스트(Text)에서 스택(Stack)으로 갈수록 메모리 주소값이 증가한다. 텍스트(Text)와 데이터(Data), BSS 영역의 크기는 컴파일 시점에 결정되고, 힙(Heap)과 스택(Stack)은 런타임 시점에 결정된다. 힙(Heap) 영역과 스택(Stack) 영역 사이에는 빈 공간이 있는데, 컴파일 타임에 지역변수를 얼마나 사용할지 미리 계산할 수 없기 때문에 런타임에 지역변수 선언 순서에 따라 스택(Stack) 영역을 위쪽으로 주소값을, 동적 할당될 때는 힙(Heap) 영역은 아래쪽으로 주소 값을 매긴다.[2][6]

상태[편집]

운영체제는 프로세스들의 실행 사이에 프로세스를 교체하고 재시작할 때 오류가 발생하지 않도록 관리해야 한다. 프로세스가 만들어져 시스템에 존재하는 동안 여러 가지 사건들에 의해 일련의 상태 변화를 거치게 된다. 생성(New), 준비(Ready), 실행(Running), 대기(Blocked), 보류 준비(Suspended Ready), 보류 대기(Suspended Blocked), 종료(Terminated, Exit) 등이 있다. 생성 상태(New)는 사용자가 요청한 작업이 커널에 등록되고, 프로세스 제어블록이 만들어져 프로세스가 만들어진 다음 준비(Ready)나 보류 준비(Suspended Ready) 상태로 되기 위해 잠시 거치는 상태를 말한다. 만약 프로세스를 생성한 후, 메모리 공간을 검사하여 메모리 공간이 충분하면 준비 상태로 바꾸고, 메모리 공간이 부족하면 보류 준비 상태로 변경한다. 준비 상태(Ready)는 중앙처리장치를 할당받기 위해 기다리고 있는 상태로, 중앙처리장치만 주어지면 바로 실행할 준비가 되어 있는 상태이다. 다중 프로그래밍 시스템의 경우 준비 상태의 여러 프로세스는 메모리에 적재되어 있고, 중앙처리장치를 할당받기를 기다리고 있는데, 이들을 위해 또는 리스트가 사용된다. 준비 상태의 프로세스들은 순서에 따라 중앙처리장치를 할당받으면 실행 상태가 되는데, 이때 순서를 정하는 것을 중앙처리장치(CPU) 스케줄링이라고 부른다. 실행 상태(Running)는 중앙처리장치를 할당받아 실행 중인 상태를 말한다. 이때 중앙처리장치를 할당받는 것을 디스패치(Dispatch)라고 부른다. 실행 상태의 프로세스는 중앙처리장치 스케줄링 정책에 의해 중앙처리장치를 빼앗길 수 있으며, 이 경우 준비 상태로 바뀌게 된다. 대기 상태(Block)는 프로세스가 실행되다가 입출력 처리를 요청하거나, 바로 확보될 수 없는 자원을 요청하면 중앙처리장치를 양도하고 요청한 일이 완료되기를 기다리면서 대기하는 상태를 말한다. 대기 상태 역시 준비상태와 마찬가지고 큐 또는 리스트를 사용하여 관리한다. 요청한 일이 완료되면, 다시 실행 차례를 기다리기 위해 준비 상태로 바뀌면서 준비 큐로 들어가게 된다. 종료 상태(Exit)는 프로세스가 종료될 때 아주 잠시 거치는 상태를 말한다. 이 상태의 프로세스는 할당되었던 모든 자원이 회수하고 프로세스 제어블록만 커널에 남아있는 상태이다. 운영체제가 프로세스 제어블록을 삭제하면 프로세스가 완전히 사라진다. 보류 상태(Suspend)는 프로세스가 메모리 공간을 뺏기고 디스크로 나가야 하는 것을 말한다. 메모리 공간을 뺏기고 디스크로 나가는 것을 스왑 아웃(Swap Out), 디스크에서 메모리로 들어오면 스왑 인(Swap In)이라고 부르며, 두 경우를 통틀어 스와핑(Swapping)이라고 한다. 보류 준비 상태(Suspended Ready)는 생성된 프로세스가 바로 메모리를 받지 못하거나 준비 또는 실행 상태에서 메모리를 잃게 될 경우 필요하다. 실행 상태의 프로세스가 중앙처리장치를 반납하면서 준비 상태 바뀔 때 메모리 공간까지 잃어야 하는 경우라면 보류 준비 상태로 바꾸게 된다. 보류 준비 상태의 프로세스는 메모리의 여유가 생기거나 준비 상태의 프로세스가 전혀 없을 때 대기 상태의 프로세스를 보류 대기 상태로 만들고 공간이 확보되면 준비 상태로 바뀌게 된다. 보류 대기 상태(Suspended Block)는 대기 상태일 때 메모리 공간을 잃은 상태를 말한다. 보류 대기 상태(Suspended Block)의 프로세스는 특별한 경우가 아니면 입출력이나 기다리던 사건의 종류 시 보류 준비 상태로 바뀌게 된다.[7]

스케줄링[편집]

중앙처리장치(CPU)는 하나인데 동시에 실행되어야 할 프로세스가 여러 개일 때는 고속으로 여러 프로세스를 일정한 기준으로 순서를 정해서 실행한다. 이때 스케줄링(Scheduling)은 중앙처리장치(CPU) 할당 순서 및 방법을 결정한다. 즉, 어떤 프로세스를 실행(Running) 상태로 보낼까에 대한 결정을 한다.[8] 스케줄러에는 세 가지 종류가 있다. 장기 스케줄링과 중기 스케줄링, 단기 스케줄링으로, 장기 스케줄링은 어떤 프로세스가 시스템 자원을 차지할 수 있도록 할 것인가를 결정하여 큐로 보내는 작업이고, 중기 스케줄링은 어떤 프로세스들이 중앙처리장치(CPU)를 할당받을 것인지를 결정하는 작업이다. 단기 스케줄링은 프로세스가 실행되기 위해 중앙처리장치(CPU)를 할당받는 시기와 특정 프로세스를 지정하는 작업이다.[3]

개별 프로세스[편집]

유닉스(Unix)와 리눅스(Linux)의 개별 프로세스에는 부모 프로세스가 있다. 자식 프로세스가 종료되면, 그 사실이 부모 프로세스에 알려지게 된다. 커널은 스스로가 자신의 부모 프로세스이다. 그리고 소유자가 있다. 특정 사용자 권한으로 실행되고, 취급 파일에 대한 접근 권한에 따라 읽기와 쓰기 등 권한을 달리한다. 프로세스별 식별을 위해 16비트의 프로세스 식별번호(PID)를 사용한다. 또한, 커널에 의해 관리된다. 개별 프로세스는 메모리 공간을 구분한다. 프로그램의 실행 코드와 변수, 상수 등의 데이터를 담고 있는 사용자 메모리 공간과 프로세스 상태 정보를 관리하는 커널 메모리 공간으로 구성되고, 개별 프로세스별 정보를 관리한다. 프로세스와 연관된 각종 아이디(ID)와 가상 메모리 테이블, 파일 디스크립터, 시그널 전달, 처리 정보, 프로세스 자원 사용량, 현재 작업 디렉터리 등이 있다. 개별 프로세스의 메모리 구성에는 텍스트 섹션(Text Section)과 데이터 섹션(Data Section), 프로세스 힙 섹션(Process Heap Section), 프로세스 스택 섹션(Process Stack Section)이 있다. 텍스트 섹션(Text Section)은 적재된 프로그램 코드를 저장하고, 여러 프로세스가 동일 프로그램으로 실행이 가능하므로, 공유될 수 있다. 데이터 섹션(Data Section)은 전역 변수와 정적 변수를 저장한다. 프로세스 힙 섹션(Process Heap Section)은 함수 매개 변수와 복귀 주소, 지역 변수와 같은 임시 자료를 저장한다. 프로세스 스택 섹션(Process Stack Section)은 동적인 메모리 할당 영역이다.[4]

용어[편집]

  • 디스패치(Dispatch): 준비 상태에서 대기하고 있는 프로세스 중 하나가 프로세서를 할당받아 실행 상태로 전이되는 과정이다.
  • 프로시저: 한 프로그램은 여러 개의 작은 프로그램으로 분할될 수 있는데, 이때 분할된 작은 프로그램을 의미하고, 부프로그램이라고도 한다.
  • 웨이크업(Wake Up): 입출력 작업이 완료되어 프로세스가 대기 상태에서 준비 상태로 전이되는 과정이다.
  • 스풀링(Spooling): 입출력 장치의 공유 및 상대적으로 느린 입출력 장치의 처리속도를 보완하고, 다중 프로그래밍 시스템의 성능을 향상하기 위해 입출력할 데이터를 직접 입출력장치에 보내지 않고, 나중에 한 번에 입출력하기 위해 디스크에 저장하는 과정이다.
  • 교통량 제어기: 프로세스의 상태에 대한 조사와 통보를 담당한다.[1]

각주[편집]

  1. 1.0 1.1 코딩팩토리, 〈(OS) 프로세스란 무엇인가?〉, 《티스토리》, 2019-02-05
  2. 2.0 2.1 bowbowbow, 〈(운영체제) 프로세스가 뭐지?〉, 《티스토리》, 2016-03-20
  3. 3.0 3.1 fldfls, 〈프로세스〉, 《velog》, 2020-04-21
  4. 4.0 4.1 Process 프로세스〉, 《정보통신기술용어해설》
  5. PCB(Process Control Block)란?〉, 《티스토리》, 2016-04-18
  6. PYH 나를 개발하자, PYH 〈(운영체제) 프로세스란?〉, 《티스토리》, 2019-02-28
  7. 프로세스란?〉, 《티스토리》, 2015-10-16
  8. 사용자 BlockDMask, 〈(운영체제) 프로세스란?(스케줄링, 메모리구조, 상태변화)〉, 《티스토리》, 2017-07-07

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 프로세스 문서는 소프트웨어에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.