본문 바로가기

CS

프로세스란?

프로세스란?​

실행 중인 프로그램으로, 메인 메모리에 적재되어 프로세서에 의해 실행되고 관리되는 상태를 말한다. 

 

하나의 프로세스는 네가지 섹션으로 구분된다.

  • 텍스트 섹션: 실행 코드
  • 데이터 섹션: 전역 변수
  • 힙 섹션: 프로그램 실행 중에 동적으로 할당되는 메모리
  • 스택 섹션: 함수를 호출할 떄 임시 데이터 저장소(함수 매개변수, 복귀 주소 및 지역변수)

함수가 호출될 때마다 함수의 매개변수, 지역변수 및 복귀 주소를 포함하는 활성화 레코드가 스택에 차례로 푸시된다. 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고도 한다.

 

프로그램은 디스크에 저장된 파일처럼 수동적인 존재, 프로세스는 다음에 실행할 명령어 지정하는 프로그램 카운터와 관련 자원의 집합을 가진 능동적 존재다. 때문에 텍스트 섹션은 동등해도 데이터, 힙, 스택 섹션이 다른 같은 프로그램이자 다른 프로세스로써 존재할 수 있다.

 

보통, 프로세스를 생성하는 과정에서 많은 프로세스를 생성한다.

 

 

프로세스의 상태

프로세스는 실행되면서 그 상태가 변한다. 상태는 아래와 같이 다섯 가지가 있다.

  • 새로운(new): 프로세스가 생성 중이다.
  • 실행(running): 명령어가 실행되고 있다.
  • 대기(waiting): 프로세스가 어떤 이벤트가 일어나기를 기다린다.
  • 준비(ready): 프로세스가 처리기에 할당되기를 기다린다.(실행할 준비가 되어있음(
  • 종료(terminated): 프로세스의 실행이 종료되었다.

이와 같은 상태들이 있는 이유는 어느 한순간에 한 처리기 코어에서는 오직 하나의 프로세스만이 실행되기 때문이다. 모든 프로세스를 동시에 실행시킬 수 있다면, 상태는 생성, 실행, 종료 세가지 뿐일 것이다. 하지만 코어의 개수는 한정되어 있고 동시에 프로세스는 수십, 수백개가 존재한다.  이 때문에 프로세스에게는 대기하고, 준비하는 상태가 필요하다.

 

 

프로세스 제어 블록(process control block, PCB)

프로세스 제어 블록(PCB)는 특정 프로세스의 여러 정보를 수록하는 저장소이다. 프로세스마다 하나씩 존재하며 프로세스의 상태, 번호, 프로그램 카운터(현재 프로세스에서 다음에 실행시킬 명령어의 주소), CPU에서 사용하던 레지스터관련 정보, 메모리 정보 등을 저장한다. 이러한 정보들은 프로세스 스케줄러에 의해 준비 상태의 프로세스 실행할 때 사용된다.

 

 

스케줄링 큐(Scheduling Queue)

위에서 설명한 프로세스의 다섯가지 상태에서 준비 상태가 되면, 해당 프로세스의 PCB는 준비 큐(ready queue)에 들어간다. 또, 실행중이던 프로세스가 I/O 또는 이벤트를 기다리는 대기 상태가 되면 대기 큐(waiting queue) 에 들어가고 대기 상태가 끝나면 준비 큐에 다시 삽입된다.

 

새 프로세스는 처음에 준비 큐에 삽입된다. 프로세스를 실행되는 것은 즉 CPU 코어에 프로세스가 할당되는 것을 뜻하고, 준비 큐의 PCB는 삭제되어 해당 정보를 토대로 CPU는 프로세스를 다음 인터럽트나 I/O 까지 실행시킨다.

 

이렇게 PCB를 상태에 따라 관리하는 큐들을 스케줄링 큐(Scheduling Queue) 라고 한다.

 

문맥 교환(Context Switch)

CPU 코어를 다른 프로세스에게 할당 하려면 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이 필요하다. 이 작업을 문맥교환(Context Switch) 라고 한다. 문맥 교환이 일어나면, 커널은 과거 프로세ㅇ스의 문맥을 PCB에 저장하고, 실행이 스케줄된 새로운 프로세스의 저장된 문맥을 복구한다. 이 시간동안 시스템은 아무런 유용한 일을 할 수 없기 때문에 순수하 오버헤드를 발생시킨다.

 

 

프로세스 간 통신(Interprocess Communication, IPC)

프로세스는 다른 프로세스과 데이터를 공유하지 않는 독립적인 프로세스와 데이터를 공유하며 영향을 주고받는 협력적인 프로세스로 나눌 수 있다. 이러한 프로세스간의 협력을 허용하는 환경을 제공하는 데는 몇 가지 이유가 있다.

 

  • 정보 공유: 여러 응용 프로그램이 동일한 정보에 흥미를 느낄 수 있으므로, 그러한 정보를 병행적으로 접근할 수 있는 환경을 제공해야 한다.
  • 계산 가속화: 만일 우리가 특정 태스크를 빨리 실행하고자 한다면, 그것을 서브태스크로 나누어 이들 각각이 다른 서브태스크들과 병렬로 실행되게 해야한다.
  • 모듈성: 시스템 기능을 별도의 프로세스들 또는 스레드들로 나누어, 모듈식 형태로 시스템을 구성하기를 원할 수 있다.

이렇게 프로세스들의 협력을 안전하게 하기 위해 프로세스 간 통신(Interprocess Communication)기법이 필요하다. 프로세스 간 통신에는 기본적으로 공유 메모리(shared memory) 메시지 전달(message passing) 두가지 모델이 있다.

 

공유 메모리는 협력 프로세스에 의해 공유되는 메모리의 영역이 구축된다. 프로세스들은 그 영역에 데이터를 읽고 쓰고 함으로써 정보를 공유할 수 있다.

 

메시지 전달 모델에서는 통신이 협력 프로세스들 사이에 교환되는 메시지를 통하여 이루어진다.

 

메시지 전달 모델은 충돌을 회피할 필요가 없기 때문에 적은 양의 데이터를 교환하는데 유용하다. 하지만 메시지 전달 모델은 시스템 콜을 사용하여 구현되므로 커널 간섭등의 부가적인 시간 소비 작업이 필요하기 때문에 공유 메모리 모델이 메시지 전달보다 더 빠르다. 공유 메모리 시스템에서는 공유 메모리 영역을 구축할 때만 시스템 콜이 필요하므로, 일단 구축되면 모든 접근은 일반적인 메모리 접근으로 취급되어 커널의 도움이 필요 없다.

 

 

공유 메모리 시스템에서의 프로세스 간 통신

공유 메모리를 사용한느 프로세스 간 통신에서는 통신한느 프로세스들이 공유 메모리 영역을 구축해야 한다. 통상 공유 메모리 영역은 공유 메모리 세그먼트를 생성하는 프로세스의 주소 공간에 위치한다. 이 공유 메모리 세그먼트를 이용하여 통신하고자 하는 다른 프로세스들은 이 세그먼트를 자신의 주소 공간에 추가하여야 한다.

 

프로세스는 일반적으로 운영체제에 의해 다른 프로세스의 메모리에 접근하는 것이 금지된다. 공유 메모리를 사용하기 위해선 두 프로세스간의 이 제약 조건을 동의하는 것을 필요로한다. 이 때 동일한 위치에 동시에 쓰지 않도록 책임져야 한다.

 

 

메시지 전달 시스템에서의 프로세스 간 통신

메시지 전달 방식은 동일한 주소 공간을 공유하지 않고도 프로세스들이 통신을 하고, 그들의 동작을 동기화 할 수 있도록 허용하는 기법을 제공한다. 프로세스들이 네트워크에 의해 연결된 다른 컴퓨터들에 존재할 수 있는 분산 환경에서 특히 유용하다.(채팅 프로그램 처럼)

'CS' 카테고리의 다른 글

Application Layer  (0) 2022.03.25
CPU 스케줄링  (0) 2022.03.11
스레드와 병행성  (0) 2022.03.11
네트워크 기본 - OSI 모델과 TCP/IP 모델  (0) 2022.01.17