학습 목표
•
운영체제가 무엇인지 이해한다
•
개발자가 운영체제를 알야하는 이유를 알아본다
•
커널이 무엇인지 학습한다
•
시스템 호출과 이중 모드에 대해 이해한다
•
운영체제가 제공하는 핵심 서비스의 종류를 학습한다
운영체제를 알아야 하는 이유
운영체제란
•
모든 프로그램은 하드웨어를 필요로 함
◦
1+2 계산하는 프로그램 → CPU, 하드 디스크 등등 필요
•
프로그램 실행에 마땅히 필요한 요소 → 시스템 자원, 줄여서 자원
•
지금까지 배운 CPU, 메모리, 보조기억장치, 입출력장치 → 모두 “자원”
•
운영체제 (Operating System)
◦
실행할 프로그램에 필요한 자원을 할당하고,
◦
프로그램이 올바르게 실행되도록 돕는 특별한 프로그램
•
프로그램은 항상 메모리에 적재되어야 한다
•
운영체제도 프로그램이니 메모리에 적재되어야 한다
•
운영체제는 매우 특별한 프로그램이기 때문에 컴퓨터가 부팅될 때 메모리 내 특별한 공간에 적재된다
◦
메모리 내 특별한 공간: 커널 영역 (Kernel space)
◦
커널 영역을 제외한 영역 = 사용자 영역(User space)
•
응용프로그램이 사용자 영역에 메모리를 할당 받았다
◦
누가 겹치지 않게 잘 할당 해줄까? → 운영체제
•
또한 각각의 프로그램이 실행되려면 반드시 CPU가 필요하다
◦
어떤 프로그램부터 CPU를 사용하게 할까?
◦
얼마나 오래 CPU를 사용하게 할까?
◦
한 프로그램의 CPU 독점을 막고 공정하게 CPU 자원을 할당
→ 모두 운영체제가 해결
•
두 응용 프로그램이 동시에 프린터를 사용하려는 상황
◦
운영체제가 동시 사용을 막고 대기시킴 → 프린터라는 자원을 관리
운영체제를 알아야 하는 이유
→ 문제 해결의 실마리를 얻기 위해서
•
개발자가 접하는 대부분의 오류 메세지의 근원은 운영체제이다
•
소스코드를 하드웨어가 제대로 실행하지 못하면 운영체제가 메세지를 띄워준다
운영체제의 큰 그림
커널, 이중모드, 시스템 호출, 운영체제 서비스
•
운영체제
◦
사용자를 위한 프로그램 X
◦
사용자가 실행하는 프로그램을 위한 프로그램 O
커널
•
운영체제 ← 현존하는 프로그램 중 가장 큰 프로그램 중 하나
◦
리눅스: 천만 줄 이상
•
운영체제가 응용프로그램에 제공하는 서비스 중 핵심
◦
자원에 접근하고 조작하는 기능
◦
프로그램이 올바르고 안전하게 실행되게 하는 기능
◦
등등의 핵심 서비스를 담당하는 부분 → 커널 (Kernel)
•
운영체제가 있는 모든 기기에 커널이 있다
•
특별히 언급 없는 한, 전공 책에서 다루는 운영제체 = 커널 이라고 봐도 무관
•
운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스
◦
대표적인 게 사용자 인터페이스(UI, User Interface)
◦
UI = GUI, CLI
◦
마우스를 쓸 수 있는 건 윈도우 운영체제가 GUI를 지원하기 때문
◦
안드로이드에서 터치할 수 있는 건 안드로이드 운영체제가 GUI를 지원하기 때문
•
이렇듯 UI는 운영체제가 제공하는 서비스지만, 컴퓨터와 상호작용하기 위한 통로일 뿐, 커널에 속한 기능은 아니다
이중 모드와 시스템 호출
•
운영체제는 사용자가 실행하는 응용프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원 보호
•
응용프로그램이 CPU, 메모리, 하드 등에 마음대로 접근하여 조작한다면 자원이 무질서하게 관리될 것
•
그래서 운영체제는 자신을 통해서만 접근하도록
•
운영체제에 도움을 요청한다
= 운영체제 코드를 실행하려고 한다
•
ex) 응용 프로그램 → 하드 디스크에 데이터 저장
◦
응용 프로그램 → 운영체제
◦
운영체제 → 커널 내의 하드 디스크에 데이터를 저장하는 코드 실행
•
이러한 작업은 이중 모드로써 구현
•
이중 모드, Dual Mode
◦
CPU가 명령어를 실행하는 모드를 크게 사용자 모드 + 커널 모드로 구분하는 방식
◦
CPU는 명령어를 사용자 모드로써 실행할 수 있고, 커널 모드로써 실행할 수 있다
사용자 모드
User Mode
•
운영체제 서비스를 제공받을 수 없는 실행 모드
•
즉, 커널 영역의 코드를 실행할 수 없는 모드
•
일반적인 응용프로그램은 기본적으로 사용자 모드로 실행
•
이 때 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다
•
사용자 모드 → 자원에 접근 불가
커널 모드
Kernel Mode
•
운영체제 서비스를 제공받을 수 있는 실행 모드
•
커널 영역의 코드를 실행할 수 있는 모드
•
CPU가 커널 모드로 실행될 때 자원 접근을 비롯한 모든 명령어 실행 가능
•
운영체제는 커널 모드로 실행
•
사용자 모드로 실행중인 프로그램이 자원에 접근하려고 한다면?
◦
운영체제 서비스를 받아야함
◦
운영체제에 요청을 보내 커널 모드로 전환돼야 한다
◦
여기서 운영체제 서비스를 제공받기 위한 요청 = 시스템 콜
•
시스템 호출, System Call
◦
사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다
•
시스템 호출은 일종의 인터럽트다 (소프트웨어적 인터럽트)
◦
소프트웨어적 인터럽트: 특정 명령어에 의해 발생하는 인터럽트 ( 입출력 장치에 의해 발생)
•
그래서 시스템 호출 처리 순서는 인터럽트 처리 순서와 동일
◦
시스템 콜 → CPU가 하던 거 백업 → 커널 영역 내에 시스템 콜 실행 코드(인터럽트 서비스 루틴) 실행 → 기존 응용 프로그램으로 복귀
◦
ex) 응용프로그램 → 디스크에 데이터 저장
운영체제의 핵심 서비스
프로세스 관리
•
프로세스 = 실행 중인 프로그램
•
일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행 가능
→ 조금씩 번갈아 가면서 실행
•
입출력장치를 주로 사용하는 프로세스, CPU만 사용하는 프로세스, 당장 실행 가능한 프로세스, 불가능한 프로세스 … 다양하다 → 운영체제가 일목요연하게 잘 관리, 실행할 수 있어야 한다
•
추가로, 여러 프로세스가 실행되는 환경 → 프로세스 동기화가 필수적
◦
프로세스가 아무것도 못 하는 교착상태를 해결해야 한다
자원 접근 및 할당
•
모든 프로세스는 실행을 위해 자원을 필요로 한다
•
운영체제는 프로세스들이 사용할 자원에 접근하고 조작 → 프로세스에 필요한 자원 할당해줌
•
운영체제가 어떻게 4가지 핵심 부품을 관리해 줄까
◦
CPU, 메모리, (보조기억장치와) 입출력장치
CPU
•
일반적으로 메모리에 여러 프로세스가 적재
•
하나이 CPU는 한 번에 하나의 프로세스 실행
•
그래서 실행중이지 않은 프로세스는 기다려야
→ 그래서 CPU 스케줄링이 필요하다
메모리
•
메모리에 적재된 프로세스들은 크기, 주소가 가지 각색이다
•
같은 프로세스라도 실행될 때마다 적재되는 주소가 달라질 수 있다
•
운영체제는 새로운 프로세스가 적재될 때 어느 주소에 적재할 지 결정해야한다
◦
때로는 메모리가 꽉 차 있어서 적재할 공간이 없을 수도 있따
◦
메모리에 공간이 남아 있어도 적재 불가능한 경우도 있다
→운영체제가 프로세스에게 어떻게 메모리를 할당하는 지, 부족한 경우는 어떻게 하는지
입출력장치
•
인터럽트 서비스 루틴
◦
운영체제가 제공하는 기능
◦
커널 영역에 존재
•
입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지
•
입출력장치가 CPU에 하드웨어 인터럽트 요청 신호 보낸다 → CPU 백업 → 커널 영역의 인터럽트 서비스 루틴 실행 → ….
→ 운영체제는 인터럽트 서비스 루틴(인터럽트를 처리하는 프로그램)을 제공한다
파일 시스템 관리
•
파일 시스템 → 운영체제가 지원하는 핵심 서비스
→ 운영체제가 보조기억장치 속 데이터를 어떻게 파일과 디렉터리로 관리하는 지