책읽기

[쉽게 배우는 운영체제][Part-1][Ch-1] 운영체제의 개요

pythaac 2021. 7. 16. 17:01
이 글은 "쉽게 배우는 운영체제 (조성호 지음)"을 읽고 주관적으로 작성된 글입니다.

출처 : https://www.hanbit.co.kr/store/books/look.php?p_code=B5471691739

※ 요약

  1. 운영체제의 정의
    • 사용자에게 편리한 인터페이스 환경 제공
    • 컴퓨터 자원을 효율적으로 관리하는 소프트웨어
  2. 운영체제의 역할/목표
    • 자원관리 -> 효율성
    • 자원 보호 -> 안전성
    • 하드웨어 인터페이스 제공 -> 확장성
    • 사용자 인터페이스 제공 -> 편리성
  3. 운영체제 구성
    • 커널
      - 핵심 기능
    • 인터페이스
      - 사용자의 명령을 커널에게
      - 커널의 결과를 사용자에게
  4. 커널의 종류
    • 단일형(Monolithic)
      - 모듈이 구분 없이 구성
    • 계층형(Layered)
      - 비슷한 가진 모듈로 계층을 이루고, 그 계층의 통신으로 구성
    • 마이크로(Micro)
      - 기본적인 기능만 제공하고, 사용자 영역에서 모듈 구현

 

1. 운영체제 소개

1) 일상생활 속의 운영체제

  • 디바이스의 운영체제 유무 차이
    • 디바이스에는 운영체제가 있을수도, 없을수도 있음
    • 임베디드 시스템도 운영체제가 있을 수 있음
    • 운영체제가 있는 디바이스의 차이는 기능 추가(Programmable)

2) 운영체제의 필요성

  • 컴퓨터 환경에서 사용 규칙이 필요해짐
    • 메모리, CPU 등 성능 향상에 따라 여러 작업을 동시에 함으로써 사용 규칙이 요구됨
    • 복잡한 작업 환경에서 규칙이 없는 기계는 고장날 수 있음

3) 운영체제의 정의

  • 사용자에게 편리하고 안전한 인터페이스 환경 제공
  • 컴퓨터 시스템 자원을 효율적으로 관리

4) 운영체제의 역할

  • 자원관리
    • 자원을 응용프로그램에게 나누어줌
    • 적당한 순서로 자원을 배분/회수
  • 자원보호
    • 악의적 또는 미숙함에 의해 다른 프로그램 영역을 침범하거나 망가뜨리지 않도록 보호
  • 하드웨어 인터페이스 제공
    • CPU, 메모리, 마우스, 키보드 등 다양한 하드웨어를 복잡한 과정 없이 사용할 수 있도록 인터페이스 제공
  • 사용자 인터페이스 제공
    • GUI, 터치스크린 등 운영체제를 편리하게 사용할 수 있도록 기능 제공

5) 운영체제의 목표

  • 자원관리 -> 효율성
    • 적은 자원으로 많은 작업량을 처리하는 것
  • 자원보호 -> 안전성
    • 사용자 / 응용프로그램의 안전 문제 처리
    • 하드웨어 보안문제 처리
    • 시스템 문제시 복구하는 결함 포용(fault tolerant) 기능
  • 하드웨어 인터페이스 제공 -> 확장성
    • 시스템 자원의 추가/제거가 편리하도록 지원
    • 플러그 앤 플레이 (plug & play)
  • 사용자 인터페이스 제공 -> 편리성
    • 사용자가 편리하게 작업할 수 있는 환경을 제공
    • 편리성을 위해 효율성이 떨어질 수 있음

 

2. 운영체제의 역사

1) 개요

  • 운영체제의 역사를 보는 것은 운영체제를 이해하는 좋은 방법
    • 현재 운영체제의 기능이 어떻게 만들어졌는지?
    • P2P, 클라우트 컴퓨팅 환경이 왜 등장하게 되었는지?

2) 시스템 변화 (축약)

1 1940년대   진공관(0과1) 사용 프로그램 실행마다 전선을 다시 연결
2 1950년대 카드 리더, 라인 프린터 일괄 작업 시스템
운영체제 등장
-> 프로그램을 바꿀시 카드만 교체
but 실행 중간에 데이터 입출력 불가능
3 1960년대 초반 키보드, 모니터 대화형 시스템 -> 키보드/모니터를 통해 실행중 입출력
but 작업 시간 예측이 어려움
4 1960년대 후반 C 언어 다중 프로그래밍 기술 개발
시분할 시스템
 
5 1970년대 PC 개인용 컴퓨터 등장
분산 시스템
 
6 1990년대 클라이언트/서버 시스템  
7 2000년대 스마트폰 P2P 시스템
그리드 컴퓨팅
클라우드 컴퓨팅
사물 인터넷
 
  •  초창기 컴퓨터 (1940년대)
    • 논리회로를 이용한 하드 와이어링
      - 전선을 이용한 계산
    • 다른 계산(프로그램)을 할 경우 다시 전선을 연결해야함
  • 일괄 작업 시스템 (1950년대)
    • Integrated Circuit (IC) 칩 개발
      - 진공관과 전선을 작게 구현
    • CPU와 메인메모리가 존재
    • 천공카드 리더와 라인 프린터
      - 구멍을 뚫어 프로그래밍한 천공카드를 카드리더로 읽음
      - 프린터가 결과를 출력
      - 프로그램 변경시 다른 카드를 사용
    • 그러나 모든 작업은 일괄적으로 처리됨
      - 프로그램과 데이터를 동시에 입력해야함
      - 프로그램 실행 중간에 데이터 입력/수정이 불가능
  • 대화형 시스템 (1960년대 초반)
    • 키보드/모니터 등장
    • 작업 중간에 사용자와 상호작용
      - 사용자 입력
      - 중간 결과값 출력
    • 그러나 작업 시간을 예측하기 어려움
      - 응용 프로그램의 입출력 시간
      - 사용자가 언제 반응할지
  • 시분할 시스템 (1960년대 후반)
    • 다중 프로그래밍 기술 개발
      - 한 번에 하나의 작업 수행이 낭비라 판단
      - 하나의 CPU로 여러 작업을 시분할에 기반한 동시 실행
    • 다중 사용자 시스템
      - 다중 프로그래밍으로 여러 사람이 동시에 하나의 컴퓨터에서 작업 가능
    • 그러나 다중 프로그래밍은 복잡하고 deadline이 보장되지 않음
      - 실시간 운영체제(Real-time OS)는 deadline을 보장
  •  분산 시스템 (1970년대 후반)
    • 개인용 컴퓨터와 인터넷의 보급
      - 값싸고 작은 컴퓨터를 묶어 대형 컴퓨터에 버금가는 시스템을 구성
      - 네트워크로 여러 컴퓨터가 작업을 처리하고 그 결과를 상호 교환
    • 분리된 시스템 자체의 연결을 의미하는 듯
      - [???] 이 당시에도 scale up보다 scale out에 대한 관심으로 분산 시스템에 개발되었는지?
  • 클라이언트/서버 시스템 (1990년대 ~ 현재)
    • 분산 시스템에서 모든 컴퓨터의 지위가 동일할 경우 문제 발생
      - 컴퓨터 고장 or 추가 작업 분배
    • 작업을 요청하는 클라이언트 / 요청을 받아 응답하는 서버로 나눔
    • 그러나 서버에만 요청이 집중되어 서버 과부하를 일으킴
  • P2P 시스템 (2000년대 초반 ~ 현재)
    • 서버 과부하를 줄이기 위해 서버의 역할을 줄인 시스템
    • 각 사용자(Peer)는 각각 클라이언트/서버 역할을 모두 함
    • Broker 서버는 Peer끼리 연결해주고, 실제 통신은 Peer끼리함
      (ex. 파일 검색은 서버가 해주고, 실제 파일 전송은 Peer끼리함)
  • 기타 컴퓨팅 환경 (2000년대 초반 ~ 현재)
    • 그리드 컴퓨팅
      - 필요한 컴퓨팅 자원을 구매하여 사용하는 환경
      - 분산 시스템의 한 분야로, 대용량 컴퓨터 pool에서 원격 연결을 통해 대용량 연산 수행
      - 그리드 딜리버리 : 웹 하드에서 영상을 받으려하면 이전에 내려받은 컴퓨터로부터 몰래 데이터를 빼서 전달
    • SaaS(Software as a Service) 
      - 그리드 컴퓨팅는 하드웨어적 컴퓨터 통합환경
      - 사용자가 필요한 소프트웨어 기능을 이용하고 그만큼 비용을 지불
    • 클라우드 컴퓨팅
      - 언제 어디서나 응용 프로그램과 데이터를 자유롭게 사용할 수 있는 환경
      - 그리드 컴퓨팅과 SaaS를 합쳐놓은 형태
    • 사물 인터넷

 

3. 운영체제의 구조

  • 컴퓨터 시스템의 구조

1) 커널과 인터페이스

  • 운영체제의 구조
    • 크게 커널과 인터페이스로 나뉨
    • 인터페이스 : 사용자 / 응용 프로그램에 인접
    • 커널 : 핵심 기능
  • 커널과 인터페이스 정의
    • 커널
      - 운영체제의 핵심적인 기능을 모아놓은 것
      - 프로세스 관리, 메모리 관리, 저장장치 관리
    • 인터페이스
      - 커널에 사용자 명령을 전달하고 실행 결과를 사용자에게 알려주는 역할
      - 자동차의 핸들/브레이크와 계기판
  • 커널과 인터페이스는 분리 가능
    • 유닉스 커널을 사용하는 사용자 인터페이스 shell (csh, tsh, bash 등)
    • 유닉스 커널을 사용하는 사용자 인터페이스 Mac OS X

2) 시스템 호출과 디바이스 드라이버

  • 시스템 호출
    • 자원을 보호하기 위해 만든 인터페이스
    • 사용자는 시스템 호출을 통해 자원에 접근할 수 있음
    • 다른 방법으로 커널에 들어오지 못하게 하여 자원을 보호
    • 사용자가 자발적으로 커널 영역에 진입할 수 있는 유일한 수단
  • API와 SDK
    • Application Programming Interface
      - 응용 프로그램이 자신과 연관된 프로그램을 만들 수 있도록 제공
      - 운영체제의 API를 시스템 호출로 정의 가능 (API가 더 큰 개념)
    • System Developer's Kit
      - 프로그램 개발자를 위해 API / API 사용 메뉴얼 / 각종 개발용 응용프로그램을 하나로 묶어 배포하는 개발 툴
      - Android Studio
  • 드라이버
    • 커널과 하드웨어의 인터페이스
    • 디바이스 드라이버
      - 커널은 입출력의 기본적인 부분만 제작하여, 하드웨어 제작자에게 전달
      - 하드웨어 제작자가 하드웨어의 특성을 반영하여 만든 소프트웨어
    • 커널에 포함된 디바이스 드라이버
      - 마우스/키보드 같은 복잡하지 않은 디바이스 드라이버는 커널에 포함되어 꽂기만 해도 동작
    • 커널에 포함되지 않은 디바이스 드라이버
      - 그래픽카드/프린터 같이 크고 복잡한 디바이스 드라이버는 사용자가 직접 설치

3) 커널의 구성

  • 커널의 역할
    • 프로세스 관리
      - CPU 스케줄링
      - IPC
    • 메모리 관리
      - 프로세스 적재
      - 가상 메모리
    • 파일 시스템 관리
      - 데이터 쓰기/읽기 인터페이스 제공
    • 입출력 관리
      - I/O 서비스 제공
  • 커널의 종류
    1. 단일형 커널(Monolithic)
      - 모듈들이 구분 없이 하나로 구성
      - MS-DOS, VMS, 초기 Unix 등
      - 오버헤드가 적어 성능이 비교적 좋은듯
      - 복잡하여 디버깅이 어려움
    2. 계층형 커널(Layered)
      - 비슷한 기능을 가진 모듈들을 묶어서 하나의 계층을 이루고, 계층 간의 통신을 하는 형태
      - 오늘 날의 대부분 운영체제(윈도우 등)
      - Monolithic에 비해 디버깅이 쉬워짐
    3. 마이크로 커널(Micro)
      - 커널의 크기가 계속 커짐 / 필요한 하드웨어 용량이 증가 / 커널의 방대함으로 오류를 잡기 어려움
      - 가장 기본적인 기능만 제공
      - 나머지 기능은 사용자 영역(user mode)에서 직접 모듈 개발
      - 이식성이 좋고 커널이 가벼워짐

4) 가상머신

  • JVM
    • C언어는 low-level 언어로 시스템 프로그래밍에 적합함
    • 그러나 서로 다른 커널(ex. 윈도우와 유닉스)에서의 호환성이 떨어짐
    • Java의 경우, 운영체제 위에 가성머신을 만들고, 그 위에서 응용 프로그램이 동작하게 만듦
    • 따라서, 응용프로그램은 동일한 환경에서 동작하는 것처럼 보임
  • OS
    • VMware / VirtualBox와 같이 OS위에 다른 OS를 올리는 가상머신도 있음

4. [심화] 운영체제의 종류와 역사

  • 정리 생략