[36장. I/O 장치]
버스에 계층 구조가 필요한 이유는 메모리 계층 구조와 비슷하다. 물리적인 문제와 비용 때문이다.
표준 장치
장치를 효율적으로 활용하기 위해서는 하드웨어 인터페이스와 내부 구조가 있어야 한다.
표준 방식
폴링->DR에 데이터 전달->IR에 명령어 기록->폴링 반복문을 돌면서 대기. 하지만 이 방식은 비효율적이다.
데이터 전송에 메인 CPU가 관여하는 경우를 programmed I/O(PIO)라고 한다.
인터럽트를 이용한 CPU 오버헤드 개선
폴링 대신 인터럽트 핸들러를 이용해 처리한다. 빠른 장치라면 폴링, 느리다면 인터럽트를 사용하여 중첩시키는 것이 좋다. 네트워크 환경에서는 무한 반복에 빠질 수 있어서 인터럽트를 사용하지 않는다.
직접 메모리 접근(DMA)을 이용한 효율적인 데이터 이동
PIO를 사용하면 비용이 너무 많이 발생한다. DMA를 통해 CPU의 간섭 없이 동작하여 작업이 완료되면 DMA 컨트롤러가 인터럽트를 발생시켜 OS에게 알린다.
디바이스와 상호작용하는 방법
I/O 명령을 명시적으로 사용하거나 맵 입출력을 사용한다.
OS에 연결하기
서로 다른 인터페이스를 갖는 장치들과 OS를 연결시키기 위해 추상화를 사용한다. 디바이스 드라이버라고 부르며 장치와의 상세한 상호작용은 안에 캡슐화 되어있다.
[37장. 하드 디스크 드라이브]
디스크는 하나 또는 그 이상의 플래터를 갖고 각각은 2개의 표면을 갖고있다. 회전축으로 고정되어서 일정한 속도로 회전시킨다. 표면의 동심원 하나를 트랙이라고 한다. 트랙을 읽어서 읽고 쓰는 작업은 디스크 헤드를 통해 할 수 있고 디스크 헤드는 디스크 암에 연결되어있다.
멀티트랙의 탐색 시간
디스크 암을 올바른 트랙 위에 위치시키는 것을 탐색이라고 한다. (가속-활주-감속-안정화)
디스크 스케줄링
디스크 스케줄러는 SJF의 원칙을 따르려고 노력한다.
- 최단 탐색 시간 우선(SSTF): 헤드에서 가장 가까운 트랙의 요청부터 서비스한다. 기아 현상이 발생할 수 있다. 대신 가장 가까운 블럭 우선(NBF) 방식을 사용하면 쉽게 해결이 가능하다.
- 엘리베이터 (SCAN, C-SCAN): 트랙의 순서에 따라 디스크를 앞 뒤로 가로지르며 요청을 서비스한다. 기아 현상은 발생하지 않는다.
- 최단 위치 잡기 우선(SPTF): 유용하고 성능을 개선시킬 수 있지만 트랙의 경계가 어디인지, 현재 디스크 헤드가 어디 있는지를 정확히 알 수 없기 때문에 OS에서 구현하기 어렵다. 때문에 드라이브 내부에서 실행된다.
[38장. RAID]
디스크 여러개를 병렬적으로 사용하면 용량이 많아지고 I/O 시간이 크게 개선되며 신뢰성을 높일 수 있다.
데이터 중복 기술을 사용함으로써 디스크 한 개의 고장을 감내할 수 있다.
상위 레벨의 관점에서 RAID는 일종의 특수한 컴퓨터이다. 프로세서, 메모리, 디스크를 갖고 있다.
RAID는 특정 종류의 결함을 파악하고 복구하도록 설계되어있다.
RAID 설계의 평가는 용량, 신뢰성, 성능 3개의 축으로 평가할 수 있다.
- RAID 0(스트라이핑): 중복 저장을 하지 않기때문에 복구 기능이 없다. 용량과 성능은 좋지만 신뢰성이 좋지 않다. 하나의 디스크가 고장나면 전체 데이터가 소실되기 때문이다.
- RAID 1(미러링): 각 블럭에 대해서 하나 이상의 사본을 둔다. 미러링 레벨이 2라면 최대 용량의 반만 사용할 수 있다. 신뢰성 측면에서는 괜찮은 편이며 성능은 하나의 디스크에 쓰는 시간보다 조금 더 길다. 랜덤 읽기의 경우에는 최고의 성능을 보인다.
- RAID 4(패리티를 이용한 공간 절약): 패리티 블럭 하나를 추가한다. XOR 연산을 통해 디스크 하나가 고장나더라도 복구할 수 있다. 용량은 (N-1)B의 공간을 제공하며 신뢰성은 오직 하나만의 디스크 고장만을 감내할 수 있다. 성능은 병목현상이 발생하기 때문에 매우 좋지 않다.
- RAID 5(순환 패리티): RAID 5와 거의 동일하게 동작하지만 패리티 블럭을 순환시켜서 병목현상을 막는다.
스트라이핑: 성능과 용량
미러링: 임의 I/O에 대한 성능과 신뢰성
RAID 5: 용량과 신뢰성
[39장. 막간: 파일과 디렉터리]
저장 장치의 가상화에 대한 두 가지 주요 개념. 파일, 디렉터리
[40장. 파일 시스템 구현]
파일 시스템은 순수한 소프트웨어다. CPU나 메모리 가상화와 다르다. 자료구조와 접근 방법 두 가지 측면으로 접근한다.
파일 시스템은 각 파일에 대한 정보를 관리한다.
파일 구성: 아이노드
*아이노드: 파일을 구성하는 데이터 블럭, 크기, 소유자, 접근 권한 등의 정보.
위와 같은 파일에 대한 정보들을 메타데이터라고 한다.
아이노드 설계 시 중요한 부분중 하나는 데이터 블럭의 위치를 표현하는 방법이다.
멀티 레벨 인덱스: 디스크 블럭들이 일종의 트리 형태로 구성된 것
큰 파일을 지원하기 위해 아이노드 내에 간접 포인터를 사용한다. 더 큰 파일은 삼중 간접 포인터를 쓴다.
간단한 포인터 대신 익스텐트를 사용할 수 있다.(세그먼트와 유사함)
디렉터리 구조
디렉터리는 항목 이름-아이노드 번호 쌍의 배열로 구성되어 있다.
대부분의 파일 시스템에서 디렉터리는 특별한 종류의 파일로 간주한다.
디스크에서 파일 읽기
파일에 대한 아이노드를 찾아서 기본적인 정보를 획득해야한다.
우선 루트 디렉터리의 아이노드를 읽고 데이터 블럭의 포인터를 추출한다. 이후 찾는 항목의 아이노드 번호를 파악한다. (루트->경로->..->파일)
루트부터 시작해서 경로의 아이노드를 계속 파고 들어가다가 마지막에 파일의 아이노드 번호를 찾아서 파일 디스크립터를 할당받아 사용자에게 리턴하게 된다.
파일을 닫을 땐 할당된 파일 디스크립터를 모두 해제하면 된다.
디스크에 파일 쓰기
읽기와 비슷한 과정을 밟는다. 하지만 블럭 할당을 필요로 할 수 있다. I/O 발생 횟수가 많다.
캐싱과 버퍼링
메모리의 정적 기법(고정 크기의 캐시)은 낭비가 많아서 동적 파티션을 이용한다.
쓰기 캐싱의 경우 write buffer를 통해 다수의 쓰기 작업들을 적은 수의 I/O로 일괄처리 할 수 있다. 하지만 디스크에 기록되기 전에 크래시 되면 내용이 손실될수도 있다. 데이터의 손실을 용납하지 않는 프로그램이라면 캐시를 사용하지 않도록 direct I/O 또는 raw dist 인터페이스를 사용해서 write through 할 수 있다.
(41~47 중간 우선 생략)
[48장. 분산 시스템]
핵심 사안은 실패와 고장의 극복이다. 성능과 보안 역시 중요하다.
통신의 기본
통신은 신뢰할 수 없다고 가정한다.
신뢰할 수 없는 통신 계층: UDP/IP
신뢰할 수 있는 통신 계층: TCP/IP
발신자는 수신자가 메시지를 수신했다는 것을 알기 위해 확인 메시지를 다시 받는다. 만약 응답이 없다면 타임아웃을 추가로 도입하여 재전송한다. (타임아웃/재시도) 단, ack 메시지 자체가 누락이 된다면 수신자는 같은 메시지를 두번 받게되는 셈으므로 양쪽 다 정확히 한번만 주고 받는다는 보장이 있어야 한다. 순서 카운터를 이용해 해결할 수 있다.
'이론 > 운영체제' 카테고리의 다른 글
[OSTEP] II. 병행성 (0) | 2022.08.21 |
---|---|
[OSTEP] I. 가상화 (0) | 2022.08.19 |
[OSTEP] 2장. 운영체제 개요 (0) | 2022.08.19 |
쉽게 배우는 운영체제 (0) | 2022.08.16 |