<aside> ☝🏻 모든 프로그램은 실행을 위해 (시스템)자원을 필요로 한다. 이때, 운영체제는 1) 실행할 프로그램에 필요한 자원을 할당하고, 2) 프로그램이 올바르게 실행되도록 돕는 3) 특별한 프로그램이다.
</aside>
운영체제란
운영체제의 필요성
→ 프로그램은 하드웨어가 필요하고, 하드웨어를 조작하는 프로그램이 운영체제이다. 그래서 운영체제를 알면 프로그램이 하드웨어 상에서 어떻게 작동하는지를 알 수 있다.
→ 문제 해결의 실마리
<aside> ☝🏻 10장부터 15장까지는 커널 모드에서 다루는 운영체제의 핵심 서비스를 다룬다.
</aside>
운영체제의 심장, 커널
→ 운영체제의 핵심 서비스를 담당하는 부분, 핵심 서비스는 3가지가 있다.
<aside> ✌🏻 커널에 포함되지 않는 서비스는 대표적으로 사용자 인터페이스(UI)가 있다. UI의 종류에는 그래픽 유저 인터페이스(GUI)와 커맨드 라인 인터페이스(CLI)가 있다. → 커널에 포함되어 있지 않기에, 당연히 같은 커널일지라도 UI는 다를 수 있다.
</aside>
이중 모드와 시스템 호출
<aside> ✌🏻 운영체제에 도움을 요청한다 = 운영체제 코드를 실행하려고 한다.
</aside>
이중 모드: CPU가 명령어를 실행하는 모드를 사용자 모드와 커널 모드로 구분하는 방식
사용자 모드: 운영체제 서비스를 제공받을 수 없는 실행 모드, 사용자 영역만 다룰 수 있음
→ 일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행된다.
커널 모드: 운영체제 서비스를 제공받을 수 있는 실행 모드, 두 영역 모두 다룰 수 있음
→ 운영체제 코드(시스템 서비스, 운영체제 드라이버)가 커널 모드에서 실행된다.
이중모드 구분은 플래그 레지스터 속 슈퍼바이저 플래그를 통해 알 수 있다.
시스템 호출: 운영체제 서비스를 제공받기 위한 요청, 사용자 모드로 실행되는 프로그램은 사용자 호출을 통해 운영체제 서비스를 제공받을 수 있다.
→ 이 호출도 일종의 인터럽트라서, 소프트웨어 인터럽트라고도 불린다.
→ 그래서 하드웨어 인터럽트와 같이, 백업-인터럽트 수행-복귀 루틴을 가진다.
운영체제의 핵심 서비스
프로세스 관리
→ 여러 프로세스를 관리하는데, 실행하고 전환하는 과정을 거침
각각의 프로세스의 상태와 조건이 다양한데, 운영체제는 이 프로세스들을 일목요연하게 관리한다.
여러 프로세스가 동시에 실행되는 환경에서 ‘프로세스 동기화’를 거친다.
또한 프로세스가 응답하지 못 하는 상황을 ‘교착 상태’라고 한다.
자원 접근 및 할당
→ 프로세스들이 사용할 자원에 접근하고 조작해 필요한 자원 할당함
운영체제가 CPU 자원을 할당할 때 ‘CPU 스케줄링’을 거친다.
운영체제가 메모리 자원을 할당할 때 부족한 메모리를 극복하기도 한다.
커널 영역엔 인터럽트 서비스 루틴을 제공한다. 입출력장치가 발생시키는 하드웨어 인터럽트도 커널 영역에 존재한다. 운영체제는 서비스 루틴을 제공해 입출력 작업을 수행한다.
파일 시스템 관리
→ 파일들을 묶어 폴더(디렉토리)로 보관하는 기능이다.
<aside> 👐🏻 운영체제는 가상 머신을 위한 모드인 하이퍼 바이저 모드를 두기도 한다. 가상 머신은 하이퍼 바이저 모드를 통해 운영체제로부터 운영체제 서비스를 받을 수 있다.
</aside>
<aside> ☝🏻 프로그램 자체가 프로세스인 것이 아니라, 프로그램이 메모리에 적재될 때 프로세스라 한다. 프로그램이 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 메모리에 적재하는 순간 프로세스가 된다. 이를 **‘프로세스를 생성한다’**라고 한다.
</aside>
<aside> 👐🏻 프로세스는 사용자가 보는 앞에서 실행되는 프로세스인 ‘포그라운드 프로세스’와 사용자가 보지 못하는 곳에서 실행되는 프로세스인 ‘백그라운드 프로세스’가 있다. 백그라운드 프로세스에는 사용자와 직접 상호작용할 수 있는 백그라운드 프로세스도 있지만, 정해진 일만 묵묵히 수행하는 백그라운드 프로세스인 ‘데몬(daemon)’, 또는 ‘서비스(service)’가 있다.
</aside>
프로세스 제어 블록(PCB)
→ 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보가 담긴 자료 구조
프로세스에 옷 태그처럼 붙여져 있는 구조라고 생각하면 된다.
커널 영역에서 생성되며, 프로세스 종료시 소멸된다.
→ 새로운 프로세스 생성 = 운영체제가 PCB 생성
→ 프로세스 종료 = 운영체제가 해당 PCB 폐기
PCB는 다음과 같은 정보를 담는다.
a. 프로세스 ID(PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
b. 레지스터 값: 자신의 실행 차례가 돌아올 때 복구하기 위해 중간 정보(문맥)을 저장
c. 프로세스 상태: 생성, 준비, 실행, 대기, 종료로 구분됨
d. CPU 스케줄링 정보: CPU 할당에 대한 정보 저장[11장]
e. 메모리 관리 정보: 베이스 레지스터, 한계 레지스터, 페이지 테이블 정보[14장] 저장
f. 사용한 파일과 입출력장치 목록: 특정 입출력장치나 파일 사용 기록을 명시
문맥 교환
→ 기존 프로세스의 PCB에 문맥을 백업하고, 다음 프로세스의 PCB에서 문맥을 복구해 교환하는 것
프로세스의 메모리 영역
정적 할당 영역(크기가 고정된 영역)
a. 코드 영역(텍스트 영역): CPU가 실행할 명령어가 저장되는 공간(Read-only 공간)
b. 데이터 영역: 프로세스의 유지할 데이터가 저장되는 공간
→ 전역 변수와 같은 데이터가 저장됨
동적 할당 영역(크기가 변할 수 있는 영역)
c. 힙 영역: 프로그래머가 직접 할당할 수 있는 저장 공간, 큐 구조로 이루어짐
d. 스택 영역: 데이터를 일시적으로 저장하는 공간, 스택 구조로 이루어짐
→ 매개 변수, 지역 변수와 같은 데이터가 저장됨
<aside> ✌🏻 C언어를 컴파일할 때 메모리에서는 다음과 같은 과정이 일어난다. [참고]
</aside>