시작하기전에
운영체제 스터디를 시작하게 되었다. 학교에서 운영체제 수업을 들었지만 한번 배운 것으로는 기억이 잘 나지 않아서 좀 더 깊게 공부하고자 정리하기로 마음먹었다. 책 없이 내가 작성한 글만으로 운영체제를 이해할 수 있게끔 글을 잘 작성하는 것이 목표다.
참고
OS 교과서로 유명한 운영체제 공룡책 한글판을 주 교재로 사용할 것이고 학교에서 실제 교과서로 썼던 "OS? Oh Yes!"책을 부교재로 사용할 것이다. 공룡책은 다양한 상황에 대한 설명이 깊게 나온다는 장점이 있고 "OS? Oh Yes!" 책은 꼭 필요한 개념을 번역체가 아닌 우리말로 쉽게 설명한다는 장점이 있다.
1장. 서론
앞으로 운영체제 책에서 다룰 내용을 전반적으로 설명한다. 운영체제를 처음 배우는 분들은 공룡책 1장 몇페이지를 넘기자마자 당황스러울 것이라고 생각한다. 앞으로의 지식을 전반적으로 설명하고 있어서 그런지 낯선 단어들이 독자가 알것이라는 전제로 등장한다. 운영체제를 처음 배우는 분들은 1장을 이해한다는 생각보다는, 앞으로 이런 내용이 나오겠구나 생각하면서 읽기만해도 도움이 될 것이라고 생각한다. 내용을 정리하면서 1장에서 배우기는 어렵다고 생각하는 것들(분산 시스템 등)은 서론 정리에서 제외하였고, 처음 배우는 분들도 접근하기 쉽게 하기 위해 부교재나 다른 자료들을 참고하였다.
운영체제가 하는 일
컴퓨터 시스템은 하드웨어, 운영체제, 응용 프로그램, 사용자로 이루어져있다.
하드웨어는 CPU, 메모리, 입출력장치 등으로 구성되어 있으며 자원을 제공한다. 응용프로그램인 웹 브라우저, 워드 프로세서 등은 사용자의 계산 문제를 해결하기 위해 자원을 어떻게 사용할지 정의한다. 운영체제는 다양한 사용자를 위해 다양한 응용 프로그램 간의 자원 사용을 제어하고 조정한다.
컴퓨터 시스템의 기본 목표는 프로그램을 실행해서 사용자의 계산 문제를 쉽게 해결하는 것이다. 그러나 하드웨어만으로는 컴퓨터의 계산능력을 활용하기 쉽지 않으므로 응용 프로그램이 개발된다. 이러한 응용 프로그램들은 입출력 장치 제어나 CPU 사용 등 자원들을 두고 경쟁하게된다. 경쟁하는 프로그램들 사이에서 자원을 제어하고 할당하는 기능은 운영체제를 통해 실현되는 것이다.
컴퓨터 시스템의 구성
프로세스
프로세스란 수행중인 프로그램(A program in execution)이다. 처리기 작업의 단위이기도 하다.
이는 디스크에 단순히 저장된 프로그램은 프로세스가 아니라는 말과 같다. 프로그램과 데이터를 기본으로 정상적인 실행을 위해 필요한 환경을 시스템으로부터 부여받은 능동적인 존재이다.
번역된 책들은 execute 와 running 모두 실행이라고 번역하는데 이는 다른 개념이다.
excute 중인 프로그램을 프로세스라고 한다
running 프로세스는 CPU에 의해 작업 중인 프로세스이다
프로세스라고 해서 항상 running인 것은 아니며 인터럽트나 트랩에 의해 대기상태나 보류상태가 된다.
헷갈릴 여지가 다분하기 때문에 excute를 수행이라고 번역하였다
커널
운영체제의 프로그램은 커널인 프로그램과 커널이 아닌 프로그램으로 나뉜다.
커널은 운영체제의 핵심이며 메모리 상주 프로그램이라고 불리기도 한다. 왜 커널을 메모리에 상주시킬까? 폰 노이만 구조에 따라 메모리에 적재된 프로그램만 실행할 수 있는데 이는 운영체제 프로그램도 마찬가지라 운영체제 프로그램 또한 메모리에 적재되어 있어야한다. 운영체제 중에서 빈번히 그리고 빨리 실행되어야할 프로그램을 디스크에 두었을 경우 이들이 실행될 때마다 디스크와 메모리 사이의 입출력이 잦아지게 되어 시스템의 성능이 매우 떨어지게 된다.
하지만 운영체제의 모든 프로그램을 메모리에 적재하면 그만큼 활용할 수 있는 메모리 공간이 작아진다.
메모리를 최대로 활용하기 위해 운영체제 중 빈번하게 쓰이는 프로그램들을 메모리에 상주시키는데 이를 커널이라고 한다.
인터럽트
인터럽트는 각 자원들이 능동적으로 자신의 상태변화를 CPU에게 알리는 방식이다. CPU가 인터럽트 신호를 받으면 현재 명령어 실행을 마친 후 하던 일을 중단하고 인터럽트를 처리하는 루틴을 실행한다. 이 루틴은 인터럽트 핸들러를 통해 인터럽트가 일어나게한다. 인터럽트가 끝난 후에는 기존에 처리하던 프로그램을 다시 실행해야하기 때문에 인터럽트를 처리하기 전에 기존 프로그램의 상태 및 정보를 시스템 스택에 저장한다. 인터럽트는 마스킹가능 인터럽트와 마스킹불가능 인터럽트로 나뉜다. 중요한 명령들을 실행하는 중에는 마스킹불가능 인터럽트가 무시될 수 있다. 또한 인터럽트에 우선순위를 두어 중요한 인터럽트부터 처리할 수 있다.
저장장치 구조
•
레지스터
프로세서 내에서 데이터를 보관하는 아주 빠른 저장장치이다. 일반적으로 현재 계산중인 값을 저장하는데에 쓰인다.
•
캐시
레지스터와 메인메모리 사이에 존재하는 빠른 저장장치로, 메모리에서 자주 쓰이는 데이터를 복사하여 빠른 접근을 보장한다.
•
메인 메모리 (RAM, 메모리)
폰 노이만 구조에 따라 프로그램이 실행되기 위해서 올라와야하는 저장장치이다.
CPU가 접근할수 있는 유일한 대량 메모리다.
휘발성 저장장치이기 때문에 전원이 꺼지면 저장할 수 없다.
•
보조 저장장치 (2차 저장장치)
메인메모리보다 용량이 크고 비휘발성인 저장장치이다. 하드 디스크 드라이브(HDD)와 비휘발성메모리(NVM)가 있다.
•
3차 저장장치
2차 저장장치보다 더 용량이 크고 느린 저장장치이다. 자기 테이프, 광학 디스크 등이 있다.
•
부트스트랩 프로그램
메모리는 휘발성이므로 전원이 꺼져있을 때는 커널 또한 디스크에 저장되어있을 것이다. 그렇다면 누가 커널을 메모리에 올려서 실행시켜줄까? 이때 동원되는 것이 부트스트랩 프로그램이다. 부트스트랩 프로그램은 비휘발성 저장장치인 EEPROM이나 ROM에 저장되어있다.
위 저장장치들은 계층구조에 따라 빠를 수록 비싸고 용량이 작으며 느릴 수록 싸고 용량이 크다.
입출력 구조
짧은 입출력 마다 인터럽트가 발생하면 CPU가 입출력 처리에 많은 시간을 할애하게 되어 오버헤드를 유발할 수 있다. 이 문제를 해결하기 위해 직접 메모리 엑세스(DMA)가 사용된다. 장치제어기는 CPU의 개입 없이 메모리로부터 자신의 버퍼로 혹은 버퍼로부터 메모리로 데이터블록 전체를 전송한다. 한 바이트마다 인터럽트가 발생하는 것이 아니라 블록 전송이 완료될 때마다 인터럽트가 발생한다. 장치 컨트롤러가 전송 작업을 수행하고 있는 동안 CPU는 다른 작업을 수행할 수 있다.
컴퓨터 시스템 구조
컴퓨터 시스템 구성요소의 정의
CPU - 명령을 실행하는 하드웨어
프로세서(Processor) - 하나 이상의 CPU를 포함하는 물리적 칩
코어(core) - CPU의 기본 계산 단위
다중 코어(multicore) - 동일한 CPU에 여러 코어를 포함함
다중 처리기(multiprocessor) - 여러 프로세서를 포함함
운영체제의 작동
다중 프로그래밍 (Multiprogramming)
수행 중인 프로그램을 프로세스라고 한다. 다중 프로그래밍에서 운영체제는 여러 프로세스들을 메모리에 동시에 유지시킨다. 운영체제는 이 중 하나를 선택하여 CPU가 실행하게 하는데 실행되는 프로그램이 입출력 처리나 시간 초과 등으로 인해 CPU를 사용하지 못하게 되는 경우가 있다. 이때 운영체제는 다른 프로세스를 실행하여 여러 프로그램이 병행적(병렬과는 다르다)으로 실행되게 한다. 사용자는 단일 처리기를 사용하더라도 다중 프로그래밍을 통해 여러개의 프로그램들이 동시에 실행되고 있는 것처럼 느끼게 된다.
다중처리(Multiproccessing)와는 다른 개념이다.
다중처리는 여러개의 처리기로 병렬적으로 프로세스를 실행하는 것을 말한다.
이중모드와 다중모드
•
이중모드
운영체제와 사용자는 하드웨어 및 소프트웨어 자원을 공유한다. 따라서 사용자 프로그램이 실행될 때 잘못된 영역에 접근할 가능성이 있는데, 특히 운영체제가 있는 영역에서 뭔가를 변경시키는 것은 시스템에 치명적이다. 따라서 운영체제는 이런 접근을 막을 수 있는 방법을 제공하는데 이것이 이중모드(Dual Mode)이다. 이중모드는 커널 모드와 사용자 모드로 나뉜다. 여러 장치들을 작동시키거나 시스템에 설정되어있는 여러가지 데이터들을 조작하는 권한은 커널모드에서 실행되는 프로그램들만 가지도록한다. 유저모드에서 권한이 필요한 수행이 필요한 경우 시스템 호출(System Call)을 통해 수행할 수 있다. 즉 유저 모드로 실행 중 커널 모드로 실행해야할 일이 생기면 시스템 호출을 하게 되고 그 일은 운영체제 프로그램이 커널모드에서 실행한 다음 다시 유저모드로 복귀하게 된다.
•
다중모드
운영체제에서 모드의 개념은 두가지 이상으로 확장될 수 있다. 예를 들어 인텔 프로세서에는 4개의 모드가 있다.
타이머
운영체제는 CPU에 대한 제어를 보장받아야한다. 사용자 프로그램이 무한루프에 빠지는 등 제어가 운영체제가 복귀하지 않는 경우가 없도록 방지해야한다. 이를 위해 타이머(timer)가 사용된다. 타이머는 지정된 시간 후 인터럽트하도록 설정할 수 있다. 사용자에게 CPU 제어를 양도하기 전에, 운영체제는 타이머가 인터럽트 할 수 있도록 설정되었는지 확인한다. 타이머가 인터럽트를 발생시키면 CPU 제어는 자동으로 운영체제로 넘어간다.
자원관리
위에서 말한 것처럼 하드웨어는 자원이며 응용 프로그램은 사용자를 위해 자원을 어떻게 사용할지 정의한다. 운영체제는 프로그램들의 자원 사용을 제어하고 관리한다. 즉 운영체제는 자원관리자이다. 운영체제가 관리해야할 자원으로는 CPU, 메모리공간, 파일저장공간, I/O 장치가 있다.
프로세스 관리
프로세스들이 정상적으로 실행되기 위해서는 필요한 자원들이 확보되어야한다. 그중 가장 필수적인 자원은 CPU이다. 현대 운영체제는 다중 프로그래밍을 하도록 설계되어있기 때문에 프로세스들이 CPU를 두고 경쟁하게 된다. 운영체제는 프로세스를 관리하기 위해 다음과 같은 활동에 책임을 진다
•
사용자 프로세스와 시스템 프로세스의 생성과 제거
•
CPU에 프로세스와 스레드 스케쥴하기
•
프로세스의 일시 중지와 재수행
•
프로세스 간 동기화를 위한 기법 제공
•
프로세스 간 통신을 위한 기법 제공
메모리 관리
메인 메모리는 CPU가 접근할 수 있는 유일한 대량 메모리다. CPU 이용률과 사용자에 대한 응답속도를 높이기 위해 메모리에 여러 프로그램들을 유지해야하며, 이를 위해 운영체제는 메모리 기법을 제공한다.
•
메모리의 어느 부분이 어느 프로세스에 의해 사용중인지 추적
•
메모리 공간을 할당하고 회수
•
어떤 프로세스를 메모리에 적재하고 제거할 것인지 결정
파일 시스템 관리
컴퓨터 시스템의 편리한 사용을 위해 운영체제는 저장장치의 물리적 특성을 추상화하여 논리적인 저장 단위인 파일을 정의하여 제공한다.
•
파일의 생성 및 제거
•
디렉터리 생성 및 제거
•
파일과 디렉터리를 조작하기 위한 기본적인 지원
•
파일을 보조 저장장치로 매핑
•
안정적인 비휘발성 저장 매체에 파일을 백업
대용량 저장장치 관리
컴퓨터 시스템은 메인 메모리를 백업하기 위해 보조 저장장치를 사용한다. 대부분의 최신 컴퓨터 시스템은 HDD와 NVM 장치를 주요 온라인 저장 매체로 활용한다. 프로그램 대부분은 메모리에 적재될 때까지 이러한 장치에 저장된다. 장치들은 프로세스의 자원이자 목적지(destination)으로 쓰인다. 대용량 저장장치를 적절히 관리하기 위해 운영체제는 다음과 같은 일을 한다.
•
마운팅과 언마운팅
•
사용 가능 공간의 관리
•
저장장소 할당
•
디스크 스케줄링
•
저장장치 분할
•
보호
캐시 관리
메모리와 CPU 사이에 위치하는 캐시에 자주 접근하는 데이터를 두어 더 빨리 접근할 수 있게한다. 캐시는 비싸기 때문에 작은 크기로 설치한다. 그 때문에 한정된 크기로 설치할 수 밖에 없고 그만큼 캐시의 용량도 제한된다. 캐시에 접근했을 때 데이터가 없다면 다시 메모리에 접근해야하기 때문에 캐시가 없을 때보다 오히려 더 오랜 시간이 소요된다. 따라서 캐시의 적중률(hit ratio)를 높이는 것이 중요하다. 이를 위해 운영체제의 캐시 관리 기법에 대해 배울 것이다.
입출력 시스템 관리
입출력 장치는 CPU나 메모리 작업에 비해 속도가 훨씬 느린 작업을 수행한다. 기기간 처리속도 차이로 인해 문제가 발생하는데 이를 해결하기 위한 기법으로 버퍼링, 캐싱, 스풀링을 배울 것이다. 또한 장치 하드웨어에 대해 정확하게 알지 않아도 하드웨어의 기능을 사용하게 해주며 커널의 일부인 장치 드라이버에 대해 배울 것이다.
•
버퍼링, 캐싱, 스풀링을 포함한 메모리 관리 구성요소
•
장치 드라이버 인터페이스
•
특정 하드웨어 장치들을 위한 드라이버
마무리하며
OS를 처음 배우는 사람도 이해할 수 있도록 쉽게 쓰고자 노력했는데 생각보다 페이지가 길어져서 전부 설명할 수 없는 부분도 있었다. 2장부터는 책이 한정된 범위에서 깊게 들어가는 것 같으니 거기서 더 자세하고 깊게 설명해야겠다.
혹시 잘못된 점, 개선할 점을 발견한다면 더 좋은 글로 만들 수 있도록 댓글 부탁 드립니다. :)