1. OS의 역사
무어의 법칙
- HW의 가파른 변화 양상 - 2년마다 트랜지스터의 수가 2배 가량 빨라진다는 관측 결과(연산 능력의 매우 빠른 발달)
컴퓨터의 세대
: 진공관 → ... → ULSI(현재의 데스트탑 및 랩탑)
"손으로 직접" 코드를 넣는 구조 ~ 시분할 기법까지 발전하게 됨
1. Hand-Operated System
- 원시적 기기
- 스위치 / 플러그 보드 / 와이어링
- 기계어로 적힌 프로그램: 운영체제 X, 저장장치 X
- 펀치 카드: 프로그래밍한 카드를 통해 컴퓨터 구동
2. Mainframe
- 중앙집중형 대형 컴퓨터: 진공관보다 직접된 형태
- 배치 / 시분할 지원
2. OS의 컨셉
Batch
- 매우 단순한 OS
- 시작 작업(Job) 완료 후에야 다음 작업 수행 가능
- 펀치 카드 → 메모리 적재 → 작업 수행
- 사용자와의 상호 작용 X
- 사람이 직접 작업을 어떤 순서대로 할지 스케줄링
중간에 작업 결과를 확인할 수 없는 배치 작업
Job Swtiching Issue
- 이전 작업이 종료될 때까지 기다려야 한다.
→ 여러 프로그램을 컴퓨터에서 순차적으로 실행시키기
→ 작업 A 종료 후 바로 다음에 작업 B 자동 실행 가능!
작업 순서를 결정하는 방법(멀티 프로그래밍)이 필요함
I/O in the middle of job
- 기계적 I/O와 전기적 CPU 간의 속도 차로 인한 비효율적 구조(CPU idle time이 길어지게 됨)
→ I/O와 CPU 연산을 동시에 진행하는 스풀링(Spooling, Simultaneous peripheral operation online)
→ "버퍼"에 미리 작업을 로드할 수 있어야 함 (E.g. 프린터 버퍼에 출력할 문서가 대기 중, CPU는 다른 작업을 수행 가능)
→ 비동기적 I/O + 연산에는 적합한 스풀링은 "동기적" 작업에 적합하지 않음(인쇄 도중 작업을 읽어야 하거나 수정이 필요한 의존적 상황이 일어날 때)
Multiprogramming
- 2개 이상의 작업을 '동시'에 실행 → 실제로 작업 A와 작업 B가 함께 작동하는 것이 아니라 메모리 내 같이 적재 + 수행 가능하다는 의미의 Concurrency
- CPU 활용 극대화: CPU의 idle time을 최소화(배치 방식과 차별화). 특히 특정 작업의 I/O가 필요한 시간에 다른 작업을 수행 가능
배치와는 다르게 "노는 시간"을 CPU에게 주지 말자!
- Voluntary yield에 의존적인 스위칭: 의도적으로 I/O를 요청하지 않거나 몰아서 한다면 특정 프로세스만 CPU를 사용하게 됨
- Issue of Fairness: 모든 작업이 CPU를 많이 사용하고자 함
- Priority: 긴급한 작업을 먼저 수행해야 할 수도 있음
- Context Switching: I/O가 있을 때만 yield
- Idel time 최소화
Timesharing
- CPU 실행 시간을 타임 슬라이스로 나눠서 실행하기
- 원형 큐 형태: 특정 시간동안만 CPU 점유, 사용 이후 양보(relinquish)
- 정책에 따른 스케줄링 가능: 라운드 로빈 등
- 작업 전환에 따른 오버 헤드: 응답성과 작업 속도 간의 trade-off
Multitasking
- Job(여러 개의 태스크 task로 구성) 여러 개가 CPU 자원을 공유하는 방법
- Job → 여러 개의 세부 작업으로 나누어짐 (fork를 통해 자식 프로세스 생성, DBMS 멀티태스킹-자식 프로레스는 동일한 메모리를 가지기 때문에 메모리 참조 비용이 감소 등)
- 여러 개의 프로그램이 백그라운드에서 작동
- Context Switching + Time Sharing: 멀티프로그래밍의 I/O 필요성을 시분할을 통해 극복
- Idle time 최소화 및 응답성을 최대화: 사용자의 상호 작용에 빠르게 응답할 수 있음
- 복잡한 프로그램 설계 가능 → 현재 프로그램 설계 시 사용되는 기본적인 기법
Concurrent Execution
- 세밀한 수준의 CPU 스케줄링 필요(자식 프로세스 간의 서로 다른 CPU 점유율을 조정하기 위함)
- 타임 슬라이스 간격이 매우 작기 때문
Orderly Execution
Memory Handling
3. 다양한 OS
- Linux의 오픈 소스화
- 개발 방법론의 변화 (Closed - Open)
- 클라우드 컴퓨팅: 추상화된 컴퓨팅 자원을 제공하는 방법 - VM과 컨테이너
이미 가장 "핫"해진 컴퓨팅 기법 중 하나인 클라우드. 넷플릭스와 AWS, 드롭박스
- 서버 가상화: 하이퍼바이저(VMM, HW 위의 가상의 OS) + 가상머신(서버 가상화 환경의 실행 단위, 독립적인 OS같은 역할, 게스트 OS가 동시에 동작 가능, 하이퍼바이저를 통해 장치 접근)
- 컨테이너 가상화: 서버 가상화의 비효율성을 극복하기 위한 방법. 하나의 OS를 공유, 게스트 OS가 존재하지 않음. 컨테이너(실행 단위, 사용자 프로세스, 독립 파일 시스템 및 라이브러리, 직접적인 장치 접근 가능) + 컨테이너 엔진(호스트 OS를 활용해 컨테이너 관리, Docker 등)
→ 프로세스로 나뉘게 된다면 의존성 이슈가 생길 수 있기 때문