본문 바로가기
CS 이론/운영체제

운영체제 3부<프로세스와 상태>

by Suff07 2024. 10. 9.

 

목차

    0. 들어가기에 앞서서.....

    먼저, 하나의 일상적인 이야기를 하고 이야기를 시작해보도록 하겠습니다.

     

    우리가 호텔에 가면, 호텔 뷔페가 있습니다.

     

    뷔페 메뉴를 보면 한식, 일식, 양식, 중식 등등 무궁무진하게 많습니다!

     

    한식부, 일식부, 양식부, 중식부가 있다고 치겠습니다.

     

     

     

    자! 여기서 뷔페 요리사들은 소수정예의 4인으로써 모든 요리를 다 할줄 알고, 반드시 하나의 요리를 한팀으로 움직여서 한다 칩시다.

     

     

    그러면 각 부서에서는 주문해야 하는 요리들을 어떻게 쳐내야 할까요?

     

    쳐내야 할 일들은 많은데, 4인의 요리사가 이걸 어떻게 해야 할까요?

     

    이제부터, 이야기를 시작해보도록 하겠습니다.

     

     

    1. 프로세스란?

    우리가 프로그램을 실행하면 과연 컴퓨터는 어떻게 이를 이해하고 실행할까요?

     

    프로세스의 정의를 보기전에 잠깐! 메모리 구조를 다시 한번 복습해봅시다.

     

    만약, 잘 몰랐던 분들이라면 C언어에서 포인터를 배울때 상당히 도움이 많이 되므로 꼭 알아둡시다.

     

    1-1. 메모리 구조와 프로그램 실행과정

     

    영역 하는 역할
    스택 동적 할당을 통해서 프로그래머가 자기 마음대로 쓸수 있는 공간입니다.
    지역변수를 적재하는 곳입니다.
    데이터 영역 일반적으로 전역변수를 적재하는 곳입니다.
    텍스트=코드영역 프로그램의 코드를 메모리상에 적재하는 역할입니다.
    즉, int main(){...} 요 코드를 여기에 저장합니다.

     

    그래서, 프로그램이 실행되는 과정을 한번 이야기 해보겠습니다.

     

     

    전처리기에서부터 링커까지는 여기를 참고해주시고 https://suff07.tistory.com/13

     

    이후 실행파일이 만들어지면 이를 메모리상에 적재하는데 이를 로드<Load>라고 합니다.

     

    그리고, 명령어를 CPU로 옮기는것이 Fetch, 이를 디코딩하여 실행하는게 Decode와 Execution입니다.

     

     

    1-2. 그래서 프로세스란게 무엇이며 특성이 뭔데요?

    자, 이제 프로세스를 정의하겠습니다.

     

     

    프로세스란 실행중인 프로그램을 의미합니다.

     

     

    즉, 다중 프로그램이 당연시되는 현재 실행중인 프로그램들이 여러개가 존재할텐데 이들에게 자원을 올바르고 공평하게 나눠주는것이 바로 운영체제가 할 일이라 이겁니다!

     

    위에서 언급했던 이야기를 비유하자면 다음과 같습니다.

     

    양식부, 중식부, 한식부, 일식부와 같은 각 부서가 바로 프로세스입니다.

     

    1-2-1. 프로세스의 특성

    프로세스의 특징은 크게 두가지로 분류가 가능합니다.

     

    • 프로그램을 실행시킬때 자원<=리소스,Resource>를 얼마나 줄것이며 어떻게 관리할 것이냐?

    각각의 프로세스는 자신의 실행 이미지[각주:1] 적재와 실행에 필요한 메모리 공간을 확보하는것이 중요합니다. 또한 각각의 프로세스가 입출력포트와 접근해야할 파일등에 대한 관리가 필요하겠죠.

    • 프로그램이 실행될 때 프로세스가 어떻게 작동할지에 대한 제어에 대한 부분

    프로세스가 단순하게 자원이 확보가 되면 끝이 아닙니다.

    이 프로세스를 어떻게 동작시킬지에 대한 제어가 필요하고 프로세스가 하나가 아니라 여러개라면 언제 어떻게 제어를 해야할지에 대한 논의가 당연히 필요할것입니다.

     

    여기서 잠깐!

     

    프로그램 VS 프로세스의 차이를 봅시다.

     

    프로그램은 저장장치에 저장되어있는 실행파일 그 자체를 말합니다.

    즉 HDD나 SSD에 있는 실행 파일 그 자체이지요.

     

    반면, 프로세스는 메모리에 Load되기 직전이며, 리소스를 할당 받은 실행파일을 의미합니다.

     

     

    위의 그림에서 링커 다음 실행파일이 보일텐데 이 상태가 바로 프로세스입니다!

     

    결정적으로 다른점은 바로 프로그램은 실행을 안시키면 그대로 있는다는점에서 수동적인 존재이고, 프로세스는 자원을 할당받아 어떻게 할지 알아서 하는 능동적은 존재라는점입니다.

     

    위에서 빗댄 이야기대로 풀어보자면, 호텔 식당 그 자체가 바로 프로그램이고 프로세스는 각 부서들입니다.

    2. 문맥 교환

    2-1. 문맥<context>이란?

    먼저 문맥이라는것이 무엇인지 알아봅시다.

     

    프로세스의 실행 중단 시 보존되고, 속행 시 복구되어야 하는 프로세스의 모든 실행 정보

     

     

    쉽게 생각하면, 업무 진척도가 바로 문맥이라 이해하면 됩니다.

     

    위의 비유를 들어보자면 다음과 같죠.

     

    현재 스테이크 조리는 약 50% 정도 되었으며, 사용한 조리 도구와 요리 재료들은 다음과 같고, 앞으로 해야할 일들은 어떠한 것들입니다.

     

     

    2-2. 사용자 수준 문맥<User-Level Context>과 커널 수준 문맥<Kernel Level Context>

    사용자 수준 문맥은 위에서 보았던 메모리 구조를 다시 한번 가져와서 보도록 합시다.

     

     

     

    지역변수, 전역변수, 프로그램 코드가 바로 사용자 수준 문맥입니다.

     

    즉, 스택영역, 데이터영역, 코드영역이지요! [각주:2]

     


     

    이제, 중요한것은 커널 수준 문맥인데요.

     

    커널 수준 문맥은 크게 3가지가 있습니다.

     

    * 프로그램 카운터 <PC>

         text 내 다음으로 수행할 명령어의 주소를 담고 있는 레지스터

     

    스택 포인터 <SP>

         Call Stack의 top에 해당하는 주소를 저장하는 레지스터

     

    * CPU 상태 레지스터 <Program Status Register, PSR>

         명령어 실행 후 그 결과로 생겨나는 CPU의 상태를 저장

         decode한 명령어를 수행할 때 조건으로 작용 가능, 다음 명령어를 수행할 때 중요한 정보로 반영 가능

     

    이외에는 자원을 얼마나 썼느냐에 대한 부분과 프로세스의 관리 정보들이 있습니다.

     

    그리고 위의 3가지 내용을 넣는 것이 바로 PCB<Process Control Block>입니다.

     

    2-3. Context Switching

    문맥 교환은 말 그대로 문맥 교환입니다.

     

    즉, 프로세스가 바뀌는 과정을 이야기하는것이지요!

     

     

     

     

    여기서 문맥 교환은 자발적 교환과 비자발적 교환으로 분류가 가능합니다.

     

    • 자발적 교환은 프로세스가 스스로 입출력 요청을 하거나 스스로 CPU 사용을 포기할 때 일어납니다. 가장 대표적인 경우는 키보드 입력이나 모니터 출력이라 할 수 있겠습니다.
    • 비자발적 교환은 프로세스가 CPU의 사용시간을 초과하여 강제로 뺏는 경우인데, 이걸 보통 인터럽트라 합니다.

    위에서 언급한 사례를 들어 설명해보자면 다음과 같습니다.

     

    양식부에서 스테이크를 요리해달라고 요청을 해서 요리사들이 요리를 하는데, 중식부에서 이야기가 나오는것이죠!

     

    "야 양식부 너희들! 우리 요리사들 시켜서 중화요리 만들어야 하는데 요리사들을 니네가 너무 많이 쓰잖아! 비켜!"

     

    자, 여기서 우리는 요리사들이 CPU 즉 프로세서라는 것을 알 수 있습니다.

     

    2-4. PCB<Process Control Block>

    위에서 설명했다시피 PCB는 프로세스 정보를 저장하는 공간이라 이야기했습니다.

     

    프로세스의 일생 동안 해당 프로세스의 모든 정적, 동적인 정보를 가지며, 커널이 프로세스를 관리하기 위한 실체입니다.

     

     

    3. 프로세스의 상태

    명칭 설명
    생성 프로세스가 메인메모리에 Load 되기전에 생성된 상태
    준비 프로세스가 CPU에게 할당되기를 기다리는 상태
    실행 프로세스가 CPU를 점유하여 명령을 수행하는 상태
    보류=대기 어떠한 특정 상황이 생겨 프로세스가 CPU 점유를 잠시 포기하는 상태
    종료 프로세스가 CPU 사용을 끝낸 상태 

     

     

    1. 생성 -> 준비 : 실행파일이 생성되어 프로세스가 준비 Queue에 적재되는 단계
    2. 준비 -> 실행 : 준비 Queue에 적재된 프로세스들 중에서 가장 먼저 들어온 프로세스가 CPU를 점유하여 일을 시작하는것 [각주:3]
    3. 실행 -> 준비 : 한창 일을 하고 있는데, CPU가 사용시간이 다 되었다고 프로세스를 쫒아내어 다시 CPU의 권한을 운영체제로 넘기는 과정, 우리는 이를 인터럽트라고 합니다.
    4. 실행 -> 대기 : 프로세스가 어떤 사건이 발생하기를 기다리고 있는 상태. 이때 사건은 입출력의 완료 또는 시그널의 접수
    5. 대기 -> 준비 : 입출력 작업이 끝이 났을때 준비상태로 다시 전환

     

    4. 요약

    • 프로세스는 프로그램의 실행상태를 나타내며, 자원과 제어에 대한 부분을 포함한다.
    • 문맥이란 프로세스의 진행상태를 나타내는 정보이며, 이는 PCB에 저장된다.
    • 문맥교환이란 다수의 프로세스가 각각의 PCB에 저장된 정보들을 저장하고 불러와서 프로세스끼리 돌아가며 프로세서를 점하는 것을 의미한다.
    • 문맥교환은 자발적 문맥교환과 비자발적 문맥교환으로 나뉘는데 자발적 문맥교환은 상태가 대기이고, 비자발적 문맥교환은 준비로 바뀐다.

    즉, 위의 사례를 다시 한번 정리해보면 다음과 같습니다.

     

     

    1. 이미지는 쉽게 생각해서 복제본이라 이해하면 됩니다. 컴퓨터용어로써 이미지는 iso파일과 같은 디스크 이미지 파일도 있지만, 여기서는 링킹이 끝나고 메모리에 Load 되기 전인 실행파일을 이야기합니다. [본문으로]
    2. 여기서 커널영역부분에도 커널 코드영역, 커널 스택영역 등이 보일텐데 이 부분은 차후에 설명하도록 하겠습니다. [본문으로]
    3. 이를 디스패치라고 합니다. [본문으로]

    'CS 이론 > 운영체제' 카테고리의 다른 글

    운영체제 2부<구조>  (0) 2024.01.11
    운영체제 1부<목적&역사>  (0) 2024.01.11