I/O Devices = Controller (명령어 전달)
IO Systems은 IO Management (kernel의 I/O subsystem), Device-driver interface (driver에 읽고 쓰기를 하면서 파일 시스템의 함수를 호출하여 파일 시스템에 근접한 interface), Drivers for specific HW devices로 구성되어 있다.
I/O Function
- Polling
모드 체인지만 한다. User program이 계속 실행되고 있어 context switch를 하지 않는다. pollstatus는 다했냐고
주기적으로 계속 다했다는 status가 올 때까지 물어본다. 하지만 이것도 결국 Device Drvier의 함수를 실행하는
것이므르 시간이 지연된다. 이를 해결하기 위한 방법이 Interrupt-Driven I/O이다.
- Interrupt-Driven I/O
1. Process A가 I/O 요청 (user space)
2. IO Management에게 요청 (kernel space)
3. Device Driver -> Device 전달. pollstatus가 없고 명령 내리고 바로 process management 실행.
4. Device Driver -> Process Management (kernel space) Process Management가 어떤 프로세스 실행할지
선택
5. context switch (user space)
6. Process B가 실행되고 실행 중 A에서 입력이 끝남.
7. Device에서 IRQ 보냄 (kernel -> user)
8. IRQ 신호 받으면 바로 B는 kernel로 들어옴.
9. Scheduuler에서 ready로 풀린 A가 우선순위 높다면 A 실행.
(스케쥴러를 실행한 것은 B이다. 아직 커널이 B에 있다.)
근데 만약 5. 하는 도중에 장치가 I/O 다 끝났는데 A의 우선순위가 더 높으면 B는 실행 못함. -> 이럴때는 polling
- Directed Memory Access
입출력이 되려면 Processor가 명령을 내리고 I/O의 데이터를 받아오면 이 값을 메모리에 넣는다. 항상 프로세서가
일을 한다. 입출력문이 나오면 processor(CPU)가 CMA에 전달한다. DMA가 입출력에 관해 실행한다. 다 끝나면
CPU에게 interrupt하고 CPU는 그동안 user program을 실행한다.
프로세서를 거치지 않고 바로 메모리로 간다.
- Kernel IO Management
Buffering : 문서 작업을 하다 프린트를 누르면 프린트 당시의 문서를 buffer에 넣고 그 이후에 문서를 수정해도
프린트 되는 건 buffer 속 문서.
Caching : 속도 차를 해결하기 위함.
Spooling : 프린트를 여러명이 했을 경우 프린트 될 문서는 buffer에, 나머지 대기 문서들은 spooling.
Kernel entry points는 Interrupt, Trap (software interrupt), System call이다.
CPU가 체크해서 I/O event를 동기화시키는 것은 Interrupt, Polling, DMA.
- Interrupt Handling
kernerl 함수 호출 -> mode change. 현재 저장하던 register 정보를 Kernel stack에 저장.
ISR 실행하다가 interrupt 또 걸리면 새로운 애 먼저 ISR 실행하고 이전 꺼 다시 실행. kernel stack에 있기 때문에
이어할 수 있다.
- Trap Handling
div_by_zero, invalide machine code, page fault, segmentation fault
- System Calls Handling
함수들의 주소가 있는 테이블, IDT에서 0x80이 system_call()이다. 이를 참조.
Disk Scheduling
운영체제가 하드디스크에 저장하는 단위는 block이다.
회전하는 디스크를 disk arm의 head가 읽는다. track 한 줄 씩 완주하는 데 track의 단위 sector마다 읽으며
정보를 읽는다.
Seek time : arm이 현재 읽어야하는 sector가 원하는 track으로 이동하는 시간. 제일 많이 걸린다.
Rotational Delay : 디스크가 회전하며 sector가 head 밑으로 오는 데까지 걸리는 시간.
Data transfer : head가 sector의 정보를 읽어 들이는 시간.
Disk Scheduling의 의의는 seek time을 줄이는 것이다.
- FIFO
온 순서대로 track 번호를 찾아 arm이 이동한다. 오래 걸림.
- SSTF (Shortest Seek Time First)
현 arm 위치에서 가까이 있는 track 먼저 읽는 것이다. 근데 얘도 '거리'에 따른 우선 순위 기반이여서 우선 순위
낮은 애한테 starvation 현상.
-SCAN (Elevator Algorithm or Look policy)
방향을 정해서 한 방향으로만 쭉 간다. starvation 현상이 없다.
RAID (Redundant Array of Inexpensive Disks) : 데이터가 분산된다.
- RAID 0 : non-redundant
- RAID 1 : mirrored, 똑같은 거 백업.
- RAID 3 : 데이터를 바이트 단위로 나누어 디스크에 동등하게 분산한다.
- RAID 4 : block-level parity. 데이터를 block 단위로 나눈어 분산한다. RAID 3하고 비슷하지만 RAID 3은 모든
디스크를 읽어야 한다. 얘는 디스크의 멤버(block)마다 독립적. parity를 계산하여 parity만 저장하는 디스크 하나.
- RAID 5 : block-level distributed parity. RAID 3, 4에서 별도의 parity 디스크를 사용함으로써 생기는 문제점 보완.
만약 1개의 하드가 고장나더라도 남은 하드들을 통해 복구한다. parity 정보를 stripe로 구성된 디스크 내에서 처리한다.
- RAID 6 : dual redundancy. RAID 5에서 다른 드라이브들 간에 분포되어 있는 2차 parity 정보를 넣어 2개의 하드에 문제가
생겨도 복구 가능.
- RAID 01 : (RAID 0)
> RAID 1 = RAID 01. 양쪽 RAID 0 구성 중 하나씩 고장나면 전체 손실.
(RAID 0)
- RAID 10 : (RAID 1)
> RAID 0 = RAID 10.
(RAID 1)
- Disk Cache (buffer cache)
디스크 sector를 위한 main memory 안의 buffer. stack.
최근에 자주 쓰인 sector copy가 stack의 top. buffer 공간에 다차면 최근에 자주 쓰이지 않는 걸 비운다.
'STUDY > 운영체제' 카테고리의 다른 글
[2019.06.27] Concurrency : Mutual Exclusion and Synchronization (0) | 2019.06.27 |
---|---|
[2019.06.26] File Management (0) | 2019.06.26 |
[2019.06.24] Thread (0) | 2019.06.24 |
[2019.06.20] Process (0) | 2019.06.20 |
[2019.06.19] Operating System (0) | 2019.06.19 |