R e d A l i e n Click

엄청난 기술을 접하면, 마치 외계인의 기술을 훔친 것과 같다고 말합니다

붉은외계인은 그러한 놀라운 기술을 탐구하고, 기술적인 도전에 맞서는 것을 의미하는 저의 또 다른 이름입니다

서로가 성장할 수 있는 건설적인 토론을 좋아합니다.

article_thumbnail

[붉은외계인] CS - 컴퓨터구조와 작동 원리 3 - 운영체제의 프로세스 관리

2024. 1. 16.
클릭 시, 이동!

운영체제란 무엇인가 

운영체제는 프로그램 실행에 필요한 자원을 할당해주고, 프로그램이 올바르게 실행될 수 있도록 도와주는 프로그램 혹은
하드웨어에 직접 접근하고 제어할 수 있는 프로그램이다


운영체제의 가장 중요한 점은, 어떠한 프로세스든 자원에 접근하기 위해서는 반드시 운영체제를 거쳐야만 한다는 것이다

이러한 운영체제 또한 프로그램이기 때문에 메모리에 적재된다 하지만 Kernel 영역이라는 특별한 영역에 적재된다

 

이러한 운영체제의 특징은 아래와 같다


1. 각 자원을 관리하는 영역이 나뉘어져 있다 ( CPU자원을 관리하는 영역, 메모리 자원을 관리하는 영역 등... )
2. 개발자가, 하드웨어를 직접 조작하는 코드를 짤 필요가 없다
> 시스템 호출과 같이, 운영체제가 하드웨어를 조작하는 코드를 제공해주기 때문에, 우리는 그것을 쓰기만 하면 된다는 것

 


 

운영체제를 공부해야 하는 이유

그렇다면, 하드웨어를 조작하는 운영체제를 굳이 공부해야 하는 이유가 무엇일까?

1. 운영체제는 사용자를 위한 프로그램이 아니라, 프로그램을 위한 프로그램이기 때문이다
프로그램 실행에 필요한 자원은 운영체제가 할당해준다 즉, 프로그램은 운영체제의 도움을 받아 실행되기 때문에, 
이것만으로도 운영체제를 알아야 하는 이유가 된다

2. 대부분의 오류 메세지는 운영체제가 보내기 때문에, 문제해결능력을 키울 수 있기 때문이다
궁극적으로, 프로그램 실행은 하드웨어가 하고, 이러한 하드웨어는 운영체제가 관리한다
그렇기 때문에 하드웨어가 프로그램의 코드를 제대로 실행하지 못하면, 운영체제는 이를 알아채고 오류 메세지를 
보내는 것이다

즉, 운영체제가 보내는 오류 메세지를 해석할 수 있다면, 왜 코드가 실행되지 않는지 문제해결능력을 키울 수 있다

 


 

운영체제 기본

- 운영체제는 다양한 기능을 제공하나, 가장 핵심적인 기능은 Kernel에서 제공한다

- CPU는 이중 모드로 명령어를 실행하며, Kernel모드와 User모드로 실행한다


Kernel 모드로 실행하면 운영체제의 서비스를 받을 수 있고 = 자원에 접근할 수 있는
User 모드로 실행하면 운영체제의 서비스를 받을 수 없다 = 자원에 접근할 수 없는
( 하지만 User 모드에서 시스템 호출을 하면 Kernel 모드로 전환되면서, 자원에 접근할 수 있게 된다 )

 

시스템 호출User모드 프로세스가 Kernel 모드 전환을 통해 자원에 접근할 수 있게 해주는 함수 혹은 인터페이스이다

정확히 말하자면 프로세스가 접근하는 것이 아니라, 프로세스가 요구하는 행동을 운영체제가 대신 해주는 것이다
예를들어 A프로세스가, 보조기억장치에 저장된 test.txt를 읽고 싶어 read 시스템호출을 하면, 운영체제는
read() 함수의 코드대로 하드웨어에 접근한 후, 해당 결과를 프로세스에게 반환해주는 것이다

이러한 시스템 호출 처리과정은 인터럽트 처리 과정과 비슷하다

시스템 호출을 하면 소프트웨어 인터럽트가 발생하면서, 인터럽트 핸들러 실행을 통해 작업을 처리한다
인터럽트 핸들러에 대한 자세한 내용은 이전 게시물을 참고할 것

 

2024.01.05 - [Fundamental/CS\OS] - [붉은외계인] CS\OS - 컴퓨터구조와 작동 원리 2 - 주변 장치

 

[붉은외계인] CS\OS - 컴퓨터구조와 작동 원리 2 - 주변 장치

해당 게시물을 읽기 전, 아래 게시물을 참고할 것. 2024.01.05 - [Fundamental/CS\OS] - [붉은외계인] CS\OS - 컴퓨터구조와 작동 원리 1 - CPU와 메모리 [붉은외계인] CS\OS - 컴퓨터구조와 작동 원리 1 - CPU와 메

redalien.tistory.com

 


 

운영체제의 핵심 기능

운영체제의 핵심 기능은 프로세스 관리, 자원 접근 및 할당, 파일 시스템이다
간단하게 큰 그림을 먼저 나열해보겠다

프로세스 관리 : PCB와 문맥 교환, 상태 개념과 부모-자식 계층 구조
자원 접근 및 할당: CPU 스케줄링, 스와핑, 페이징 
파일 시스템 : FAT 파일 시스템, 유닉스 파일 시스템 등..( 파일 시스템은 다루지 않을 예정 )

 


 

프로세스 관리 - Kernel 영역 

가장 먼저, Kernel 영역에서 일어나는 일을 다뤄보겠다

프로세스는 실행을 위해 CPU가 필요하지만, 한정된 자원으로 인하여 정해진 시간만큼만 CPU를 사용한다
그러다가 타이머 인터럽트가 발생하면, 다음 차례 프로세스에게 CPU 사용을 넘겨주고, 문맥 교환이 일어난다 

여기서, 문맥 교환을 이해하기 위해서는 먼저 PCB에 대해 알아야 한다

운영체제는 번갈아가며 실행되는 프로세스 관리를 위해 PCB 자료구조를 사용한다


PCB는 프로세스에 관한 정보가 저장된 자료구조이며 PID, 레지스터값, 프로세스 상태, CPU 사이클 등이 저장된다
여기서 레지스터값이 무엇이냐면 CPU에서 실행될 때 사용하던 레지스터값들이다
나중에 다시 자기 차례가 왔을 때, 작업했던 내용을 이어가기 위함인 것이다


이러한 PCB는 프로세스가 생성 될 때, Kernel 영역에 PCB가 생성되고, 프로세스 상태 변화에 따라 PCB가 업데이트된다 
그리고 프로세스가 종료되면 PCB는 폐기가 된다 이러한 PCB는 문맥교환에 사용된다
이제 문맥 교환에 대해서 알아보자

문맥 교환은 CPU에서 실행중이던 프로세스가 작업 내용을 PCB에 백업하고, 다음 실행할 프로세스가 PCB로부터 
작업 내용을 복구하여 실행을 이어가는 것을 말한다 쉽게 말해, 실행할 프로세스 교체인 것이다

 

결론은, 운영체제가 빠르게 전환되는 프로세스를 관리할 수 있는 이유는 PCB 자료구조와 문맥 교환 덕분이라는 것이다

 


 

프로세스 관리 - User 영역 

프로세스가 생성되면 User 영역에는 코드 영역, 데이터 영역, 힙, 스텍 영역으로 나뉘어 저장된다 ( 크게 4가지로 나눈 것 )

Heap의 경우, 최신 프로그래밍 언어들은 알아서 메모리를 반환해주는데, 이것을 Garbage Collection 이라고 한다
( Java, JavaScript, Python은 지원하나, C, C++은 지원하지 않기 때문에 직접 메모리를 반환해야한다 )

 


 

프로세스 관리 - 상태 개념과 계층구조

프로세스들은 각자마다 상태가 있으며, 운영체제는 프로세스의 상태를 PCB에 기록하여 관리한다

해당 표를 도식화하면 아래와 같다

프로세스들은 이러한 상태 개념을 가지고 변화한다

프로세스 계층구조를 바로 알아보자

계층 구조는 위의 그림과 같다

최초의 프로세스가 자식 프로세스를 생성한 후, 그 자식 프로세스가 또 다른 자식 프로세스를 생성하면서 계층구조를 이룬다
여기서, 자식 프로세스를 생성하는 방법은, fork()와 exec() 시스템 호출을 통해 이루어진다

fork()는 자신을 복제하여 자식 프로세스로 생성하는 시스템 함수이다 이 때, 자식은 부모의 자원을 상속받는다
exec()는 자신의 메모리 공간에 새로운 프로그램을 덮어 씌우는 것이다
즉 순서는 fork > exec 를 통해 자식 프로세스가 생성되는 것이다 위의 그림의 예를 들어보겠다

1. Bash 셸에서 vim 명령어 실행
2. Bash는 fork()를 통해 자식 프로세스를 생성 후, 자원을 상속해준다
3,.자식은 exec() 호출을 통해, 자신의 Code영역과 Data영역에 Vim 실행에 필요한 명령어/데이터를 덮어씌운 후, 
나머지 영역은 초기화한다

 


 

정리

정리하자면, 운영체제는 프로세스 관리를 아래와 같이 한다


1. 최초의 프로세스가 fork와 exec 시스템 호출을 통해,  자식 프로세스를 생성하는데 이는 계층구조를 이룬다


2. 프로세스가 생성되면 Kernel 영역에는 프로세스에 관한 정보인 PCB를 생성,
User 영역에는  프로세스를 코드,데이터,힙,스텍 영역에 나누어 메모리에 저장한다


3. 프로세스 실행을 위해서는 CPU가 필요하나, CPU는 자원이 한정되어 있어, 프로세스들을 정해진 시간만큼만
돌아가면서 실행한다 이 때, CPU가 프로세스 실행을 전환하는 과정에서 문맥교환이 일어난다

4. 모든 프로세스는 각자마다 생성, 준비, 실행, 대기, 종료 상태가 있으며 PCB에 기록되어 관리된다

 

다음 게시물은 자원 접근 및 할당에 대해서 알아볼 것이다 :)