해당 게시글은 kocw에서 제공하는 금오공과대학교 최태영 교수님의 무료 강의를 공부하고 정리하기 위해서 만들어졌습니다.
MS-DOS
- 굉장히 간단한 초기 운영체제
- 임베디드 시스템을 만들때 아주 간단하게 로우 레벨로 만들기에 적합
- 메모리가 작은 시스템에 적합
UNIX
- 2차 세계대전 당시 컴퓨터가 나오고 암호를 해독하기 위한 시스템이 탄생
- 이후 전쟁이 끝나고 기업들이 이러한 시스템을 가져다 쓰면서 인건비를 절약하려고 함
- 가능한 모든 기능을 할 수 있는 Multics 라는 것을 개발하기 시작
- 미국 전역의 IT 연구원들을 모아서 개발하기 시작했고, 몇가지 설계 오류를 발견하여 Multics 프로젝트는 중단
- 연구원들은 철수했고, 그 중 Bell lab이라는 연구소의 원구원들이 Multics 개발 경험을 살려서 아주 작은 운영체제를 만들게 되는데, 이것이 바로 UNIX이다.
- 첫 UNIX의 기능은 아주 작은 기능만 포함
- 아주 간단한 파일 시스템
- 아주 간단한 터미널 드라이브
- cpu 스케줄ke
- 간단한 메모리 관리
- 이후 뉴스 그룹에 UNIX 개발 소식을 알려서 사람들에게 배포 시작
- berkely 주립대학교에서 UNIX를 가져와서 기능을 추가하기 시작
- Bell lab에서도 사람들이 기능을 추가하는 것을 보고 몇가지 기능을 더 추가하여 SystemV(5)를 탄생시켰다.
- 그러다 보니 운영체제에 너무나 많은 기능이 들어가게 된다.
- 크게 계층을 나누면,
- Hardware
- Kernel
- Program
- User
- 그러다 보니 크게 두 가지 문제가 생겼다.
- 기능이 너무 커지다 보니 커널에 에러가 날 가능성이 커졌고,
- 에러가 생기면 시스템이 뻗어버려서 에러 디버깅이 힘들어 졌다.
- 이러한 문제들 때문에 UNIX를 변경하려는 시도가 생겼다.
Layerd Approach
- UNIX를 하나로 두지 말고 여러 계층을 나눠서 감싼 형태로 만들자
- 제일 안쪽이 하드웨어, 그 위 디바이스 드라이버를 둠으로 안쪽 레이어를 직접 접근하지 못하도록 했다.
- 레이어를 나눔으로써 유지보수가 쉬워졌다.
- 오류가 발생하면 레이어를 하나씩 제거하면서 오류를 찾으면서 오류 검출이 쉬워졌다.
- 또한 성능 개선 시 레이어를 하나씩 제거하면서 성능 개선이 필요한 부분을 찾기가 쉬워졌다.
- 막상 구현하려다 보니 문제가 발생
- 파일 시스템은 더 빠른 읽기, 쓰기를 위해 buffer, cache를 사용하여 메모리를 사용한다.
- 자연스럽게 파일 시스템 아래에 메모리를 관리하는 형태의 구조가 생겨났다.
- 메모리를 사용하는 것은 비용이 많이 들기 때문에 swap이라는 방식을 사용하여 사용자에게 메모리를 제공
- swap은 메모리가 다 차서 더 이상 공간이 없게 되는 경우
- 현재 실행중인 프로세스 하나를 통째로 복사해서 하드디스크에 넣어두고 메모리 공간을 비운다.
- 그러고 나서 빈 메모리를 사용할 수 있게 하는 기능이다.
- 이 swap이 메모리에서 하드디스크를 접근해야 하는 상황이 발생하면서
- 파일시스템->메모리->파일시스템 순으로 순환되는 상황이 발생한다.
- 이러한 상황들이 한 두가지가 아니라서 현실적으로 레이어를 두는 것이 어려워졌다.
Microkernel
- kernel에 굳이 없어도 되는 모듈(유저 모드에서 실행해도 되는 것들)
- 파일 시스템 모듈
- 디바이스 모듈
- 네트워크 기능을 하는 모듈
- 이러한 것들을 분리하여 기능을 줄여나간 것이 Microkernel이다.
- Microkernel 형태로 만들면 좋은 점이
- 새로운 기능이 생기면 유저 모드에 추가하면 되므로 확장이 편해졌다.
- 반대로 커널에 모듈을 추가하는 것은 굉장히 어렵다.
- 에러가 발생하여 모듈이 중단되도 다른 모듈 들은 정상 동작하기 때문에 해당 모듈만 재가동 시킬 수 있다.
- 유저 모드로 침입이 발생하면 권한 체크를 하기 때문에 침입을 거르기 쉬워진다.
- 그러나 이러한 구조도 문제가 있는데,
- 모듈을 분리함 으로써 메세지 캐싱이나 시스템 콜이 세 배로 늘어나게 된다.
- 따라서 성능이 느리다.
- 이러한 단점 때문에 Microkernel의 인기가 식어갔다.
Modules
- 어떤 모듈이 다른 모듈의 리소스를 접근하기 위해서는 공개된 인터페이스를 통해서만 접근해야 한다.
- Oriented Object Programming(OOP) 개념이 들어갔다.
- 이러한 개념을 유저 모드 뿐만 아니라 커널에도 적용시킨다.
- 중앙에 커널을 동작시킬 수 있는 함수들(인터페이스)을 호출하여 동작시키면 이전 Microkernel 보다 더 빠르게 실행이 가능하다.
- 이것이 Modules라는 개념이다.
Hybrid System
- 상용화 된 운영체제는 각각의 장점을 취합한 하이브리드 시스템으로 구현되어 있다.
- 리눅스와 솔라리스는 모듈러 구조와 가깝게 구현되어 있다.
- 윈도우 같은 경우 monolithic 구조로 되어 있으면서 Microkernel 구조를 많이 따라가고 있다.
- 맥 같은 경우도 마이크로 커널 형태를 따라가고 있다.
- 모바일 디바이스에서 구동되는 운영체제 같은 경우
- ios는 mac os x의 구조를 거의 가져왔다.
- 그러나 모바일 같은 경우 사용자 인터렉션이 중요하기 때문에
- 이를 처리하기 위한 멀티 미디어 레이어를 추가하였다.
- 안드로이드는 아래에 리눅스 커널을 사용하고 있다.
- 그 위에 자바가 돌아가기 위한 virtual machine을 사용하기 위한 라이브러리가 들어있다.
operating-system debugging
- 리눅스와 솔라리스에서는 DTrace라는 것을 제공한다.