이 글은 운영체제(2017) - (반효경 교수님) 강의를 보고 작성한 글 입니다.
운영체제란 무엇인가?
좁은 의미의 운영체제(커널)
운영체제의 핵심 부분으로, 메모리에 상주하는 부분
넓은 의미의 운영체제
커널 + 각종 주변 시스템 유틸리티를 포함한 개념
운영체제의 목적
흔히 CPU를 컴퓨터의 두뇌라고 하지만, 교수님은 운영체제가 두뇌에 가까운 것 같다고 하셨습니다.
- | CPU | 사람의 두뇌 | 운영체제 |
---|---|---|---|
연산 | O | O | O |
기억 | ▴ | O | O |
판단 | X | O | O |
교수님이 뇌와 비교하시던 내용에서 운영체제는 어떤 연산을 하는지 궁금해서 어떤 내용인지 찾아봤습니다.
- 이중연산모드(커널모드, 사용자모드)
컴퓨터 시스템의 자원을 효율적으로 관리
- CPU, Memory, IO Device 등을 효율적으로 관리
- 사용자간
형평성
있는 자원 분배 - 주어진 자원으로 최대한의 성능을 내도록
- 사용자간
- 사용자 및 운영체제 자신의 보호
- 프로세스, 파일, 메세지 등을 관리
운영체제의 분류
- 동시 작업 가능 여부
- 사용자의 수
- 작업 처리 방식
동시 작업 가능 여부
- 단일 작업(single tasking)
- 한 번에 하나의 작업만 처리
MS-DOS 프롬프트 상에서는 한 명령을 끝내기 전에 다른 명령을 수행할 수 없음
- 한 번에 하나의 작업만 처리
- 다중 작업(multi tasking)
- 동시에 두 개 이상의 작업을 처리
UNIX, MS Windows 등에서는 한 명령의 수행이 끝나기 전에 다른 명령이나 프로그램을 수행할 수 있음
- 동시에 두 개 이상의 작업을 처리
사용자의 수
- 단일 사용자(single user)
- MS-DOS, MS Windows
- 다중 사용자(multi user)
- UNIX, NT Server
작업 처리 방식
일괄처리(batch processing)
- 작업 요청의 일정량 모아서 한번에 처리
- 작업이 완전 종료될 때까지 기다려야 함
ex) 초기 Punch Card 처리 시스템
초창기에 사용하던 시스템으로, 천공카드
가 대표적인 사례 입니다.
우리에게 더 익숙한 방식으로 생각해보면, ORM 카드에 마킹을 모두 한 다음 제출하면,
1번부터 40번까지 정답을 모두 확인하며 작업 종료 후 점수를 출력하는 것과 유사합니다.
현대 운영체제에서는 이런 방식이 사용되고 있지 않다고 합니다.
시분할
- 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
- 일괄 처리 시스템에 비해 짧은 응답 시간을 가짐
ex) UNIX - interactive한 방식
한 작업이 끝날 때 까지 기다리지 않고, 일정 시간 후 다른 작업을 수행하는 방식입니다.
운영체제의 프로세스 스케줄링 방식 중 하나인 Round-Robin이 이에 해당합니다.
내부에서는 여러 작업들을 돌아가며 수행하지만 변경하는 속도가 매우 빨라서
마치 사용자가 자신이 자원을 독점적으로 상용하는 것 처럼
느끼도록 작업을 관리합니다.
실시간(Realtime OS)
- 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야 하는 실시간시스템을 위한 OS
ex) 원자로/공장 제어, 미사일 제어, 반도체 장비, 로보트 제어 - 작업이 완료되어야 하는 Dead-line이 있는것이 특징
Hard realtime system(경성 실시간 시스템)
- Dead-line이 있으며 정말로 오차가 생기면 안되는 시스템
ex) 미사일(벽을 뚫고 나서 폭발하는 스마트 미사일(정밀 타격))Soft realtime system(연성 실시간 시스템)
- Dead-line이 있지만, 오차가 생겨도 큰 문제가 발생하지는 않는 시스테
- ex) 동영상 플레이어
몇가지 용어 정리
Multitasking : ???
Multiprogramming : 여러 프로그램이 메모리에 올라가있음을 강조
Time sharing : CPU의 시간을 분할하여 나누어 쓴다는 의미를 강조
Multiprocess : 동시에 여러 프로세스를 실행한다는 의미
번외
- Multiprocessor : 하나의 컴퓨터에 여러 프로세서(CPU)가 있다는 의미
운영 체제의 예
UNIX
서버를 위해 만들어진 운영체제라서 동시 사용자
, 동시 작업
을 중점으로 두고 개발되었습니다.
- 코드의 대부분을 C언어로 작성
- 원래 어셈블리로 코딩을 했었는데, 기계어에 더 가까운 언어라 사람이 읽고 쓰기가 어려웠습니다.
그래서 사람이 알아보기 쉬운 형태의 언어를 만들었는데, 이것이 C언어 입니다.
이렇게 만들어진 C언어로 UNIX가 만들어졌습니다.
- 원래 어셈블리로 코딩을 했었는데, 기계어에 더 가까운 언어라 사람이 읽고 쓰기가 어려웠습니다.
- 높은 이식성
- 최소한의 커널 구조
- 복잡한 시스템에 맞게 확장 용이
- 소스 코드 공개
- 처음에는 소스코드가 공개된 운영체제였습니다.
하지만 점차 다양한 버전의 UNIX가 등장하며 크게 두 가지로 나뉘게 되었습니다. - 다양한 버전
- System V 계열(상업적) : IBM AIX, HP-UX, Solaris
- BSD 계열(주로 비영리) : FreeBSD, OpenBSD, SunOS, Max OS X, GNU/Linux
- 처음에는 소스코드가 공개된 운영체제였습니다.
- 프로그램 개발에 용이
DOS(Disk Operating System)
- MS에서 1981년 IBM-PC(개인용 컴퓨터)를 위해 개발하였음
- 단일 작업, 단일 사용자용 운영체제였음
- CPU 스케줄링, 메모리 관리 등이 필요없었음
MS Windows
- 다중 작업용 GUI 기반 운영 체제
- Plug and Play
- 네트워크 환경 강화
- DOS용 응용 프로그램과 호환성 제공
- 불안정성
- 풍부한 지원 소프트웨어
단일 작업 운영체제로 설계되었던 DOS에서 발전한 운영체제라, 초기 버전에는 버그가 많았다고 합니다.
Handheld device를 위한 OS
- PalmOS
- Pocket PC(WinCE)
- Tiny OS
운영체제의 구조
컴퓨터 시스템 구조
인터럽트(Interrupt)
인터럽트는 라인을 세팅하는 주체가 누구인지에 따라 두 가지로 나눌 수 있습니다.
- 하드웨어 인터럽트(Interrupt)
하드웨어가 발생시킨 인터럽트
ex) 타이머, 키보드 입력, 네트워크를 통해 버퍼에 패킷 도착 - 소프트웨어 인터럽트(Trap)
소프트웨어가 발생시킨 인터럽트- Exception : 프로그램이 오류를 범한 경우
- System call : 프로그램이 커널 함수를 호출하는 경우(mode bit 변경됨)
프로그램이 실행되며 시스템콜을 호출하거나 주변 장치와의 상호작용을 통해 Interrupt
가 발생합니다.
이 시점에 운영체제가 개입하여 ISR(인터럽트 처리 루틴)
을 실행하거나, 주변 장치와 IO를 수행합니다.
운영체제가 이런 구조로 되어있기 때문에 현대 운영체제는 Interrupt
에 의해 구동된다고 봐도 무방합니다.
시스템콜(System Call)
사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것.
Mode bit
사용자 프로그램의 잘못된 수행 혹은, 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호장치가 필요합니다.
그래서 운영체제는 Mode bit을 통해 하드웨어적으로 두 가지 모드의 operation을 지원합니다.
- 1 사용자 모드 : 사용자 프로그램을 수행
- 제한된 기계어만을 실행할 수 있는 상태
- 0 모니터 모드(커널 모드, 시스템 모드)
- 시스템에 접근하는 중요한 기계어를 실행할 수 있는 상태
- 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한
특권명령
으로 규정 - Interrup나 Exception이 발생하면, 하드웨어가 mode bit을 0으로 변경함
- 사용자 프로그램에 CPU를 넘기기 전에 운영체제가 mode bit을 1로 세팅
동기 & 비동기 입출력
일단, 두 입출력 모두 완료된 경우 인터럽트가 발생한다는 것은 동일합니다.
하지만, CPU 자원이나 CPU 제어권을 어떻게 관리하는지에 따라 동기
, 비동기
로 나뉘게 됩니다.
동기식 입출력 (synchronous I/O)
I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어가는 방식입니다.
- 구현방법 1 : CPU Wait
- I/O가 끝날 때까지 CPU를 낭비시킴
- 매시점 하나의 I/O만 일어날 수 있음
CPU가 현재 I/O가 끝날 때 까지 기다리고 있기 때문
- 구현방법 2 : Process Wait
- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 뺏음
- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
- 다른 프로그램에게 CPU를 줌
비동기식 입출력 (asynchronous I/O)
I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고, 제어가 사용자 프로그램에 즉시 넘어감
DMA(Direct Memory Access)
빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용되는 장치입니다.
만약 DMA가 없으면 버퍼에 1byte 들어오면, device controller가 interrupt를 발생시키게 됩니다.
그러면 너무 잦은 인터럽트 때문에 컨텍스트 스위치가 자주일어나며 CPU를 효율적으로 사용할 수 없게 됩니다.
그러나 DMA를 통하면 CPU를 사용하지 않고, device controller 가 device 의 buffer 내용을 메모리에 block 단위로 직접 전송합니다.
512 byte 데이터 수신 시
DMA(1번 인터럽트 발생)
- 1byte가 주변기기의 buffer에 들어옴
- block 단위로 데이터를 저장(block 크기는 보통 256 or 512 byte)
- Memory에 해당 block을 저장
- DMA가 interrupt 발생시킴
DMA 미사용(512번 인터럽트 발생)
- 1byte가 주변기기의 buffer에 들어옴
- Device controller가 interrupt를 발생시킴
- 운영체제 혹은 해당 기기의 대기큐에 있던 프로세스가 CPU 제어권을 얻음
- 1byte는 buffer에서 메모리에 할당
데이터를 모두 받아올 때 까지 1~4반복
아래는 DMA Controller 가 데이터 전송 작업을 위해 사용하는 register 중 일부입니다.
SAR(Source address register)
: data를 주는쪽의 주소를 저장함DAR(Destination address register)
: data를 받는쪽의 주소를 저장함Data
: 메모리에 넣은 데이터
혹시 잘못된 내용이 있을 경우 댓글로 알려주시면 감사하겠습니다!