운영체제
운영체제란 무엇인가?
컴퓨터 하드웨어 바로 위에 설치되어 사용자 및 다른 모든 소프트웨어와 하드웨어를 연결하는 소프트웨어 계층
- 협의의 운영체제(커널) → 전공자 입장
- 운영체제의 핵심 부분으로 메모리에 상주하는 부분
- 광의의 운영체제
- 커널 뿐 아니라 각종 주변 시스템 유틸리티를 포함한 개념
운영 체제의 목적
- 하드웨어를 효율적 관리 (컴퓨터 시스템의 자원을 효율적으로 관리)
- 프로세서, 기억장치, 입출력 장치 등의 효율적 관리
- 사용자 간의 형평성 있는 자원 분배 (형평성)
- 주어진 자원으로 최대한 성능을 내기 (효율성)
- 사용자 및 운영체제 자신의 보호
- 프로세스, 파일, 메시지 (SW 자원) 등 관리
- 프로세서, 기억장치, 입출력 장치 등의 효율적 관리
- 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공
- 운영체제는 동시 사용자/프로그램들이 각각 독자적 컴퓨터에서 수행되는 것 같은 환상을 제공
- 하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행
운영 체제의 분류
동시 작업 가능 여부
- 단일 작업: 한 번에 하나의 작업만 처리 ex. MS-DOS 프롬프트
- 다중작업: 동시에 두 개 이상의 작업 처리 ex. UNIX, Windows, MS → 현대 운영체제 ★
사용자의 수
- 단일 사용자 ex. MS-DOS, MS Windows
- 다중 사용자 ex. UNIX, NT server ★
처리 방식
- 일괄 처리(batch processing)
- 작업 요청의 일정량을 모아서 한꺼번에 처리
- 작업이 완전 종료될 때까지 기다려야 함
- 시분할 ★
- 여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용
- 일괄 처리 시스템에 비해 짧은 응답 시간을 가짐 ex. UNIX
- Interactive한 방식 (작업 후 바로 화면에 나오는)
- 실시간
- 정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야하는 실시간 시스템을 위한 OS
→ 실시간 시스템의 개념 확장
- Hard realtime system (경성 실시간 시스템) - 데드라인 정확히 지키지 않으면 치명적 결과 나타남
- Soft realtime system (연성 실시간 시스템) - 데드라인을 조금 어겨도 치명적인 결과가 나타나지 않음
몇 가지 용어
- Multitasking
- Multiprogramming
- Time sharing
- Multiprocess
- 구분
- 위의 용어들을 컴퓨터에서 여러 작업을 동시에 수행하는 것을 뜻한다.
- Multiprogramming은 여러 프로그램이 메모리에 올라가 있음을 강조
- Time Sharing은 CPU의 시간을 분할하여 나누어 쓴다는 의미를 강조
- (예외) Multiprocessor는 하나의 컴퓨터가 CPU가 여러 개 붙어 있음을 의미
운영 체제의 예
유닉스(UNIX)
- 대형 컴퓨터(서버)를 위해 만들어진 운영체제
- 코드의 대부분 C언어로 작성
→ 유닉스를 만들기 위해 C언어 만듦 (어셈블리 언어로 만들기는 힘들어서)
- 높은 이식성 (하나의 컴퓨터에서 돌아가는 유닉스를 다른 컴퓨터에 컴파일해서 이용하기 쉬움)
- 최소한의 커널 구조
- 복잡한 시스템에 맞게 확장 용이
- 소스 코드 공개 (가져다 쓰기 쉽고 학술적으로 사용하기 좋음)
- 프로그램 개발에 용이
- 다양한 버전
- System V, FreeBSD, SunOS, Solaris
- Linux
- 공개SW 정신에 입각해 나온 것
- 대형 및 개인용 컴퓨터에서도 활용 가
- 안드로이드 운영 체제 역시 리눅스 기반
DOS(Disk Operating System)
- MS사에서 1981년 IBM-PC를 위해 개발
- 단일 사용자용 운영체제, 메모리 관리 능력의 한계 (주 기억 장치 : 640KB)
MS Windows
- MS사의 다중 작업용 GUI 기반 운영 체제
- Plug and Play, 네트워크 환경 강화
- DOS용 응용 프로그램과 호환성 제공
- 불안정성 (초창기)
- 풍부한 지원 소프트웨어
Handheld device를 위한 OS
- PalmOS, Pocket PC (WinCE), Tiny OS
운영 체제의 구조

CPU ↔ memory ↔ Disk & I/O device
- CPU 스케줄링 (누구한테 CPU를 할당할지 - 너무 빨라서)
- 시간 차 완충
- 최대한 운영체제 활용
- 메모리 관리 (한정된 메모리를 어떻게 쪼개어 쓸지)
- CPU에서 원활하게 수용이 되도록 관리
- 과거 사용 경험을 통해 최근에 사용되지 않은 것 디스크에 쫓아내기)
- 파일 관리 (디스크에 파일을 어떻게 보관할지 - 헤드의 움직임 최소화하면서 많이 처리)
- 디스크 헤드가 움직이면서 메모리를 읽음
- 디스크 스케줄링 필요 (헤드 기준으로 스케줄링) ≒ 엘리베이터 스케줄링
- 입출력 관리 (각기 다른 입출력장치와 컴퓨터 간에 어떻게 정보를 주고 받게 할지)
- intruct 기반 (I/O장치가 CPU intruct를 걸어 요청)
- 프로세스 관리
- 프로세스의 생성과 삭제
- 자원 할당 및 반환
- 프로세스 간 협력
- 그외
- 보호 시스템
- 네트워킹
- 명령어해석기
⇒ OS 사용자 관점이 아니라 OS 개발자 관점에서 수강하기 (자신이 운영체제라고 생각하기)
컴퓨터 시스템 구조
좌측: host computer 우측: I/O device


동기식 입출력과 비동기식 입출력
동기식 입출력 (synchronous I/O)
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감
- read 작업이 자연스러움 (읽어온 다음 작업 가능)
- 구현방법 1 : 하나의 작업이 끝날때까지 기다렸다가 작업이 끝나면 다음 작업을 시작하는 방법이다.
- I/O가 끝날 때 까지 CPU 및 I/O 모두 낭비시킴
- 매시점 하나의 I/O만 일어날 수 있음
- 구현방법2 : 작업중에 오래걸리는 작업은 뒤로 미뤄두고 먼저 끝나는 작업부터 처리하는 방법이다.
- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
- I/O 처리를 기다리는 줄에 그 프로그램 줄 세움
- 다른 프로그램에게 CPU를 줌
- I/O가 끝나면 intterupt를 걸기
비동기식 입출력 (asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감
- write 작업이 자연스러움 (쓰라고 요청 후 기다리지 않고 진행
⇒ 프로세스가 입출력을 실행하지 않고 기다리면 동기식, 입출력 요청하고 바로 instruction을 실행하면 비동기식
두 경우 모두 I/O의 완료는 인터럽트로 알려줌

- I/O가 끝나면 interrupt를 걸기
DMA(Direct Memory Access)
DMA
- 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용 (CPU의 잦은 인터럽트를 막음)
- CPU의 존재 없이 device controller가 device의 buffer storage의 내용을 메모리 block 단위로 직접 전송
- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴
- device 에서 memory에 카피를 해놓고 인터럽트 한번 걸어서 I/O가 끝났다는 것을 알려주기

서로 다른 입출력 명령어
- 좌측: 일반적 방식
- 메모리 접근 instruction
- I/O를 수행하는 special instruction
- 우측: Memory Mapped I/O에 의해
- 메모리 주소에 I/O를 가리키는 연장 주소를 붙여서 접근

저장장치 계층 구조

- CPU (Primary - Executable)
→ 전원이 나가면 휘발성, CPU에서 직접 접근 및 실행 가능(바이트 단위로 접근 가능한 매체)
- Registers
- Cache Memory (SRAM으로 구성)
→ 메인메모리와 CPU의 속도 차이를 완충하기 위한 것
- Main Memory (DRAM으로 구성)
- Secondary
→ 비휘발성
- Magnetic Disk (섹터 단위로 접근하는 매체)
- Optical Disk
- Magnetic Tape
- 위로 갈수록 보통 속도가 빠른 매체(speed)가 사용
- 대신에 단위공간당 가격이 비싸기 때문에 위로갈수록 용량이 적음(cost)
- 더불어 휘발성이 크다(Volatility).
Caching: copying information into faster storage system
빠른 매체로다가 정보를 읽어들여서 쓰는 것 - 재사용 목적새로 들어오면 캐시 메모리가 적어서 기존에 있던 것을 쫓아내야 하는데 어떤 것을 쫓아내야하는 지가 캐시 메모리의 이슈
프로그램의 실행 (메모리 load)

- Disk의 File system (비휘발성의 용도)
- Virtual memory
- 0번부터 시작하는 각자 실행 파일의 독자적인 메모리 주소 공간 생성
- code: 기계어 코드
- data: 변수같은 프로그램을 사용하는 자료구조
- stack: 함수를 호출하거나 리턴할 때 데이터를 쌓았다가 꺼내가는 영역
※ 주소 변환(Address translation) - Virtual 주소에서 Physical 주소로 변경
- Physical memory
- 커널은 항상 상주
- 사용자 프로그램은 실행시키면 주소 공간이 생겼다 프로그램 종료하면 사라짐
- 주소 공간 전체를 메모리에 올려두는게 아니고 당장 필요한 부분만 메모리에 올려둠
- 메모리에서 필요 없으면 Disk의 Swap area에 내려놓음 (메모리 연장 공간 → 꺼지면 사라짐)
커널 주소 공간의 내용 (찾아보기)

사용자 프로그램이 사용하는 함수
함수
- 사용자 정의함수: 자신의 프로그램에서 정의한 함수
- 라이브러리 함수
- 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
- 자신의 프로그램의 실행 파일에 포함되어 있다.
→ 프로세스 A의 Adress space
- 커널 함수
- 운영체제 프로그램 함수
- 커널함수의 호출 = 시스템 콜
→ Kernel Address space
프로그램 실행
A의 주소공간 | Kernel의 주소공간 | A의 주소공간 | Kernel의 주소공간 |
user mode | kernel mode | user mode | kernel mode |
Program begin System call Return from kernel System call Program ends
Uploaded by
N2T