CH09. 운영체제 시작하기
운영체제를 알아야 하는 이유
- 운영체제(OS; Operating System) : 실행할 프로그램에 필요한 시스템 자원을 할당하고 올바르게 실행되도록 돕는 특별한 목적의 프로그램
- 시스템 자원(resources) : CPU, 메모리, 보조기억장치, 입출력장치 등 하드웨어
- CPU 자원 할당 : 특정 프로그램의 CPU 독점을 막고 어떤 순서로, 얼마나 오래 CPU를 사용할지 결정
- 메모리 자원 할당 : 운영체제는 메모리의 커널 영역에 적재되어 새로 실행할 응용 프로그램을 메모리의 사용자 영역에 적재하고 더 이상 실행하지 않을 프로그램은 메모리에서 삭제하는 등 메모리 관리
- 입출력장치 관리 : 여러 응용 프로그램이 하나의 입출력장치를 동시에 이용하려는 경우, 한 프로그램이 입출력장치를 이용하는 동안 다른 프로그램은 대기하도록 만듦
- 운영체제를 알아야 하는 이유
- 운영체제는 하드웨어가 소스 코드를 제대로 실행하지 못하는 상황 등에서 오류 메시지를 제공하기도 함
- 운영체제를 이해한다면 문제를 쉽게 진단하고 해결할 수 있다.
운영체제의 큰 그림
- 커널(kernal) : 운영체제가 제공하는 핵심 서비스를 담당하는 부분
- 운영체제의 핵심 서비스
- 프로세스 관리
- 프로세스(process) : 실행 중인 프로그램
- 각 프로세스마다 상태나 사용하려는 자원 등이 다르므로, 다양한 프로세스들이 동시에 효율적으로 실행될 수 있도록 관리
- 프로세스들이 동시에 실행될 때 프로세스 동기화 문제나 교착 상태 문제 등을 해결해야 함
- 시스템 자원 접근 및 할당
- CPU : 한 프로세스가 CPU를 이용하는 동안 다른 프로세스는 대기하도록 관리
- CPU 스케줄링 : 여러 프로세스들 중 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 이용하게 할 것인지 결정하는 것
- 메모리 : 새 프로세스를 메모리의 어느 주소에 적재할 것인지 결정
- 입출력장치 : 하드웨어 인터럽트 발생 시 실행할 서비스 루틴 제공
- 파일 시스템 관리
- 파일 시스템(file system) : 파일 열기/닫기/생성/삭제 등 작업 및 파일을 디렉터리로(폴더)로 묶는 등의 작업을 관리하는 시스템
- 운영체제는 파일 시스템을 사용해서 보조기억장치 속 데이터를 파일과 디렉터리로 관리
- 사용자 인터페이스도 운영체제가 제공하는 서비스 중 하나지만, 커널에 속하는 핵심 서비스는 아님
- 사용자 인터페이스(UI; User Interface) : 사용자가 컴퓨터와 상호작용할 수 있는 도구
- 그래픽 유저 인터페이스(GUI; Graphic User Interface) : 그래픽 기반으로 상호작용
- 커맨드 라인 인터페이스(CLI; Command Line Interface) : 명령어 기반으로 상호작용
- 이중 모드(dual mode) : CPU가 명령어를 실행하는 모드를 구분하는 방식
- 특정 프로그램의 예상치 못한 동작을 방지하기 위해 운영체제를 통해서만 시스템 자원에 접근하도록 제한
- 플래그 레지스터의 슈퍼바이저 플래그로 이중 모드를 결정한다.
- 커널 모드(kernal mode) : 커널 영역의 코드를 실행할 수 있는 모드
- 운영체제가 실행되는 모드
- 시스템 자원에 접근하는 명령어를 비롯한 모든 명령어 실행 가능
- 사용자 모드(user mode) : 커널 영역의 코드를 실행할 수 없는 모드
- 일반적인 응용 프로그램이 실행되는 모드
- 시스템 자원에 접근하는 명령어는 실행 불가
- 시스템 호출(system call) : 커널 영역 코드를 실행하기 위해 커널 모드로 전환하는 방법
- 사용자 모드에서 실행되는 프로그램이 시스템 자원을 사용하려면 커널 모드로 전환해야 함
- 인터럽트의 일종(소프트웨어 인터럽트)이므로, 시스템 호출을 처리하는 순서는 인터럽트와 유사
- 시스템 호출 발생 (지금까지의 작업을 메모리에 백업)
- 커널 모드로 전환 (플래그 레지스터의 슈퍼바이저 플래그 값이 바뀔 것)
- 운영체제(커널 영역) 내의 시스템 자원 접근 코드 실행
- 실행 종료 후 시스템 호출이 종료되며 사용자 모드로 복귀
- 기존 코드 실행 재개 (메모리에 백업해 둔 작업 복구)
CH10. 프로세스와 스레드
프로세스 개요
- 프로세스(process) : 실행 중인 프로그램
- 포그라운드 프로세스(foreground process) : 사용자가 보는 앞에서 실행되는 프로세스
- 백그라운드 프로세스(background process) : 사용자가 보지 못하는 곳에서 실행되는 프로세스
- 데몬(daemon) or 서비스(service) : 사용자와 상호작용하지 않는 백그라운드 프로세스
- 프로세스 제어 블록(PCB; Process Control Block) : 프로세스 식별 정보를 저장하는 자료구조
- 커널 영역에 저장되어, 운영체제가 프로세스를 식별할 때 PCB를 읽음
- PCB는 프로세스와 생명 주기가 일치한다. (프로세스 생성 및 실행 종료 시 PCB도 생성/삭제)
- PCB에 저장되는 정보
- 프로세스 ID(PID; Process ID) : 프로세스를 식별하는 고유 번호
- 레지스터 값 : 다른 프로세스를 실행할 때 현재 프로세스가 사용하던 레지스터의 중간값들을 백업
- 프로세스 상태 : 현재 프로세스의 상태 (입출력 대기, CPU 사용 대기, CPU 사용 중 등)
- CPU 스케줄링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
- 메모리 관리 정보 : 프로세스가 저장된 메모리 주소 (베이스 레지스터, 한계 레지스터 등)
- 사용한 파일 및 입출력장치 목록 : 프로세스에 할당된 입출력장치, 열어본 파일 등
- 문맥 교환(context switching) : 기존 프로세스의 문맥을 PCB에 백업하고, 새 프로세스의 문맥을 PCB로부터 복구하여 실행하는 것
- 문맥(context) : 프로세스 수행을 재개하기 위해 기억해야 하는 정보
- 문맥 교환이 빠르게 자주 일어나면 사용자는 여러 프로세스가 동시에 실행되는 것처럼 보인다.
- 문맥 교환이 발생하는 경우
- 프로세스 A가 CPU를 할당받아 실행되다가 프로세스 B에 CPU 사용을 양보하는 경우
- 예기치 못한 상황이 발생하여 인터럽트가 발생한 경우
- 프로세스 메모리 영역
- 정적 할당 영역 : 프로세스 실행 중 크기가 변하지 않는 영역
- 코드 영역(code segment) or 텍스트 영역(text segment) : 기계어로 된 명령어 저장
- 데이터 영역(data segment) : 프로세스가 실행되는 동안 유지할 데이터 저장 (e.g. 전역 변수)
- 동적 할당 영역 : 프로세스 실행 중 크기가 변할 수 있는 영역
- 힙 영역(heap segment) : 프로그래머가 직접 할당할 수 있는 공간
- 메모리 누수(memory leak) : 메모리를 할당받은 뒤 반환하지 않아 메모리가 낭비되는 현상
- 힙 영역에 메모리 공간을 할당받은 뒤 사용이 끝나면 반드시 반환하여 운영체제에게 해당 메모리 공간을 더 이상 사용하지 않는다고 알려줘야 함
- 스택 영역(stack segment) : 데이터를 일시적으로 저장하는 공간 (e.g. 지역 변수, 매개 변수 등)
- 힙과 스택 영역이 서로의 영역을 침범하지 않도록 메모리 할당 시 반대 방향으로 할당해 나간다.
- 스택 영역은 높은 주소에서 낮은 주소로 할당 (아래로)
- 힙 영역은 낮은 주소에서 높은 주소로 할당 (위로)
프로세스 상태와 계층 구조
- 프로세스 상태(process state)
- 생성(new) : 프로세스 생성 중인 상태
- 준비(ready) : CPU를 할당받아 실행될 준비가 된 상태
- 실행(running) : CPU를 할당받아 실행 중인 상태
- 대기(blocked) : 실행 중 입출력장치의 완료 인터럽트를 받을 때까지 대기 중인 상태
- 종료(terminated) : 프로세스가 종료된 상태
- 프로세스 계층 구조
- 프로세스 생성 기법