운영체제#14

LeeMir, 17 May 2021

5강 - Input/Output


I/O Devices
  • 특징 : 종류가 매우 많음
  • OS는 Device를 두가지로 나눔(Linux에는 Network Device도 존재)
    • Block Device
      • 기본 Read / Write 단위 : Block
        • 각 Block은 address를 갖고 있음
      • 하드디스크의 최소 단위 : Sector
      • 예 : 하드디스크, CD-ROM, USB
    • Character Device
      • 기본 Read / Write 단위 : Char
      • 각 char를 순차적으로 처리, address가 따로 없음
      • 예 : 마우스, 프린터, 모뎀
  • Device Controller
    • 각 I/O Device에는 Controller가 존재
    • 각 Controller에는 여러 종류의 레지스터가 존재
  • Memory-Mapped I/O
    • I/O port로 들어오는 주소와 실제 메모리 주소는 서로 별개의 주소
      • 서로 변환해줘야함
      • Hybrid 방식도 가능
  • Direct Memory Access (DMA)
    • Device Controller로 명령을 내리거나, 그 Buffer에 저장된 데이터를 메인 메모리로 옮기는 작업을 CPU가 하는 것은 손해
      • DMA controller가 그 역할을 대신함
      • CPU는 DMA controller에 명령을 내리기만 하면 됨
    • Bus Transfer Mode
      • 한번에 한 word씩 읽는 mode와 한번에 몽땅 읽는 burst mode가 존재
        • DMA가 CPU보다 메인 메모리에 우선적으로 접근할 수 있음
    • Data Transfer Method of DMA
      • Fly-by-mode
        • Device Controller에서 메인 메모리로 데이터를 바로 보내게 하는 방식
      • DMA가 중개해 Device Controller에서 DMA로, DMA에서 메인 메모리로 데이터를 보내는 방식
  • Precise and Improcise Interrupts
    • Precise Interrupt
      • 현재 실행중이던 instruction을 모두 끝마치고 interrupt가 실행되어야 함
      • 어떤 instruction도 진행중이면 안됨
  • Goal of I/O Software
    • 어떤 I/O Device라도 Program이 Access할 수 있는 방식은 같아야 함
    • Uniform Naming
    • Error Handling
    • Synchronous vs Asynchronous
      • 전자 후자 둘 다 사용
      • 많은 Device는 성능을 위해 Asynchronous하게 함
      • 프로그램 입장에서는 Syncoronous하게 보일 수 있음
      • blocked transfer vs interrupt-driven
    • Buffering
      • 고속 입출력이 필요한 Device가 아니라면 buffering을 함
      • Single buffering / Double buffering / 그 이상의 buffering을 함
    • Disk처럼 여러 개의 프로세스가 공유할 수 있는 Device가 있고, Tape Driver처럼 하나의 프로세스만 사용할 수 있는 Device가 있음
  • I/O Software Layer
    • User-level I/O software
    • Device-independent OS Software
      • 프로세스는 Device의 입출력 단위를 몰라도 자기 마음대로 입출력할 수 있어야함
    • Device drivers
    • Interrupt handlers
    • Hardware
Hard Disk
  • Disk Formatting
    • 최소 단위는 Sector
      • Sector는 Preamble - Data - ECC로 구성
    • 실질적으로 바깥쪽 Track에 Sector가 더 많고 안쪽 Track에 Sector가 적음
    • Cylinder Skew
      • Track 별로 0번 Sector가 시작하는 위치가 다름(동선 효율을 따진 결과)
    • interleaving
      • data transfer하는 시간 때문에 읽지 못한 Sector를 지나칠 것을 고려해 Sector를 배치
      • 지금은 사용하지 않는 방식
  • Disk Arm Scheduling Algorithms
    • Read/Write Time Factors
      • Seek time
      • Rotational Delay
      • Actual Data Transfer Time
    • Seek Time이 가장 지배적임
    • FIFO
      • 요청 순서에 따라서 순차적으로 Header를 움직임
    • Shortest Service Time First(SSTF)
      • 요청 목록에서 현재 Header에 가장 가까운 요청을 골라서 움직임
      • 한 쪽에 치우칠 수 있는 문제가 있음
    • SCAN or Elevator Algorithm
      • 한 쪽 방향으로 움직이면서 요청을 처리, 더이상 이쪽 방향에 요청이 없을 경우 반대쪽으로 선회하면서 처리
      • 서비스 시간의 편차가 존재함
        • 선풍기의 경우 바깥쪽은 한참 기다려야 다시 옴
    • C-SCAN
      • 한 쪽으로 움직이면서 요청을 처리, 더이상 이쪽 방향에 요청이 없을 경우 반대쪽으로 선회해 가장 깊은 곳으로 이동 후 다시 반대쪽으로 이동하면서 요청을 처리
      • 서비스 시간의 편차는 해결했으나 SCAN 방식에 비해 Header가 많이 이동함
    • N-step-SCAN
      • 한번에 SCAN으로 처리할 요청을 N개로 제한
      • N 길이의 Queue를 사용
      • 한 Queue에 있는 요청을 모두 처리하면 다음 Queue를 처리
    • FSCAN
      • 두개의 Queue를 사용
      • 하나의 Queue는 비어있음
        • 한 Queue에 있는 요청들을 처리하기 시작한 후 들어오는 요청을 나머지 Queue에 저장
  • Error Handling
    • 제조 과정 중 Bad Sector가 생길 가능성이 있음
    • 이를 위해 Spare Sectors를 미리 만들어 놓음
      • Bad Sector가 된 Sector를 Spare Sector로 이동
        • 이 경우, 순차적으로 읽을 때 한 바퀴만 읽어도 되는 것을 두 바퀴를 읽어야하는 문제가 있음
        • 그래서 한칸씩 Shift해 순차적으로 한 바퀴로 해결할 수 있으나, Shift를 하는 것이 무리가 될 수 있음
  • Stable Storage
    • 데이터를 기록하다가 에러가 나거나 전원이 나가도 반드시 old 데이터 또는 new 데이터가 있도록 함
    • Disk를 두 개를 사용함
      • 한번 적을거 두번 적음
      • 오버헤드가 큼
    • 지금은 log를 남기는 방식 등을 사용함
  • Clock Hardware
    • 주기적으로 메인보드에 interrupt를 걸어줌
      • 이 interrupt를 통해 자체적으로 시간을 유지(시계 기능)
    • Counter와 Holding Register가 존재
      • Counter가 0이 되면 interrupt
      • Counter : pulse가 도착할 때마다 하나씩 감소
      • Holding Register : Counter가 0이 되면 Holding Register에 저장된 값을 Counter에 세팅
    • 한 time quantum이 소비되었으면 필요하면 Scheduling을 해 한 process가 독점하지 않도록 함
    • 현재 실행중인 프로그램이 CPU를 얼마나 사용했는지 기록을 남김
    • 각 process에게 Alarm System Service를 제공
      • 정말 많은 process가 이용함(네트워크에서도 이용)
      • 연결 리스트를 이용
    • watchdog timer : 특정 시간이 되면 무슨 일을 해야한다는 기능
    • profiling, monitoring 등 통계 기능을 제공
    • timer interrupt service routine은 굉장히 빨리 처리되어야 함
      • 이것때문에 다른 instruction을 지체할 수는 없음
  • Soft Timers
    • 많은 Linux System에서 Clock interrupt를 1/100초 단위로 정함
      • 따라서 1/500초나 1/1000초 단위로 특정 시간에 어떤 것을 해달라고 요청할 수 없음
    • 운영체제 코드를 실행할 때 중간중간에 시간 서비스를 제공하는 코드를 삽입
      • 여러 이유로 운영체제 코드를 실행하는 경우가 많으므로 중간에 시간 서비스를 제공하면 높은 정밀도로 시간 서비스를 제공할 가능성이 높아지며, 이러한 기능을 Soft Timer라고 부름