운영체제#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
- 기본 Read / Write 단위 : Block
- Character Device
- 기본 Read / Write 단위 : Char
- 각 char를 순차적으로 처리, address가 따로 없음
- 예 : 마우스, 프린터, 모뎀
- Block Device
- Device Controller
- 각 I/O Device에는 Controller가 존재
- 각 Controller에는 여러 종류의 레지스터가 존재
- Memory-Mapped I/O
- I/O port로 들어오는 주소와 실제 메모리 주소는 서로 별개의 주소
- 서로 변환해줘야함
- Hybrid 방식도 가능
- I/O port로 들어오는 주소와 실제 메모리 주소는 서로 별개의 주소
- Direct Memory Access (DMA)
- Device Controller로 명령을 내리거나, 그 Buffer에 저장된 데이터를 메인 메모리로 옮기는 작업을 CPU가 하는 것은 손해
- DMA controller가 그 역할을 대신함
- CPU는 DMA controller에 명령을 내리기만 하면 됨
- Bus Transfer Mode
- 한번에 한 word씩 읽는 mode와 한번에 몽땅 읽는 burst mode가 존재
- DMA가 CPU보다 메인 메모리에 우선적으로 접근할 수 있음
- 한번에 한 word씩 읽는 mode와 한번에 몽땅 읽는 burst mode가 존재
- Data Transfer Method of DMA
- Fly-by-mode
- Device Controller에서 메인 메모리로 데이터를 바로 보내게 하는 방식
- DMA가 중개해 Device Controller에서 DMA로, DMA에서 메인 메모리로 데이터를 보내는 방식
- Fly-by-mode
- Device Controller로 명령을 내리거나, 그 Buffer에 저장된 데이터를 메인 메모리로 옮기는 작업을 CPU가 하는 것은 손해
- Precise and Improcise Interrupts
- Precise Interrupt
- 현재 실행중이던 instruction을 모두 끝마치고 interrupt가 실행되어야 함
- 어떤 instruction도 진행중이면 안됨
- Precise Interrupt
- 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를 배치
- 지금은 사용하지 않는 방식
- 최소 단위는 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에 저장
- Read/Write Time Factors
- Error Handling
- 제조 과정 중 Bad Sector가 생길 가능성이 있음
- 이를 위해 Spare Sectors를 미리 만들어 놓음
- Bad Sector가 된 Sector를 Spare Sector로 이동
- 이 경우, 순차적으로 읽을 때 한 바퀴만 읽어도 되는 것을 두 바퀴를 읽어야하는 문제가 있음
- 그래서 한칸씩 Shift해 순차적으로 한 바퀴로 해결할 수 있으나, Shift를 하는 것이 무리가 될 수 있음
- Bad Sector가 된 Sector를 Spare Sector로 이동
- 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을 지체할 수는 없음
- 주기적으로 메인보드에 interrupt를 걸어줌
- Soft Timers
- 많은 Linux System에서 Clock interrupt를 1/100초 단위로 정함
- 따라서 1/500초나 1/1000초 단위로 특정 시간에 어떤 것을 해달라고 요청할 수 없음
- 운영체제 코드를 실행할 때 중간중간에 시간 서비스를 제공하는 코드를 삽입
- 여러 이유로 운영체제 코드를 실행하는 경우가 많으므로 중간에 시간 서비스를 제공하면 높은 정밀도로 시간 서비스를 제공할 가능성이 높아지며, 이러한 기능을 Soft Timer라고 부름
- 많은 Linux System에서 Clock interrupt를 1/100초 단위로 정함