Introduction to OS

 

Evolution of OS

Phase 1 (Early ’50s ~ Mid ’60s)

  • 컴퓨터 하드웨어 가격은 고가, 인건비는 저렴

  • ENIAC = CPU(진공관) + Memory(Magnetic core) + 구동을 위한 발전 설비

    • CPU의 Utilization을 최대화가 목적, 인건비 투자는 고려대상 :heavy_multiplication_x:
  • Operating System이 존재하지 않고 Human Operator가 Operating System의 역할을 했음

    • Human Operator의 역할
      1. 사용자로 부터 Punch card 뭉텅이를 수령
      2. Punch card 뭉텅이를 컴퓨터 시스템에 Loading하고 수행
      3. 수행 결과를 프린트로 출력
      4. 출력된 결과물을 사용자에게 전달
  • Job : 프로그램을 수행시키는 기본 단위

  • 최초의 OS 등장 배경 :

    • Human Operator의 느린 Job-to-job 전환 속도로 인한 컴퓨터 시스템의 비효율성의 해결이 필요
  • Human Operator를 배재하기 위해 나타난 Batch Monitor

    • Batch of Jobs을 하나의 Tape에 기록하고, 컴퓨터시스템은 이 Tape에 있는 Job을 순차적으로 수행

    • 문제점 : CPU가 입/출력을 하고 그 입/출력이 종료될 때 까지 I/O 장치를 모니터링 해야됨.

      (그 시간에 CPU가 다른 유용한 연산을 하게 하면 더 좋겠지)

  • CPU와 I/O 연산을 중복할 수 있는 하드웨어 메커니즘 “ I/O Channel”

    • CPU는 I/O명령만 I/O Channel에 전달해주고 자기는 돌아와서 계속 다른 연산을 수행할 수 있음

    • I/O controller가 I/O 동작이 끝나면 CPU가 입력된 데이터를 읽어갈 수 있도록 I/O controller가 CPU에게 Interrupt 매커니즘을 작동을 시킴

    • I/O 동작의 종류

    • Synchronous I/O : CPU가 어떤 연산을 수행하다가 I/O를 만들었을 때 , 그 I/O의 수행이 종료되야만 다음 연산으로 수행이 될 수 있는 것

      💁🏻 문제점 : 얘는 어떻게 해결?

    • Asynchronous I/O : CPU가 어떤 연산을 수행하다가 I/O를 만들었을 때 , 그 I/O의 결과를 기다리지 않고 바로 다음 CPU연산을 해도 되는 것

      💁🏻 I/O Channel + Interrupt 매커니즘으로 해결

  • Multiprogramming : 컴퓨터 시스템이 한번에 한개 이상의 Active한 Job을 수행시킨다

    • Active한 Job : 수행을 시작했지만 아직 종료되지 않은 상태의 program
    • Degree of Multiprogramming : 현재 main memory에 존재하고 있는 Active한 Job 의 개수
  • Multiprogrammed Batch Monitor의 등장

    • Synchronous I/O일 때 다른 Job에게 CPU를 넘김으로 해서 CPU의 Utilization을 :arrow_heading_up:

    • 문제점 :

      [1] Memory Protection

      • 어떤 Job의 주소 사용 Bug로 인해 다른 Job이나 OS의 영역을 침범함으로써 문제를 일으키는 현상

      [2] Memory Relocation

      • Job이 main memory의 어느 위치에 load될 지를 알 수 없기 때문에 임의의 주소에서도 문제없이 수행될 수 있어야 함

      [3] Concurrent Programming

      • 여러 Job들이 동시에 수행되면 공유 데이터에 동시에 접근함으로써 생기는 문제를 해결할 필요성이 대두됨
    • Memory Management Unit (MMU) :

      • Memory Protection와 Memory Relocation 문제를 만족시키기 위한 하드웨어 메커니즘
      • 가상 메모리 주소를 실제 메모리 주소로 변환

      MMU_principle_updated

      Q : MMU는 하드웨어와 소프트웨어중 어떤 것으로 구현하는 것이 타당한가?

      A : MMU는 하드웨어로 구현해야됨

      MMU가 소프트웨어적으로 구성된다면 :

      1. 성능이 저하됨 : Instruction이 한번 수행 될려면 최소 1 많은면 두세번의 메모리 주소가 발생하게 됨
      2. 주소 변환을 위해 다시 주소 변환이 필요해지는 문제 발생

Phase 2 (Mid ’60s ~ Mid ’90s)

  • 하드웨어의 발전(컴퓨터 시스템이 점점 작아지고 값싸지고), 사람들의 인건비는 올라감

  • Time sharing operating system의 등장

    • CPU의 시간을 여러 사용자에게 나눠주면서 컴퓨터와 프로그래머가 Interactive하게 됨
    • 사용자 별로 File system을 설계하기 시작함
    • Response time, Protection이 중요해지기 시작함

Phase 3 (Mid ’90s ~ Present)

  • Operating System이 Internet Access가 가능하게 하는 것은 필수
  • 3C Convergence :
    • Communication, Computer, Consumter Electronics의 경계가 무너지는 현상
  • OS with multimedia support
    • 과거에는 uni-media (text)를 처리, 현대는 오디오, 동영상을 처리
    • Continuous media : 특정한 시간적 제약에 맞춰 연속적으로 처리를 해야 하는 데이터
    • Downloading :vs: Streaming :
      • Downloading : 전체 데이터를 확보한 다음에 작업을 시작할 수 있음
      • Streaming : 일부의 데이터만 확보한 상태에서 작업을 시작할 수 있음
    • 과거에는 데이터에 대한 처리가 Downloading이였는데 multimedia가 되면서 Streaming 이 중요하게 됨
    • OS의 multimedia support가 부각되며 발생한 스케줄링 방식의 변화 :
      • 중요한 일은 먼저 처리하는 우선순위 기반 스케줄링에서 Continous Media를 원활하게 처리하기 위한 Bandwidth 스케줄링으로 변화

Function of OS

  1. Coordinator : Task들의 자원 사용 충돌을 중재하는 역할

    • 운영체제가 coordinator로서 관장해야 하는 하드웨어 장치들은 어떤게 있을까?
      • CPU, IO device, Memory (+ 파일 관리, 네트워크 관리)
    • OS를 크게 5개의 부분으로 나뉠 수 있다

      KakaoTalk_20210806_141202

      • 컴퓨터 시스템 입장에서 봤을 때 Network은 I/O device의 일종인데 근데 왜 별로도로 Network system을 가지고 있지? File system이라고 하는 거는 Hard disk drive I/O를 관리하는 장치인데, 이것도 왜 I/O System에서 관리하지 않고 따로 하지?

        💁🏻 현대 Unix 계열 운영체제 시스템은 IO 장치를 크게 세 가지로 나눔 :

        IO device 특징
        Character IO device I/O의 단위가 Byte인 장치 (ex. Keyboard, mouse)
        Block IO device I/O의 단위가 Block인 장치 (ex. Hard disk)
        Network IO device Network를 제어하는 장치 (ex. Socket)

        💁🏻 이렇게 나눈 이유 : I/O 관리를 어떻게 하느냐에 따라 성능이 영향을 받음. 네트워크도 마찬가지

        • 만약 Block 과 Network IO 를 하나의 IO device가 관리하게 된다면, 빠르게 처리되는 Network data와 느리게 처리되는 Hard disk data가 같은 Queue를 사용하게 되면서 컴퓨터의 전체 성능이 저하될 수 밖에 없다.

        💁🏻 결과적으로 I/O System은 Character IO device를 관장하고, File System은 Block IO device를 관장하며, Network system은 Network IO device를 관장.

  2. Illusion Generator : OS는 자기를 사용하는 여러 사용자들이 쉽게 프로그래밍할 수 있도록 추상을 제공해야됨

    • 복잡한 걸 추상화 시켜서 사용자들이 간단히 사용할 수 있도록 추상화 레이어를 제공해주는 게 OS이다

    • 또한 OS는 하나의 유저에게만 제공하는 게 아니라, 여러 유저에게 추상화 레이어를 제공

    • 이런 추상화 레이어는 일반적으로 잘 작동하지만, 언제나 성공하는 것은 아님

      • Time-Sharing system에서 Thrashing : 사용자의 수가 어떤 Threshold를 넘어서는 순간 Response Time이 급격히 증가하는 현상
  3. Standard Library : 시스템을 관리하는데 필요한 모듈들을 제공해서 프로그래밍을 쉽게 만드는 역할

Review of Computer Hardware

Computer System Architecture

KakaoTalk_20210806_170755

  • Computer System의 가장 기본적인 구성요소 : CPU, Memory, I/O device

  • System bus : 3가지 구소 요소를 연결시키는 요소

    • 2가지 종류 :

      [1] Data Bus : 실제 Data 전송用

      [2] Address Bus : 주소 전송用

    • 기본적인 Bus operation : Read/Write

    • Bus Master : Bus transaction 시작 할 수 있는 요소

      • 대표적인 Bus Master 하드웨어들 : CPU, I/O Controller, DMA Controller 등
    • Bus Slave : 데이터를 담고있는 장치 (데이터를 담기 위해 주소도 가지고 있다)

      • 대표적인 Bus Slave 하드웨어들 : Main memory, I/O Controller안에 들어있는 Buffer memory 또는 Register
    • Bus Arbiter : Bus Master들이 서로 Bus를 장악하려고 할 때, 특정 Bus Master에게 Bus를 제공해주는 조정자

  • I/O Device Controller : CPU를 대신해서 I/O device를 관장함

    • Bus Master의 역할이 될 수 도 있고 Bus Slave의 역할이 될 수도 있고

    • I/O Device Controller의 기능 :

      • 자기 Buffer안에 데이터가 있으면 그걸 I/O Device로 출력하는 역할
      • 자기 Input Register가 비어 있으면 I/O Device에서 데이터를 읽어오는 역할

      Example. Output operation

      Screen Shot 2021-08-27 at 8.43.54 PM

    • Character I/O operation 일 때

      • Interrupt-Driven I/O : I/O 동작이 완료되면 I/O Controller가 CPU에게 비동기적으로 완료되었음을 알려주는 방식
      • Pooling I/O : I/O 동작이 완료될때까지 CPU가 반복해서 I/O Controller의 Register 상태를 확인하는 방식
    • I/O Addressing : I/O Controller안에도 여러 개의 Register들이 있기 때문에 I/O Register에 대한 Addressing

      • 구현 방법 :

        [1] Port-mapped I/O : (Ex. Intel Processor)

        ​ Port Register : I/O Controller안에 있는 Register

        ​ Memory Address space와는 별도의 Port Address space를 가지게 됨

        ​ Input/Output을 하기 위해서 별도의 명령이 필요함, 그리고 명령의 Target 주소는 Register의 주소가 됨

        [2] Memory-mapped I/O :

        ​ Main Memory의 주소공간에 일부를 할애해서 I/O Register들을 mapping하는 방법

        ​ Input/Output을 하기 위해서 별도의 명령이 필요가 없음, memory의 load/store하는 명령을 사용하면 됨

    • DMA (Direct Memory Access)

      • CPU의 개입없이 I/O Controller가 메모리에 직접 접근하여 Data를 읽거나 쓸 수 있도록 하는 기능

      • Block data를 옮길 때 CPU Intervention을 최소한으로 줄이기 위해 사용

        • Character I/O operation 일 땐 한 Character에 대한 전송이 끝나면 Interrupt를 통해 CPU에게 전달
        • DMA를 하게 되면 Block 단위로 전송이 끝나면 Interrupt를 통해 CPU에게 전달
      • 동작과정 :

        1. CPU ➡️ DMA : Sending the following information

          (read/write 명령, I/O device address, starting location in memory, block size)

        2. CPU는 다른 작업을 실행

        3. DMA transfers the entire block of data, one word at a time, directly to or from memory

        4. DMA ➡️ CPU : DMA Operation이 끝나면 interrupt

      • Block 데이터를 옮기는 방식 :

        [1] Cycle Stealing : CPU가 Bus를 사용하고 있지 않을 때만 DMA controller가 Bus를 사용하는 방식

        [2] Block Transfer : CPU와 DMA controller가 대등하게 경쟁하여 Bus를 사용하는 방식

Interrupt Mechanism

  • Hardware Interrupt :
    • CPU외부에서 CPU가 관심을 가져야될 사건이 발생하면 signaling을 통해 알려주는 것

    • 비동기적임

      Screen Shot 2021-08-29 at 3.16.43 PM

    • Interrupt의 처리 과정

      1. 현재 Instruction을 완료하고 Micro-processor의 PC값을 안전한 곳에 저장

      2. 현재 수행 중인 program을 중단

      3. Interrupt Request Number를 통해 Interrupt source를 확인

      4. Interrupt Vector Table을 검색해서 Interrupt Service Routine(Handler)의 주소를 확인하고 수행

        (Interrupt Request Number가 Interrupt Vector Table의 index로 적용을 함)

    • PIC (Programmable Interrupt Controller)

      KakaoTalk_20210809_190908

      • Micro-processor는 다양한 시스템에 사용될 수 있어서 하드웨어로 Interrupt Mechanism을 구현하면 확장성을 감당하지 못함

      • PIC Input : CPU의 Interrupt Pin에 인가되는 line 하나

      • PIC Output : 보통 Interrupt source를 위한 입력 라인을 16개 정도 가지고 있음

      • PIC를 사용함으로써, 16개의 I/O Controller들을 CPU Interrupt line에 물릴 수 있음

        :small_red_triangle: 만약 설계한 시스템의 I/O 개수가 16개보다 크면?

        Screen Shot 2021-08-29 at 3.41.41 PM

      • 동기화나 스케줄링의 이유 때문에 잠시동안 특정 Interrupt source를 disable 해야 할 경우가 있음

        💁🏻 PIC의 각 Interrupt source line마다 flag 레지스터가 존재함, CPU를 통해 flag 레지스터의 값들을 0 또는 1로 세팅할 수 있음. flag를 0으로 masking 해버리면 그 Interrupt source의 Interrupt는 꺼져버리게 되는 것. 이런 식으로 우리가 특정 인터럽트의 특성을 변형시키는 작업을 소프트웨어적으로 할 수 있음

      • PIC를 사용을 하면, 우리가 인터럽트의 확장성 문제를 해결할 수도 있고, 특정 인터럽트를 끄거나 켤 수 있는 유연한 동작을 할 수도 있음

  • Software Interrupt :
  • 현재 수행하는 프로그램에 문제가 발생했을 때, 그 문제를 해결하는 함수로 분기 하기 위해서 발생
  • Exception 같은거
  • 동기적임
  • OS는 Hardware Interrupt와 Software Interrupt를 기본으로 해서 동작하는 매커니즘을 가지고 있음

Hardware Protection

  • Protection 문제 : 어떤 Job이 자기에게 할당된 메모리가 아니라 다른 영역의 메모리를 엑세스하면 문제가 발생

  • Protection 문제 해결방법 :

    • Base Register, Bound Register 사용 (MMU에 있는 Register들)
    • 이 두 Register는 Job이 바뀔 때 마다 OS가 정확한 값으로 setting 해줘야됨
    • 이 두 Register의 Access는 오직 OS만 해야된다
  • Privileged Instruction : OS만 수행 할 수 있는 Instruction

  • Basic Mechanism : Dual mode operation

    • Micro-processor의 특정 Register(Processor Status Register)중에 있는 Mode Bit로 구분한다

      :red_circle: Kernel Mode :

      ​ Mode Bit가 0인 모드. Privilleged Instruction을 수행할 수 있는 모드

      :red_circle: User Mode :

      ​ Mode Bit가 1인 모드. User Program을 수행하는 모드. 단 Privilleged Instruction은 수행 :x:

    • Privileged Instruction 구현 방법 :

      • CPU가 fetch 한 명령을 Decoding하는 과정에서 Mode Bit를 체크함
      • 방금 읽어드린 명령이 Privilleged Instruction인데 Mode Bit == 1일 경우, soft interrupt를 발생시켜서 그 프로그램의 수행을 abort시켜야됨
    • 왜 Dual mode로 동작해야되나?

      • Computer System은 User program은 전혀 신뢰하지 :x: , 통제된 환경에서만 수행시킴
      • 그 반면에 Computer System은 Operating System은 신뢰함
    • OS가 Kernel Mode에서 수행될 때 부여받는 주요 권한

      1. Privileged Instruction을 수행시킬 수 있는 권한

      2. 모든 Memory 영역에 접근할 수 있는 권한

        (User program은 자기에게 부여받은 공간만 Memory access할 수 있음)

    • Mode Change의 통제 방법 :

      KakaoTalk_20210809_214317

      • User mode :arrow_right: Kernel Mode

        • Ex. User program을 수행하다가 I/O operation이 필요해서 I/O Register를 접근 (= 보통 Privileged Instruction 임)해야될 때

        • Interrupt을 발생시켜 하드웨어적으로 처리하면 된다

      • Kernel Mode :arrow_right: User mode

        • 이미 Kernel Mode에서 수행되고 있는 OS가 Mode Chage를 하면 됨
  • Dual mode operation을 이용해서 IO도 보호해야 하고, 메모리도 보호해야 하고, CPU도 보호 해야함

    • I/O Protection

      • 어떤 한 Job이 I/O Register를 마음대로 access해서 I/O를 독점하는 걸 막아주어야됨

      • 방법 : Port Register를 access하는 것을 모두 Privileged Instruction로 만들면됨

        (I/O에 관련된 모든 함수들은 Kernel 내부로 들어가야된다는 의미)

    • Memory Protection

      • MMU에 있는 Register들을 통제하는 것
      • 주로 Memory가 다른 Job에 의해서 corrupt되지 않게 막는 것
    • CPU Protection

      • 어떤 한 Job이 CPU을 독점하는 걸 막아주어야됨

      • 방법 : 해당 Job에게 허용한 만큼의 시간을 타이머로 세팅. 타이머가 종료가 되면, 인터럽트가 발생. 인터럽트가 발생해 Mode 변경이 일어나면 운영체제가 제어권을 확보하게 되고, 그 프로그램이 더 이상 독점하지 않도록 빼놓을 수가 있음.

      • Counter register를 access하는 것도 Privileged Instruction이 됨


《Reference》

  1. SNUON Youtube