안녕하세요.

오늘은 프로세스에 대해 포스팅합니다.

프로그램과 프로세스

 

컴퓨터에서 프로그램 이란 단어는 매우 많이 사용되고 있습니다.

반면에 프로세스 라는 용어는 생각보다 생소합니다. 운영체제에서는 두가지 단어의 개념을 구분해서 사용할 줄 알아야 합니다.

프로그램

하드디스크에 저장되어 있는 일련의 데이터 덩어리를 파일 이라고 일컫습니다. CPU가 해석하고 수행할 수 있는 명령어 데이터로 구성된 파일프로그램 이라고 합니다. 이미지 파일과 같은 순수 데이터는 프로그램이라 할 수 없습니다. 

프로세스

하드디스크에 저장되어 있는 프로그램 을 CPU가 수행하기 위해서는 하드디스크에 위치한 데이터를 메모리로 옮기는 작업이 필요합니다. 메모리에 옮겨진 일련의 데이터 덩어리를 프로세스 라고 일컫습니다.

 

정리하자면 프로세스프로그램 이 메모리에 옮겨진 데이터 덩어리를 의미합니다.

그러므로 프로세스실행 중인 프로그램 이라고도 불립니다.

 


프로세스 구조

 

사실 프로세스프로그램 데이터 그대로 메모리에 복사되는건 아닙니다.

OS가 프로그램 을 분석하여, 아래와 같은 프로세스 구조를 만듭니다.

 

CODE

하드디스크에서 읽어온 프로그램 데이터가 저장되는 영역입니다.

CPU가 명령어를 수행하기 위해 사용됩니다.

 

DATA

프로세스 가 수행되면서 필요한 데이터들이 저장되는 영역입니다.

OS가 프로그램 을 분석하면서 사전에 정의할 수 있는 데이터만 저장됩니다.

프로세스 가 수행(함수와 같은)되면서 생성되는 데이터들은 사전에 저장하지 못합니다.

 

STACK

프로세스 의 명령어가 수행될 때 필요한 공간으로 사용됩니다.

함수의 콜스택 지역변수 데이터들이 적재됩니다.

 

HEAP

STACK 은 공간을 사용한 후 데이터가 소멸 됩니다.

반면에 HEAP 공간은 데이터가 소멸되지 않습니다. 소멸시키기 위해서는 추가적인 소멸 명령어가 필요합니다.

CODE, DATA와 다르게 필요한 공간을 미리 계산할 수 없는 STACKHEAP은 임의의 크기가 정해진 공간을 같이 사용합니다. 따라서, STACK 또는 HEAP 메모리 사용량이 매우 많아지면 여유 공간이 없어 문제가 발생할 수 있습니다. STACK 공간을 과도하게 사용할 때는 StackOverflow, HEAP 공간을 과도하게 사용할 때는 OutOfMemery(OOM) 과 같은 에러가 발생할 수 있습니다.

 


프로그램 제어 블록(PCB)

 

컴퓨터는 하나의 프로세스만 수행하지 않고 여러 프로세스를 수행합니다.

그렇기에 메모리에는 많은 프로세스 들이 위치해 있습니다.

CPU는 어떻게 무수히 많은 프로세스 중에 특정 프로세스를 찾아내는 걸까요?

또 필요한 정보들을 취득하거나 저장하는 건 어떻게 하는 걸까요?

 

우리가 책을 읽을 때, 원하는 컨텐츠를 빠르게 찾기 위해서는 목차를 사용합니다.

CPU도 마찬가지로 프로세스 목차를 사용합니다.

이에 OSPCB 단위로 프로세스 목차를 구성하여 CPU에게 제공합니다.

 

PCBCPU프로세스를 수행하기 위해 필요한 데이터로 구성되어 있습니다.

 

PID(Process IDentification)

OS는 각 프로세스를 식별하기 위해 번호를 부여합니다. 이 식별 번호가 바로 PID 입니다.

 

포인터

CPU와 같은 공간에서 프로세스를 효율적으로 찾을 수 있도록 도와주는 정보입니다.

 

프로세스 상태

OS는 무수히 많은 프로세스를 정해진 절차대로 처리합니다. 해당 정보는 그 절차를 판단하기 위해 사용됩니다.

프로세스 상태에 따라 정해진 절차대로 수행하는 것을 프로세스 스케줄링 이라 부르며 프로세스 스케줄러 라는 프로그램이 수행합니다.

아래에서 자세히 다룰 예정입니다.

 

프로그램 카운터

해당 프로세스에서 CPU가 다음으로 실행할 명령어 위치를 가리키는 값입니다.

 

레지스터 정보

레지스터 는 쉽게 말해, 데이터를 저장할 수 있는 임시 공간입니다.

CPU프로세스를 처리하면서 필요한 데이터를 저장하고 읽는 용도로 사용합니다.

 


프로세스 스케줄링

 

현대 OS시분할 시스템을 제공합니다.

채팅을 하면서 동시에 음악을 들을 수 있는 이유는 CPU가 빠른 속도로 번갈아가면서 프로세스를 수행하기 때문입니다.

특정 프로세스CPU로 처리되기 위한 과정은 아래와 같습니다.

 

 

프로세스의 상태는 크게 5가지가 존재합니다.

생성 상태

프로그램을 메모리로 가져와 프로세스 제어 블록(PCB) 생성이 완료된 상태입니다.

 

준비 상태

실행을 기다리는 모든 프로세스가 자기 차례를 기다리고 있는 상태입니다.

실행될 프로세스CPU 스케줄러가 선택합니다.

 

실행 상태

선택된 프로세스가 타임 슬라이스를 얻어 CPU를 사용하는 상태입니다.

기존 수행되던 PCB준비 상태 또는 대기 상태로 넘어가면서 문맥 교환 오버헤드가 발생합니다.

 

대기 상태

실행 상태에 있는 프로세스가 입출력과 같은 인터럽트가 발생되면 완료될때까지 기다리는 상태입니다.

CPU가 키보드와 마우스 같은 입출력 장치의 처리를 기다리면서 생기는 병목현상을 방지합니다.

입출력 처리가 완료되면 해당 PCB준비 상태로 보냅니다.

 


문맥 교환(Context Switching)

 

CPU는 여러 프로세스를 특정 시간마다 번갈아 가면서 수행합니다.

요리 중 다른 요리를 하게 되면 기존 재료들을 냉장고에 넣고 새 재료를 배치하는 것처럼 CPU프로세스 교체 수행을 위한 준비가 필요합니다..

프로세스 를 교체할 때 CPU는 아래와 같은 과정이 필요합니다. (A 프로세스에서 B 프로세스로 교체된다고 가정합니다.)

  • A 프로세스의 정보를 A PCB 에 저장한다.
  • B 프로세스의 정보를 B PCB 로부터 가져온다.

 

이러한 준비시간을 CPU가 일을 하지 못하는 낭비시간이라 생각하여 오버헤드라 부릅니다.

문맥 교환 오버헤드를 개선하고자, 프로세스 교체 타임 슬라이스를 너무 길게 잡아도 프로세스 동시성 처리가 나빠질 수 있기 때문에 적당한 수준의 타임 슬라이스를 잡는 것이 중요합니다.

 


 

오늘 준비한 내용은 여기까지입니다.

읽어주셔서 감사합니다.

 

 

'운영체제' 카테고리의 다른 글

[운영체제] 뮤텍스와 세마포어  (0) 2021.07.25
[운영체제] 스레드  (0) 2021.07.22

포스팅이 도움 되셨다면, 커피 한잔 후원해주세요!
더 좋은 포스팅 작성에 큰 힘이 됩니다.

Buy me a coffeeBuy me a coffee

+ Recent posts