본문 바로가기

STUDY/운영체제

[2019.06.25] IO Interrupt, Disk

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