이번 포스팅 부터는 운영체제를 다루어 보려고 한다. 그 첫번째 순서는 운영체제의 구조이다.
운영체제란 무엇인가? 전 세계에서 가장 많이 쓰이는 운영체제 교과서인 Abraham Silberschatz의 교재에는 다음과 같이 운영체제를 설명하고 있다.
An operating system is a program that manages a computer’s hardware. It also provides a basis for application programs and acts as an intermediary between the computer user and the computer hardware.
여기에 나와있는 것처럼 운영체제는 컴퓨터의 하드웨어를 관리하면서 하드웨어를 손쉽게 그리고 효율적으로 사용할 수 있는 abstraction을 제공하는 점을 알 수 있다. 예를 들면 CPU라는 하드웨어는 process가 관리를 하고, Memory는 address space가, Disk는 file이 관리한다고 볼 수 있을 것이다. 또한 컴퓨터 사용자와 컴퓨터 하드웨어 사이에서 중요한 역할을 하는 것을 생각할 수 있는데, 운영체제는 자원의 공유 및 분배를 위한 policy를 제공한다. 예를 들면 FIFO나 LRU같은 것들이 policy에 있을 수 있다.
운영체제에서 앞으로 자주 나올 기본적인 용어들의 정의에 대해서 한 번씩 알아보고 넘어가자. Abstraction을 나타내는 중요한 용어들이니 확실하게 기억해야 한다.
- 프로그램(Program) : 컴퓨터를 실행시키기 위한 일련의 순차적으로 작성된 명령어의 모음. 컴퓨터 시스템의 disk와 같은 secondary storage에 바이너리 형태로 저장되어 있다.
- 프로세스(Process) : 실행되고 있는 프로그램의 추상화(abstraction). Program counter, stack, data section등을 포함하고 있다.
- 주소공간(Address Space) : 프로세스가 차지하는 메모리 공간. Protection Domain(서로의 주소 공간을 침범할 수 없음)
- 파일(File) : 프로세스에서 읽고 쓸 수 있는 Persistent storage
- 포트(Port) : 컴퓨터간에 메시지를 주고 받는 communication endpoint. 여러가지 프로세스가 네트워크 안에서 섞이지 않게 만들어 준다.
운영체제에서 또 굉장히 중요한 용어가 바로 커널(kernel)이다. 커널은 운영체제의 핵심 부분이며 시스템의 모든 것을 완전하게 통제하는 기능을 한다. 커널의 역할은 크게 3가지 정도로 볼 수 있는데 1. 보안 2. 자원 관리 3. 추상화 로 나눌 수 있다.
컴퓨터 시스템에는 여러가지 구조가 있는데 프로세서의 수에 따라 싱글 프로세서와 멀티 프로세서로 나눌 수 있다.
싱글 프로세서
- 하나의 CPU가 작동한다.
- 과거에는 대부분 싱글 프로세서를 사용했다.
- 특정 목적을 가진 싱글 프로세서들도 존재한다.
멀티 프로세서
- 2개 이상의 프로세서 (패러럴 시스템, 멀티코어 시스템이라고도 불림)
- 시간당 처리할 수 있는 작업의 수가 증가한다.
- 하나의 프로세서가 멈추더라도 시스템이 느려지기는 하지만 멈추지 않는다. (시스템이 느려지지만 중지되지 않는 것을 단계별 성능 저하 (graceful degradation) 라고 부르며, 이렇게 장애를 극복하는 시스템을 Fault Tolerant (장애 허용 시스템) 이라고 부른다.)
- 멀티 프로세서의 단점은 프로그래밍단에서 멀티프로세서를 고려한 프로그래밍을 해야 한다.
- 멀티 프로세서의 종류
- 비대칭 멀티프로세싱(Asymmetric Multiprocessing, AMP) : 계층적 구조. 상위 프로세서가 하위 프로세서에게 일을 배분해서 작업함. 역할 분담을 해서 특정 코어가 특정 기능을 작동하도록 설계 한 것.
- 대칭 멀티프로세싱(Symmetric Multiprocessing, SMP) : 두 개 이상의 프로세서가 하나의 메모리를 공유하며 사용하는 아키텍처. 인텔 x86등, 현재 대부분의 멀티프로세서는 SMP를 사용
기타 다른 시스템들로는 분산 시스템, 클러스터 시스템(공동의 목적을 위해 여러 개의 시스템 네트워크를 통해 작업 수행), 임베디드 시스템(특정 목적을 위한 운영체제 및 소프트웨어가 하드웨어에 탑재된 형태의 시스템 ex 스마트폰), 리얼타임 시스템 등이 있다.
운영체제 구조
멀티 프로그래밍 (Multi-programming)
컴퓨터에는 CPU와 다양한 I/O 장치들이 있다. CPU에 들어간 프로그램이 하나밖에 없다고 가정했을 때, 프로그램이 입력 대기 상태이면 그 시간동안 CPU는 놀게 된다. 즉, CPU의 효율성이 떨어지는 것이다. 이를 해결하기 위해 메모리에 여러 개의 Job (HDD 상에 : 프로그램, 메모리 상에 : 프로세스, 이를 통틀어서 Job이라 칭함)을 저장해 두고 하나의 Job 실행 중 I/O 작업 등이 발생해서 유휴 시간이 생겼을 때, 다른 Job을 시작하면서 CPU의 효율성을 증가시킨다. 이로서 여러개의 작업(Job)을 메모리에 동시에 유지시킨다.
여기에도 단점이 있는데 User는 실행 중인 작업에 대해서는 관여할 수가 없다는 점이다. 다른 작업이 수행되기 위해서는 현재 수행되는 작업이 I/O를 해야 한다. 즉 자발적 양보(voluntary yield)에 의존하는 것이다. 의도적으로 I/O를 안 할 경우 문제가 발생할 수 있다. 또한 높은 우선순위의 작업을 먼저 처리해야 할 상황이 생길 수도 있는데 멀티 프로그래밍 안에서는 그렇게 할 수가 없다. 이 문제는 Job Scheduling으로도 해결할 수 없다.
타임 셰어링 (Time-sharing)
타임 셰어링은 멀티 프로그래밍에서 확장된 개념이다. 타임 셰어링은 멀티 태스킹(Multi-tasking)이라고 부르기도 한다. 일괄 처리 시스템에서는 하나의 프로그램이 CPU 위에 올라가면 이 작업이 끝날 때 까지는 다른 작업이 CPU를 쓸 수 없기 때문에 지연이 생긴다. 그래서 CPU가 스케줄링을 통해 작업들을 빠르게 switching 하면서 마치 동시에 프로그램이 구성되는 것처럼 느껴지게 한다. 멀티 태스킹 중에 메모리가 모자라는 경우가 생길 수 있는데, 그럴 경우 스와핑(Swapping)을 통해 프로세스를 가상 메모리(Virtual Memory)에 저장한다.
CPU의 실행 시간을 나누는 단위를 타임 슬라이스(time slice)라고 한다. 일반적으로 10ms이다. 모든 프로그램은 타임 슬라이스 동안 CPU를 점유하고 그 시간이 끝나면 CPU를 양보한다.(relinquish) 이는 여러 개의 태스크(task)들이 CPU와 같은 자원을 공유하도록 하는 방법이며 하나의 작업은 동시에 실행할 수 있는 태스크들로 나누어 질 수 있다. 예를 들면, 유닉스의 프로세스는 fork() 시스템 콜을 이용해서 여러 개의 자식 프로세스를 생성할 수 있다.
운영체제의 작동(Operating System Operations)
현대의 운영체제는 인터럽트(Inturrupt)를 기반으로 한다. 만약에 실행할 프로세스가 없으면 운영체제 역시 기다릴 것이고, 무슨 인터럽트나 트랩이 발생하면서 이벤트가 발생하는 것이다. 인터럽트는 외부 인터럽트와 내부 인터럽트로 나눌 수 있다. 외부 인터럽트는 키보드, 마우스 등과 같이 외부에 기반하여 발생하는 인터럽트이고, 내부 인터럽트는 프로그램 안에서 실행되는 인터럽트이다.
듀얼 모드(Dual Mode)
운영체제가 유저 모드(user mode)와 커널 모드(kernel mode)로 나누어서 동작하는 것을 이야기한다. 유저 어플리케이션이 운영체제의 중요한 데이터에 접근해서 변경하는 것을 하지 못하게 하기 위해서 두 가지 모드로 나눈 것이다. 유저 모드에서는 유저 어플리케이션만, 커널 모드에서는 모든 접근이 허가된다. 만약 유저 어플리케이션이 커널 모드에서만 제공되는 인스트럭션을 사용하고 싶다면? 유저 모드 프로세스에서 시스템 콜(system call)을 한다. 그러면 트랩이 발생되고, 커널 모드에서 인스트럭션을 실행한다. 커널에서 작동된 값을 다시 유저 모드로 반환시켜준다.
※시스템 콜(System Call)이란?
운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스. 프로그래밍 언어에서 지원하지 않는 기능에 대하여 운영 체제의 루틴을 호출하여 이용하는 것을 말한다.
User Mode vs Kernel Mode
- User Mode
- Kernel 모드에 비해 낮은 권한의 실행모드
- 어플리케이션이 실행되는 모드
- Privilege 명령어 실행은 불가능
- Kernel Mode
- 모든 권한을 가진 실행 모드
- 운영체제가 실행되는 모드
- Privilege 명령어 실행 및 레지스터 접근 가능
- ex. I/O 장치 제어 명령어, 메모리 관리 레지스터 CR3
참고 자료
- 고려대학교 유혁 교수님 운영체제(COSE341) 수업 자료
- <Operating System Concepts> 9th ed. by A. Silberschatz
- http://blog.naver.com/PostList.nhn?blogId=503109
'Computer Sci. > Operating System' 카테고리의 다른 글
OS #6. 동기화(Synchronization) Part1 (1) | 2020.04.01 |
---|---|
OS #5. 쓰레드 (Thread) (0) | 2020.03.24 |
OS #4. CPU 스케줄링 (CPU Scheduling) (0) | 2020.03.20 |
OS #3. 프로세스 (Process) (0) | 2019.10.17 |
OS #2. 운영체제 디자인, 커널 관점 설계 (OS Design, Kernel Arch.) (0) | 2019.10.11 |