Kim Jinung

3. 프로세스 본문

Computer Science/Operating System

3. 프로세스

Kim Jinung 2022. 12. 30. 21:30
프로세스란 무엇인가?

프로세스는 스토리지에 저장한 프로그램을 메인 메모리에 적재하여 실행 중인 상태다. 현대 컴퓨팅 시스템에서 작업의 단위다. 초기 컴퓨터 시스템은 하나의 프로그램이 시스템을 완전히 제어하므로, 시스템의 모든 자원에 접근할 수 있었다. 운영체제가 등장한 이후 현대 컴퓨팅 시스템은 메모리에 다수의 프로그램을 적재해서 병행 실행할 수 있게 되었다. 이러한 과정을 거치며 운영체제는 여러개의 프로세스를 효율적으로 실행하기 위한 기능을 제공하게 된다.

 

따라서 포인트는

1. 프로세스는 메모리 상에서 어떻게 구성되어 있는가?

2. 여러개의 프로세스를 어떻게 컨트롤하고 우선순위를 부여하는가?

 

 

우선 프로세스는 메모리 상에서 다음과 같이 구성된다.

프로세스의 메모리 배치

  • 텍스트 섹션 - 소스 코드
  • 데이터 섹션 - 전역 변수
  • 힙 섹션 - 프로그램 실행 중 발생하는 동적 메모리 할당을 위한 영역
  • 스택 섹션 - 함수의 파라미터, 복귀 주소, 지역 변수 등의 Activation record를 저장하는 영역

다음으로 프로세스에 대한 정보 저장을 담당하는 리포지토리가 존재한다.

Process Control Block(PCB)

운영체제에서 각 프로세스는 PCB에 의해서 표현된다. (프로세스의 현재 상태와 관련된 정보를 가지고 있다는 의미다.) 이후 다룰 프로세스 스케줄링에서 대기 큐에 삽입되는 것이 이 PCB다.

 

PCB는 프로세스를 시작시키거나 다시 시작시키는 데 필요한 리포지토리 역할을 담당한다.

  • 프로그램 상태: 현재 프로그램의 상태, New, Ready, Runnng, Watting, Halted 등을 표시한다.
  • 프로그램 카운터: 현재 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
  • CPU 레지스터: 레지스터와 상태 코드를 저장한다. 인터럽트 발생 시, 다음 실행을 위해 필요한 영역이다.
  • CPU 스케쥴링 정보: 프로세스 우선순위, 스케쥴 큐에 대한 포인터에 대한 정보
  • 메모리 관리 정보: 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함한다.
  • Account 정보: CPU 사용 시간과 경과된 실시간, 시간 제한, 계정 번호, 잡 또는 프로세스 번호를 포함한다.
  • 입출력 상태 정보: 프로세스에 할당된 입출력 장치들과 열림 파일의 목록 등을 포함

PCB vs 프로세스 메모리 배치

프로세스는 가상 메모리 개념이 도입이 되면서 페이지라는 개념이 등장한다. 여기서 PCB는 프로세스의 정보를 관리하는 영역이고, 페이지는 실제로 작업을 수행하기 위해서 운영체제가 프로세스에 할당 해주는 메모리 공간이다.

 

프로세스 스케줄링

운영체제는 다중 프로그래밍을 제공한다. 여기서 다중 프로그래밍이란 메모리에 여러 프로그램을 적재하여 병행 실행하는 것을 의미한다. 이 과정에서 하나의 프로그램이 CPU자원을 독점하지 않으므로 CPU 리소스를 더 효율적으로 사용할 수 있게 되었다. 작업에는 입출력에 시간을 많이 소비하는 Input / Output 작업과 계산에 많은 시간이 소요되는 CPU bound 프로세스가 있다. 

 

스케줄링 큐, CPU 스케줄링

프로세스의 정보를 저장하고 있는 PCB가 Watting queue에 enque 후 준비 상태가 되어서 CPU 코어에서 실행되는 것을 기다린다. (이때 프로세스 스케줄러는 CPU가 실행 할 수 있는 프로세스를 선택한다.) 이 큐에는 CPU가 작업해야하는 프로세스의 PCB들이 링크드 리스트 자료구조로 저장된다. 이 과정에서 I/O 작업 같이 유휴 상태가 긴 작업은 요청 후 곧바로 인터럽트 되고 해당 PCB는 I/O Watting queue에 enque 된다. 그리고 작업이 완료되면 CPU에 알리게 된다. 이 과정 사이 (인터럽트 후 완료를 알리기 전 까지)에 CPU는 다음 프로세스에 대한 작업을 진행하는 것이다. 이 인터럽트 과정에서 CPU 코어가 작업하고 있는 프로세스를 다른 프로세스로 교환하기 위해서 이전 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 복구하는 작업이 필요한데 이것이 Context switch다. 그런데 이러한 Context switch 과정에서는 CPU 코어가 아무런 일도 못하기 때문에 그 시간이 모두 오버헤드가 된다.

프로세스 생성

UNIX, Linux, Windows와 같은 현대 운영체제는 프로세스를 고유한 정수값을 가진 pid를 통해 구분한다. 프로세스는 트리 형태로 생성이 되는데 Root node는 pid가 언제나 1인 init(systemd)다. 해당 노드에서부터 다양한 유저 프로세스가 생성되게 된다. (터미널 열고 pstree 커맨드 입력하면 바로 감이 온다.)

프로세스 종료

프로세스가 실행을 끝내고 exit 시스템 콜을 사용하여 운영체제 자신(프로세스)의 삭제를 요청한다. 


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

운영체제 내에서 실행되는 프로세스가 시스템에서 실행 중인 다른 프로세스들에 영향을 주거나 받는 협력적 프로세스와 데이터를 공유하지 않는 독립적인 프로세스가 존재한다. 프로세스가 협력을 허용하는 이유는 정보 공유, 계산 가속화, 모듈성 등의 이유가 있으며 IPC기법을 구현하는 데에는 공유 메모리와 메시지 전달 두 가지 모델이 존재한다. 

 

파이프(Pipes)

초기 UNIX 시스템에서 제공하는 IPC기법의 하나. file descriptor를 이용해서 쓰고 읽는 방식.

 

Ordinary pipes: Producer-Consumer 형태로 한 쪽은 쓰고 한 쪽은 읽기만 가능한 형태

Named pipes: 양방향 통신이 가능한 형태

 

클라이언트-서버 환경에서의 통신

소켓(Socket)

소켓은 통신의 엔드 포인트를 의미한다. 네트워크 상에서 통신을 위해 양 프로세스마다 하나씩 총 두개의 소켓이 필요하며 각 소켓은 IP 주소와 포트 번호를 가진다.

 

서버는 지정된 포트에 클라이언트 요청 메시지가 도착하기까지 대기한다. 요청이 수신되었을 때 서버가 클라이언트 소켓으로부터 연결 요청을 수락하면 연결이 완성된다. 각각의 모든 연결은 유일해야해서 연결 성립 시 서버에 접속한 클라이언트에 대한 포트 번호가 동적으로 생성된다. 연결이 성립된 두 호스트 사이에서 데이터 패킷을 이용해서 데이터를 주고 받는다. (호스트 측의 ip는 동일하고, 서버가 포트 번호만 생성해준다.) Telent, ftp, http 등의 서비스가 이에 해당한다. (소켓 종류에는 흔히 알고 있는 TCP, UDP 등이 있다.) 

 

RPC(Remote Procedure Calls)

네트워크에 연결된 두 시스템을 위한 통신에 사용하기 위해서 프로시저 호출 기법을 추상화하는 방법으로 설계되었으며 IPC 기반 위에서 만들어졌다. RPC는 클라이언트가 원격 호스트의 프로시저를 호출하는 것을 마치 자기의 프로시저를 호출하는 것처럼 만들어준다. (쉽게 말해서 클라이언트가 다른 시스템(서버)에서 실행 중인 프로세스에서 함수를 호출(시스템 콜) 할 수 있도록 해준다는 것이다.) 

 

DFS에서 많이 사용한다. (HDFS가 각 데이터 노드에 동일한 작업을 내리는 게 이에 해당하는 듯)

'Computer Science > Operating System' 카테고리의 다른 글

6. 프로세스 동기화 그리고 데드락  (0) 2023.01.06
5. CPU 스케줄링  (0) 2023.01.05
4. 스레드와 병행성  (0) 2023.01.04
2. 운영체제 구조  (0) 2022.12.29
1. 운영체제 서론  (0) 2022.12.29