-
섹터
- 블록 장치 가 물리적 으로 접근할 수 있는 가장 작은 단위이다.
섹터
의 크기는 2의 거듭제곱 값이다.- 가장 일반적으로 512바이트다.
- 모든 장치 입출력이 섹터 단위로 이루어진다.
블록
- 프로그램 측면 에서 논리적 으로 접근할 수 있는 최소 단위
블록
은 파일시스템 추상화 개념이다.- 블록 장치 가 물리적 으로 접근 가능한 최소 단위가
섹터
이므로, 파일시스템을 추상화 한블록
의 크기는섹터
보다 작을 수 없다. 블록
의 크기는섹터
크기의 배수이다.섹터
크기의 배수이면서 2의 거듭제곱 형태가 되어야 한다.페이지
의 크기보다 클 수 없다.- 이는 커널을 단순화시키기 위한 인공적인 제약 사항이다.
블록
의 크기가페이지
보다 크지 않다면buffer_head
구조체의b_page
포인터 변수 하나로 해당버퍼
가 속한페이지
를 가리킬 수 있다.
- 블록 장치 가 물리적 으로 접근 가능한 최소 단위가
-
-
bio
구조체는 커널 내부에서 블록 입출력을 전달하는 기본 장치로 현재 진행 중인 블록 입출력 동작을세그먼트
들을 리스트 형태로 관리한다. -
세그먼트
- 가상 주소와 물리 주소가 모두 연속적인
버퍼
- 가상 주소와 물리 주소가 모두 연속적인
버퍼
- 디스크 상의 블록을 메모리 상에 표현하는 객체
- 각 버퍼마다
buffer_head
구조체 서술자를 갖는다.
-
하나의
세그먼트
는 메모리 상에서 연속적 이지만,세그먼트
들의 리스트는 그럴 필요가 없다.bio
구조체는 scatter-gather 를 기능을 지원하여 메모리 상에 연속적이지 않은 메모리 위치로부터 데이터를 전송받거나 메모리 상에 연속적이지 않은 메모리 위치로 데이터를 전송할 수 있다.
-
-
-
buffer_head
- 하나의
버퍼
를 표현하는 구조체 - 디스크 상의 블록과 메모리 상의 버퍼의 연결 관계를 정의하는 데이터가 담겨 있다.
- 하나의
-
buffer_head
vsbio
2.6 커널
이전에는 입출력 단위로buffer_head
를 사용하였다.- 기존
buffer_head
의 문제점- 하나의
버퍼
만을 다루는buffer_head
의 특성 상 큰 블록 입출력 요청을 처리할 때 모든 요청을버퍼
단위로 분할해서 처리해야 한다.- 요청을
버퍼
단위로 처리하는 것은 간단하지 않고 좋은 방법이 아니다. - 분할된
버퍼
마다 하나의buffer_head
구조체를 가지므로 메모리를 낭비한다.
- 요청을
- 하나의
buffer_head
의 문제점을 해결한bio
bio
는buffer_head
를 추상화 한 것이다.- 근거
- 하나의
버퍼
만을 표현하는 것을 넘어, 앞으로 처리할세그먼트
들의 리스트를 유지하는 자료구조이기 때문이다.
- 하나의
- 추상화 의 이점
bio
구조체는 물리적 페이지를 다루므로 상위 메모리를 쉽게 표현할 수 있다.- 여러 물리적 페이지에 걸친 데이터를 처리하는 scatter-gather 기법을 사용할 수 있다.
- 기존
블록
과버퍼
의 간단하지 않은 연결 관계를 담느라 무거웠던buffer_head
의 한계를 극복하고, 블록 입출력 작업을 처리하는 데 필요한 최소한의 정보 만을 담아 훨씬 가벼워졌다.
- 근거
-
buffer_head
는 더 이상 사용하지 않는가?bio
에는 불록 입출력 작업을 처리하기 위한 정보만 담고 있으므로, 개별버퍼
에 대한 상태 정보를 가지고 있지 않다.- 따라서 개별
버퍼
의 정보를 담고 있는buffer_head
의 역할이 없어진 것은 아니다.
bio
와buffer_head
는 서로 자신의 규모를 작게 유지할 수 있는 공생 관계 이다. -
-
deadline
- 데드라인 입출력 스케줄러
starvation
문제를 해결하기 위해 별도의 데드라인 큐 를 마련한다.- 구성
- 정렬 큐
섹터
번호를 기준으로헤드
와 가까운 순서대로 정렬
- 데드라인 큐
- read FIFO & write FIFO
- 데드라인 순서대로 정렬
- read FIFO & write FIFO
- 정렬 큐
- 동작 원리
- 데드라인 큐 에서 데드라인을 넘긴 요청이 있는지 확인한다. 있으면 해당 요청을 실행한다.
- read FIFO 큐 의 우선순위가 더 높은데, 그 이유는 사용자 프로세스가 읽기 요청을 보내고 대기하는 경우가 많고, 그렇기에 읽기 요청을 빠르게 처리하는 것이 시스템 성능에 중요한 요인이 되기 때문이다.
- 데드라인 큐 에서 처리해야 할 요청이 없으면 정렬 큐 의 요청을 처리한다.
- 데드라인 큐 에서 데드라인을 넘긴 요청이 있는지 확인한다. 있으면 해당 요청을 실행한다.
as
- 예측 입출력 스케줄러
- 데드라인 입출력 스케줄러 의 동작을 기본으로 한다.
- 데드라인 입출력 스케줄러 와의 차이점
- anticipation heuristic
- 특정 요청을 처리한 다음 바로 다음 요청을 처리하는 대신, 미리 설정한 시간 동안 아무 일도 하지 않고 대기한다.
- 대기 시간 은 통계치를 기준으로 적절한 시간을 계산한 것이다.
- 대기 시간 을 올바르게 예측 하는 것이 예측 입출력 스케줄러 의 핵심이다.
- 대기 시간 은 통계치를 기준으로 적절한 시간을 계산한 것이다.
- 대기 시간 동안에 인접 영역에 해당하는 요청이 오면 처리하고, 오지 않으면 애초에 존재하던 다음 요청을 처리한다.
- 특정 요청을 처리한 다음 바로 다음 요청을 처리하는 대신, 미리 설정한 시간 동안 아무 일도 하지 않고 대기한다.
- anticipation heuristic
cfq
- 완전 공정 큐 입출력 스케줄러
프로세스
마다 큐를 할당한다.- 각 큐는
섹터
위치에 따른 정렬을 한다.
- 각 큐는
- synchronous requests
프로세스
의 동기적인 요청들은프로세스
마다 가지고 있는 큐로 들어간다.- 각
프로세스
는우선순위
에 따라타임 슬라이스
를 가지고 있고, 그 시간 동안 디스크에 독점적으로 접근 가능하다. - 각 큐는
SCAN
방식으로 요청을 처리한다. - 각 큐는 디스크를 독점적으로 사용하기 전에,
as
의 anticipation heuristic 과 비슷한 개념인 slice_idle 시간만큼 기다렸다가 디스크 사용을 시작한다.- 이는 해당 큐의
프로세스
가 독점적으로 디스클 사용할 수 있는 기회를 얻었을 때 최대한 많은 요청을 다루기 위함이다.
- 이는 해당 큐의
- asynchronous requests
- 모든
프로세스
가 17개의 우선순위를 가진 큐를 공유한다.- 이 큐들은
round robin
방식으로 요청을 처리한다.
- 이 큐들은
- 모든
noop
- 무동작 입출력 스케줄러
- 인접 요청과의 병합을 제외하면 탐색 시간을 줄이기 위한 어떠한 알고리즘도 사용하지 않는다.
하드디스크
처럼헤드
의 움직임을 최소화 해야 하는 장치가 아닌 임의 접근이 가능한플래시 메모리
와 같은 장치를 사용한다면noop
은 좋은 선택지가 된다.