#1
운영체제란?
HW 위, SW와 사용자 아래 위치하여 연결하는 SW 계층
위, 아래로 알맞는 인터페이스 제공
좁은 의미 : 커널 : booting 이후 메모리에 상주하는 부분
넓은 의미 : 커널 + 시스템 유틸리티 포함
운영 체제의 목표
- 편리하게 사용할 수 있는 환경 제공
- 할당이 빠르게 교체되면서 이루어져 불편함을 느끼지 못함
- 자원을 효율적으로 관리 + 형평성 (자원 : 메모리(분할), CPU(스케줄링), I/O 등)
- 자원 관리 필요 요소
- 효율 : 주어진 자원으로 최대한 성능
- 형평 : 자원 분배를 형평성 있게
- 사용자와 OS 보호
- 리소스 관리
운영 체제의 분류
1. 동시 작업 가능 여부
- 단일 작업 Single Tasking (예전)
한 번에 하나의 작업만 처리
ex. MS-DOS
- 다중 작업 Multi Tasking (현대)
동시에 두 개 이상 처리
2. 사용자 수
➡️ 동시 접근 가능 여부
- 단일 사용자 Single User
: MS-DOS, MS-Windows
- 다중 사용자 Multi User
: UXIX, NTServer
형평 효율 중심
3. 처리 방식
- 일괄 처리 Batching Processing (현대에 별로 X)
- 작업을 모아서 한꺼번에 처리
- 작업 종료까지 결과를 모름
- Interactive X : 바로 해결, 처리 불가
ex. Punch Card
- 시분할 Time Sharing (현대에 가장 흔함, 범용적)
- CPU를 일정 시간 단위로 분할하여 사용
- #1에 비해 짧은 응답 시간
- Interactive함 : 빠르게 처리하면서 주어진 자원 최대 활용을 목적으로 함
- 사람에 특화됨
- 실시간 Realtime
- Deadline! 정해진 시간 안에 일이 반드시 종료돼야함
- 특수 목적 system에서 주로 씀 : 원자로/공장, 미사일 제어, 반도체 장비(pipe line) 등
- 시분할과 다른 점
정해진 시간 내에 결과가 꼭 나옴
- 개념 확장
- 경성 실시간 시스템 Hard realtime system : 지켜지지 않으면 문제 발생
최근 스마트폰도 이러한 OS가 필요해짐 ➡️ 네비게이션, 블랙박스 앱 (실시간성이 지켜져야 함)
- 연성 실시간 시스템 Soft realtime system : 지켜지지 않아도 괜찮지만 Deadline이 필요함
ex) 영화
몇 가지 용어
- 유사 : 컴퓨터에서 여러 작업을 동시에 수행하는 것을 뜻함
- Multitasking : CPU는 매번 한 task를 구동하지만, tasks를 시간 분할하여 할당하기 때문에 (하나가 종료되기 전, 다른 하나가 준비돼있음)
- Mutiprogramming : 메모리 강조 관점, 여러 프로그램이 메모리에 같이 올라가 있음
- Time sharing : CPU 강조 관점, 시분할
- Multiprocess
- Multiprocessor (== CPU) : 하나의 컴퓨터에 CPU가 여러개
운영 체제의 예
- 유닉스 (대용량 PC): 여러 사용자, 여러 작업에서 출발
- C언어로 작성 : OS 만드는게 어려워 특정 OS를 만들기 위해 탄생
- 높은 이식성 (Portable하다) : ❓ 기계어로 만들지 않아서 기계어에만 국한돼있지 않기에 C언어로 다시 컴파일 하면 된다.
- 최소한의 커널 구조
➡️ 핵심적인 것만 만들었기에 확장성이 용이함 : 복잡한 시스템에 맞게 확장 용이
- 프로그램 개발에 용이
- 서버 접속해서 쓸 수 있음 (서버를 위한 OS임)
- 다양한 버전
System V, FreeBSD
Linux : 누구나 자유롭게 이용 가능 ➡️ 여러 환경에서 활용 가능 : 서버, PC
- MS
1. DOS (Disk Operating System)
- 단일 작업용
- 640kb의 주 기억 장치로 HW 발전 속도가 빨라서 한계가 커졌음
- MS Windows
- 다중 작업용 GUI 기반 OS
- 풍부한 지원 SW
+a apple의 ios 같이 소형 OS 등장
운영 체제 구조
- CPU
- 어떤 작업을 할당
- 짧은 시간 간격으로 줬다 뺐다 함
- Memory
- 메모리 관리
- 한정된 메모리 쪼개는 방법
- CPU 보다 속도 느림 (이러한 간극 줄이기 위해 OS가 발전해옴)
- 적어도 CPU에서 원활히 작업하도록
- Disk
- I/O Device
- 다른 I/O와 컴퓨터 간 정보 주고받기 어떻게 할지 (Interupt)
#3
System Structure & Program Execution
컴퓨터 시스템 구조
Computer
- CPU
한 clock 마다 memory의 한 instruction을 읽고 수행함
메뉴얼대로 일하며 전체적인 통제는 OS가 한다.
- 내부
- Interrupt Line : instruction 하나 수행 후 한번 체크하는 곳
- mode bit : CPU에서 실행되는 것이 OS인지, 사용자 pg인지 구분
사용자 프로그램의 권한을 막아 OS나 다른 프로그램에 피해가 없도록하는 보호 장치
CPU가 사용자 pg으로 넘어갈 때 설정해서 넘어감
interrupt로 수행 종료 알릴 때나 Exception 발생시 H/W가 0으로 바꿔서 돌려줌
- 1 사용자 모드 : 사용자 프로그램 수행행시 ➡️ 권한에 제한이 있음
- 0 커널 모드 : OS 코드 수행시 ➡️ 모든 것을 수행 가능
- registers : 메모리보다 빠르게 정보 저장
- Memory
CPU의 작업 공간
연결 부분
- DMA controller : interrupt의 빈도를 줄여 효율적이도록 함
- 메모리를 직접 접근하는 장치. 작은 일마다 인터럽트가 발생하면 오버헤드
- 인터럽트가 많은 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용
- CPU 중재 없이 device controller가 buffer 내용을 메모리에 block 단위로 전송
- 해당 block 단위로 인터럽트 발생 ➡️ CPU가 인터럽트 당하는 빈도가 줄어 효율 올라감
- memory controller : 여러 곳에서 메모리를 동시에 접근하여 충돌시 정리하는 곳
- timer
- 정해진 시간을 할당해 시간이 끝나면 OS에게 제어권이 다시 돌아오는 interrupt 발생
- 제어권은 한번 넘어가면 뺏어올 수 없어 자동으로 돌려받기 위함
- CPU가 독점당하는 것을 보호
I/O device
- 사용자 프로그램이 하는 법 (직접 접근이 불가함)
- 시스템 콜 : OS에게 I/O 요청 - S/W interrupt
본인이 직접 interrupt을 거는 것 (CPU를 OS에게 넘겨주기 위함)
사용자 프로그램이 OS의 서비스를 받기 위해 (함수를 사용하기 위해) 커널 함수를 호출
- trap으로 인터럽트 벡터 특정 위치로 이동
- 제어권이 벡터가 가맄는 인터럽트 서비스 루틴으로 이동
- 올바른 I/O 요청인지 확인 후 수행 (OS가 확인)
- 완료시 제어권을 시스템 콜 다음 명령으로 옮김 - H/W interrupt
해당 device controller가 interrupt을 통해 요청한 작업 완료를 알림
이후로 OS가 이걸 요청한 program에게 input을 copy 해주고, CPU 돌려줌
- device controller (각 device 별로)
- 일종의 작은 CPU, 해당 장치를 관리
- CPU와의 성능 차이로 내부 동작 제어를 위해 있음
- local buffer을 가짐 : device와 I/O를 하는 부분
- I/O가 끝나면 interrupt을 하는 곳
- 세부
- device driver 장치 구동기 (S/W)
OS 코드 중 장치별 처리루틴
device 인터페이스에 맞게 접근하도록 함
- device controller 장치 제어기 (H/W)
작은 CPU
- 내부
- Disk
보조 기억 장치이지만, Input을 받고, Output을 저장해두기에 I/O 장치
인터럽트 Interrupt
당한 시점에 레지스터와 program counter을 저장 후 CPU의 제어를 인터럽트 처리 루틴에 넘김
현대 OS는 Interrupt로 구동됨
- 종류
- Interrpt 하드웨어 인터럽트 : 넓은 의미
- Trap 소프트웨어 인터럽트
- Exception : 프로그램의 오류로 발생 (ex. 0으로 나누는 연산)
- System call : 프로그램이 커널 함수 호출 시
- 용어
각 인터럽트마다 하는 일이 다르고 종류가 많음
- 인터럽트 벡터 : 해당 인터럽트 처리 루틴 주소 갖고 있음 ➡️ 일종의 table
- 인터럽트 처리 루틴 : 해당 인터럽트 처리하는 커널 함수 ➡️ OS 코드에 정의돼있음
#4
동기식 입출력과 비동기식 입출력
동기식 입출력 Synchronous I/O
I/O 요청 후 입출력 작업 하나가 완료된 후에야 제어권이 돌아가는 것
I/O 의 결과를 직접 지켜보는 것
- 구현 방법
- 1
I/O가 끝날 때까지 CPU 낭비, I/O도 하나
- 2
I/O 완료 전까지 해당 프로그램에서 CPU 뺐어서 다음 프로그램에게 줌
CPU 낭비 없이 일 계속, 다음 프로그램에서 I/O 요청 중복 가능
비동기식 입출력 Asynchronous I/O
요청 후 작업이 끝나기를 기다리지 않고 제어를 사용자 프로그램에 즉시 넘김
CPU 제어를 다시 받아 I/O와 상관없는 작업을 함
결과 확인하지 않음. I/O와 무관하게 일을 함
➡️ 두가지 모두 I/O 완료는 인터럽트로 알림
서로 다른 입출력 명령어
- 일반적인 I/O 방식
메모리 접근 instruction + I/O special instuction
- Memory Mapped I/O 방식
메모리 접근 instuction으로 모두 처리
I/O 부분도 메모리 연장 주소를 붙여서 처리한다.
저장장치 계층 구조
- Primary (Executable)
CPU가 직접 접근해 처리 가능
byte 단위로 접근 가능한 곳
- Registers
- Cache Memory : CPU와의 속도 차이를 완충하기 위함 ➡️ Cahing
- Main Memory
- Secondary
CPU 직접 접근 불가
- Magnetic Disk
- Optical Disk
- Magnetic Tape
상위 계층으로 갈 수록
- Speed ⬆️
- 단위 공간당 Cost ⬆️, so 용량 ⬇️
- 휘발성 Volatility ⬆️ : 전원이 나가면 날아간다.
프로그램의 실행 (메모리 load)
실행 파일을 file system에 저장함
후 메모리에 올라간다.
- Physical Memory
모든 것을 올리는 것은 낭비. 당장 필요한 부분만 올라가 있음
Swap area (disk의 한 부분) : 메모리공간의 한계로 연장의 의미로 있음
- 필요한 부분을 제외하고 저장함
- 휘발성이라 전원이 나가면 의미가 사라짐
- Virtual Memory : 프로그램 만의 독자적인 메모리 공간 주소 (실제로 존재 ❌ )
물리적 주소를 저장해두는 것
file system에 올라간 파일의 메모리 공간 주소
physical memory 접근시 Address Translation 필요 ➡️ 주소 변환 계층 (H/W에 존재)
- 프로세스 별 주소 공간
- stack : 함수 호출 과정시 데이터 쌓기 용도
- data : 변수 등 자료 구조
- code : 기계어
- 커널 주소 공간 : 운영체제의 목표를 지킴, 마찬가지로 함수 구조임
- code : 커널 코드
- data
- 각 프로그램 마다 자료구조 존재 ➡️ PCB
- H/W마다 자료구조 만들어 관리
- stack
사용자 프로그램 별로 커널 스택 별도로 존재함
- File System (disk) : 비휘발성용. 내용 유지됨
사용자 프로그램이 사용하는 함수
-
사용자 정의 함수 : 프로그램에서 직접 정의한 함수
-
라이브러리 함수
타인이 정의한 걸 갖다 쓴 함수
컴파일하고 실행하면 둘다 실행파일에 포함돼있음. 즉, 프로그램 주소 공간에 있음
➡️ User Mode
-
커널 함수
운영체제 프로그램 함수
이걸 호출하는 것은 시스템 콜임
커널 코드 안에 있음. 커널 주소 공간에서 실행
➡️ Kernel mode