54_디스크 관리(Disk Management)

 

운영체제는 디스크 관리 기능 일부를 담당한다. 포맷을 통한 섹터의 관리, 컴퓨터 시작을 위한 부트 블록 관리, 디스크의 손상된 블록 등을 관리 한다.

 

[디스크 포맷(Disk Format)]

디스크는 자료를 저장하기 전에 섹터들로 나누어져 있어야 한다. 이 과정을 저수준 포맷팅(low level formatting) 또는 물리적 포맷팅 이라 한다.

 

저수준 포맷팅은 섹터를 구분하기 위해 디스크를 적절한 자료구조로 채우는 것이며 자료 구조는 보통 헤더, 자료 영역(보통 512 바이트), 트레일러로 구분 된다. 헤더와 트레일러는 수정 코드(ECC, Error Correcting Code)와 같은 정보를 가지고 있다.

 

 

디스크 제어기가 섹터에 자료를 쓸 때 자료 값으로부터 ECC를 구해서 같이 기록한다. 나중에 이 섹터가 읽혀질 때 자료로부터 ECC가 다시 계산되고 이것이 저장되었던 ECC값과 비교하여 서로 다르면 섹터에 문제가 발생한 것이다. ECC는 1~2개의 비트만 잘못 되었을 때 이를 교정할 수 있는 오류 수정 코드 이다. ECC처리는 대부분 섹터를 읽고 쓸 때 제어기에 의해 자동으로 이루어 진다.

 

포맷을 진행 할 때 디스크의 섹터 크기를 크게 하면 트랙 당 섹터수가 줄어들고 헤더와 트레일러가 차지하는 공간이 자료가 차지하는 공간에 비해 상대적으로 줄어들게 되어 디스크 공간 이용 효율성이 올라가게 된다.

 

디스크에 파일을 저장하기 위해서 운영체제는 디스크에 운영체제의 자료 구조를 기록할 필요가 있으며 두 단계로 이루어 진다.

  1. 디스크를 여러 실린더들로 이루어지는 파티션을 만든다. 운영체제는 각 파티션을 각각 별도의 디스크 드라이브처럼 취급한다.
  2. 논리적 포맷팅은 파일 시스템을 만드는 것이다. 이 단계는 운영체제가 파일 시스템 자료 구조를 디스크에 저장하는 일이다.

 

 

[부트 블록 (Boot Block)]

컴퓨터를 부팅 할 때 시스템을 시작 시키는 프로그램이 요구되며 부트스트랩 프로그램은 운영체제가 어디에 저장되어 있는지 알아내고 그것을 메모리에 올려놓고 시작 시킨다.

 

대부분 시스템들은 ROM에 부트스트랩 프로그램을 저장한다. 하지만 ROM의 경우 부트스트랩을 교체하기 위해 하드웨어 칩을 교체해야 하기 때문에 ROM에는 부트스트랩 프로그램 본체를 디스크로부터 적재하는 일만 하는 아주 작은 부트스트랩 적재기(bootstrap loader) 프로그램만 저장한다. 부트스트랩 프로그램 본체는 쉽게 변경이 가능하고 본 디스크의 고정된 위치인 "부트 블록"에 저장한다. 부트 파티션을 가지고 있는 디스크는 부트 디스크 또는 시스템 디스크라 한다.

 

ROM 내의 부트스트랩 적재기가 하는 일은 디스크 제어기에게 부트스트랩 프로그램을 메모리에 올리도록 지시하고 그 프로그램의 수행을 시작 한다. 부트스트랩 프로그램 본체는 디스크 내 임의의 장소에 저장되어 있는 운영체제 커널을 찾아내고 그것을 시작시키는 일까지 하게 된다.

 

 

Windows의 부트코드는 하드 디스크에 첫 번째 섹터에 저장된다.(master boot record 또는 MBR 영역이라고 함) 일단 시스템이 부트 파티션을 찾으면 첫 번째 섹터부터 읽고 여러 시스템과 서비스들을 적재하는 등의 부트 프로세스의 남은 일을 재개 한다.

 

 

[손상된 블록 (Bad Block)]

디스크는 움직이는 부품들로 구성되어 있기 때문에 언제든지 오류가 발생할 가능성이 있다. 손상된 블록들은 디스크와 제어기에 따라 다양한 방법으로 처리될 수 있다.

 

 

Microsoft의 format명령은 논리적 포맷을 하는데 손상된 블록이 있는지 검사하여 손상된 블록을 발견하면 그 블록을 더 이상 사용하지 못하도록 FAT 테이블에 표시해 놓는다.

서버에 사용되는 디스크(SCSI)등은 제어기가 손상된 디스크 블록 리스트를 유지 한다. 리스트는 공장에서 저수준 포맷하는 동안 초기화되고 저수준 포맷팅은 운영체제가 볼 수 없는 예비 섹터를 남겨놓아 손상된 섹터와 교체할 수 있다. 이 방법을 섹터 옴기기(forwarding)혹은 섹터 남기기(sparing)로 알려져 있다.

 

예비 섹터를 관리하는 다른 방법으로 일부 제어기는 섹터 밀어내기(sector slipping)에 의해 손상 섹터를 처리할 수 있도록 한다. 블록이 손상되면 자료가 유실되기 때문에 이를 완전히 자동으로 처리할 수 는 없다. 소프트 에러(soft error)들은 손상된 블록 자료를 복사하고 그 블록을 예비 블록으로 하거나 밀어내기를 하여 처리 한다.

 

하드 에러(hard error)는 복구가 되지 않으며 자료를 잃게 되어 손상된 블록의 내용을 다른 백업 디스크에서 가져와서 복구하는 등 사람의 개입을 필요로 한다.

 

 

[참고자료]

Operating System Concepts / 홍릉과학출판사

 

53_디스크 스케줄링(Disk Scheduling)

 

운영체제의 역할 중 하나는 효율적인 하드웨어 사용이다. 디스크 드라이브의 경우에는 빠른 접근 시간과 높은 전송량을 제공해야 함을 의미한다. 디스크 접근시간은 두 가지 요소로 이루어지는데 탐색시간(seek time, 디스크 암이 헤드를 해당 실린더로 움직이는데 걸린 시간)과 회전 지연(rotational latency, 디스크 헤드가 원하는 섹터 위치로 도달하기까지 회전에 소요되는 추가적인 시간)시간 이다. 디스크 대역폭(bandwidth)은 단위 시간 당 전송되는 총 바이트 수이다. 효율적인 스케줄링은 접근 시간과 대역폭을 모두 향상 시킬 수 있다.

 

프로세스가 입/출력을 필요로 할 때마다 운영체제에 시스템 호출(system call)을 한다. 이 호출에는 여러 가지 인수가 주어 진다.

  • 입력인가 출력인가
  • 디스크 주소
  • 메모리 주소
  • 전송될 섹터 수

 

디스크 드라이브가 유휴 상태라면 이 요청은 즉시 처리 되고 아니면 큐(queue)에 들어가 기다려야 한다. 다중 프로그래밍에서는 많은 프로세스들이 디스크를 공유하므로 이 큐에는 여러 디스크 입/출력 요청들이 함께 대기하고 있을 수 있다.

 

디스크는 대기하는 작업의 처리 순서를 제어하는 여러 알고리즘을 사용하는데 그 종류에 대해서 알아 보자.

 

[선입 선처리 스케줄링 (FCFS Scheduling)]

가장 간단한 형태인 선입 선처리(first-come-first-served)이다. 이 알고리즘은 본질적으로는 공평해 보이지만 빠른 서비스를 제공하지는 못한다. 예를 들어 다음과 같은 입/출력 요청이 디스크 큐에 있다고 가정한다.

98, 183, 37, 122, 65, 67

 

디스크 헤드가 현재 53 실린더에 있다면 헤드는 53->98->183->37 … 67로 이동하여 총 640 실린더 헤드를 이동하는데 비용이 많이 든다.

 

 

 

[최소 탐색 시간 우선 스케줄링 (SSTF Scheduling)]

헤드(head)가 다른 곳으로 이동을 시작하기 전에 근처에 있는 요구들을 먼저 처리해 주고 헤드를 이동하는 것이 합리적이다. 최소 탐색 시간 우선(Shortest Seek Time First)알고리즘은 이러한 논리에 근거한 것이다. 이 알고리즘은 현재 위치로부터 가장 가까운 요청을 우선 선정한다. 탐색 시간은 헤드가 경유하는 실린더 수에 따라 증가하므로 최소 탐색 시간 우선은 현재 위치로 가장 가까이 요청된 것을 선택 한다.

 

현재 헤드가 53 실린더에 있다면 가장 가까운 65 -> 67 -> 37 …-> 183 순서로 처리 된다.

 

최소 탐색 시간 우선(SSTF) 알고리즘은 최소 작업 우선(Shortest Job First) 스케줄링과 유사하지만 몇 개의 요청들은 매우 오래 기다리게 되는 기아(starvation) 상태가 발생하게 된다. 새로운 요청이 기존의 위치와 가까운 요청이 계속 들어온다면 멀리 있는 요청은 무한정 기다려야 하는 현상이 발생한다. 이 같은 현상은 큐의 길이가 길어질수록 심해 진다.

 

최소 탐색 시간 우선 알고리즘은 선입 선처리 보다는 상당히 개선되었지만 최적의 방법은 아니다.

 

[SCAN 스케줄링(SCAN Scheduling)]

SCAN 알고리즘에서는 디스크 암(disk arm)이 디스크의 한 끝에서 시작하여 다른 끝으로 이동하며 가는 길에 있는 모든 요청을 처리 한다. 다른 한쪽 끝에 도달하면 역 방향으로 이동하면서 오는 길에 있는 요청을 처리 한다. 엘리베이터처럼 왕복하며 처리하므로 엘리베이터(elevator algorithm)이라고도 부른다.

 

 

[C-SCAN 스케줄링 (C-SCAN Scheduling)]

C-SCAN 스케줄링은 각 요청에 걸리는 시간을 좀 더 균등하게 하기 위한 SCAN의 변형이다. SCAN과 같이 C-SCAN은 한쪽 방향으로 헤드를 이동해 가면서 요청을 처리하지만 한쪽 끝에 다다르면 반대 방향으로 헤드를 이동하며 처리하는 것이 아니라 처음 시작했던 자리로 다시 되돌아가서 서비스를 시작한다. C-SCAN 스케줄링 알고리즘은 실린더들을 마지막 실린더가 처음 실린더와 맞닿은 원형 리스트로 간주 한다.

 

 

[LOOK 스케줄링 (LOOK Scheduling)]

SCAN나 C-SCAN 스케줄링은 헤드를 디스크의 끝에서 끝으로 이동한다는 점에 유의해야 한다. 그러나 실제로 이런 방식으로 구현하지는 않는다. 보통 헤드는 각 방향으로 가다가 그 방향에서 아무도 기다리는 요청이 없으면 헤드의 이동 방향을 즉시 반대로 바꾸면 된다. SCAN과 C-SCAN 스케줄링의 이런 변형을 한 방향으로 계속 움직이기 전에 요구가 있는지 확인(look for)하기 때문에 각각 LOOK, C-LOOK 스케줄링 이라 한다.

 

 

[참고자료]

Operating System Concepts / 홍릉과학출판사

 

52_네트워크 파일 시스템 (Netwrok File System)

 

NFS는 LAN을 거쳐 원격 파일을 접근하기 위한 소프트웨어 시스템의 구현과 명세 모두를 말한다. 통신은 TCP 또는 UDP 두 가지 중 하나를 사용한다.

 

NFS의 목적은 이들 파일 시스템들 사이에서 일정 수준의 공유를 투명하게 허용하는 것이다. 공유는 클라이언트 서버의 관계를 기반으로 하며 시스템은 동시에 클라이언트와 서버가 될 수 있다.

 

[원격 디렉토리 접근]

  1. 원격 디렉토리가 특정 시스템(M1)으로부터 투명하게 접근 가능하도록 하기 위해서 M1의 클라이언트는 먼저 마운트 명령을 실행 한다.
  2. 마운트 명령은 원격 디렉토리가 지역 파일 시스템의 디렉토리 상에 장착 되게 한다.
  3. 마운트 명령이 완료되면 장착된 디렉토리는 지역 파일 시스템의 서브트리처럼 보이며 지역 디렉토리의 기존 서브트리를 대체한다.
  4. 지역 디렉토리는 새로 장착된 디렉토리의 루트의 이름이 된다.
  5. 마운트 명령을 위한 매개변수로 원격 디렉토리를 지정하는 일은 투명하지 않은 방식으로 실행 된다. 즉 원격 디렉토리의 위치가 반드시 제공 되어야 한다.
  6. 일단 장착되고 나면 시스템 M1의 사용자 들은 원격 티렉토리의 파일을 완전히 투명하게게 접근할 수가 있다.

 

일부 NFS 구현에서는 연속(cascading) 마운트를 허용한다. 즉 한 파일 시스템이 원격 장착된 파일 시스템에 다시 장착 될 수 있다. 한 기계는 단지 자신이 호출한 마운트에 의해서만 영향을 받는다. 원격 파일 시스템을 장착해도 클라이언트는 원격 파일 시스템에 우연히 이미 장착되어 있던 다른 파일 시스템은 접근할 수 없다. 그러므로 마운트 기법은 이행성(transitivity) 특성을 갖지 않는다.

 

[NFS 설계 목표]

NFS의 설계 목표 중 하나는 서로 다른 기계, 운영체제, 네트워크 구조로 구성된 다른 환경에서 작동하는 것이다. NFS 명세는 이들 매체에 독립적이기 때문에 다른 구현들을 이용 가능하게 한다. 이러한 독립성은 두 개의 구현된 독립적 인터페이스간에 사용되는 외부 자료 표현(XDR, Extenal Data Representation)프로토콜 위에 구축된 RPC 프리미티브를 통해서 이루어 진다. 따라서 NFS와 정확하게 인터페이스되는 이기종 시스템과 파일 시스템으로 구성된 시스템에서는 다른 유형의 파일 시스템들도 지역 또는 원격으로 장착될 수 있다.

 

NSF 명세는 마운트 기법에 의해 제공되는 서비스와 실제 원격 파일 접근(remote file access)서비스를 구분한다. 이들 서비스들을 위해 두 가지의 다른 프로토콜이 명세 되어 있다.

  • 마운트 프로토콜(Mount Protocol) : 마운트 프로토콜은 서비스와 클라이언트 사이의 초기 논리적 연결을 생성하기 위해서 사용된다. 각 시스템은 커널 외부에 프로토콜의 기능들을 실행하는 하나의 서버 프로세스를 가진다.
  • NFS 프로토콜 (NFS Protocol) : NFS 프로토콜은 원격 파일 연산을 위한 원격 프로시저 호출의 집합을 제공 한다. 이 프로시저는 다음과 같은 연산들을 지워 한다
    • 디렉토리 내의 파일 검색
    • 디렉토리 항목 집합의 읽기
    • 파일 속성의 접근
    • 파일 읽기와 쓰기

이러한 프로시저는 원격으로 장착된 디렉토리에 대한 파일 핸들이 구축되어야만 호출할 수 있다.

 

[VFS (Virtual File System)]

NFS는 가상 파일 시스템(VFS)을 통하여 운영체제로 통합된다. 이미 열려진 원격 파일에 대한 연산들이 어떻게 처리되는지 확인해 보자.

 

  1. 클라이언트는 정규 시스템 호출을 통해서 연산을 시작한다.
  2. 운영체제 계층은 이 호출을 적절한 vnode에 대한 VFS 연산으로 매핑 한다.
  3. VFS 계층은 이 파일을 원격 파일로 인식하고 적절한 NFS 프로시저를 실행한다.
  4. 하나의 RPC 호출이 원격 서버 내의 NFS 서비스 계층에 대해 행해진다.
  5. 이 호출은 원격 시스템 상의 VFS 계층으로 다시 들어가고 원겨격 시스템은 그 호출이 지역적임을 반견하며 적절한 파일 시스템 연산을 실행 한다.
  6. 이 경로를 되돌아가 결과를 반환한다.

 

이러한 구조의 장점은 클라이언트와 서버가 동등하므로 시스템이 클라이언트나 서버 모두가 될 수 있다. 각 서버에서 실제적인 서비스는 경량 프로세스(lightweight process), 즉 스레드(thread) 기법을 일시적으로 대체하는 여러 커널 프로세스들에 의해서 실행 된다.

 

 

[참고자료]

Operating System Concepts / 홍릉과학 출판사

 

 

 

 

51_로그 구조 파일 시스템 (Log Structure File System)

 

디스크 상의 디렉토리 구조, 자유 블록 포인터, 자유 FCB 포인터와 같은 파일 시스템 자료 구조는 시스템 고장 발생 시 일관성이 없어 질 수 있다. 운영체제가 로그 기반 기술을 사용하기 전에는 보통 이들에 대한 변경들은 이들 구조에 직접 적용 되었다.

 

파일 생성과 같은 대표적인 연산은 디스크 상의 파일 시스템 내부의 많은 구조적 변화를 포함한다. 이러한 변경은 고장에 의해 방해 받을 수 있고 이들 구조가 일관성이 없어지는 결과를 초래한다.

 

시스템 구조가 깨어질 수 있게 허용하고 복구 시 수리하도록 하는 접근 방법에는 여러 문제가 존재 한다. 그 중 한가지는 비일관성을 회복할 수 없을 수도 있다는 것이다. 일관성 검사가 구조를 복구할 수 없어 파일을 잃거나 디렉토리 전체를 잃게 될 수도 있다.

 

이 문제의 해결 방안은 파일 시스템 메타데이터 갱신에 로그 기반 복구 기술을 적용하는 것이다. 기본적으로 모든 메타데이터 변경은 로그에 순차적으로 기록된다. 특정 태스크를 실행하는 연산의 집합 각각을 하나의 트랜잭션이라고 한다.

 

변경이 로그에 기록되면 커밋된 것으로 간주되고 시스템 호출은 사용자 프로세스로 복귀하여 실행을 계속하도록 허용 한다. 그동안 이 로그 항목은 실제 파일 시스템 구조에 대해 재실행 된다.

 

변경이 반영되는 동안 어느 동작이 끝났는지 그리고 어느 것이 아직 덜 끝났는지를 나타내기 위해 포인터가 갱신된다. 커밋된 전체 트랜잭션이 완료되면 이 로그는 원형 버퍼로 구성된 로그 파일로부터 제거 된다.

 

 

원형 버퍼(circular buffer)는 버퍼 공간의 맨 뒤에 기록하고 맨 앞에서 시작하는 연속적인 공간으로 구성 된다. 이러한 원형 버퍼는 연속적으로 기록되므로 이전의 자료 위에 겹쳐서 기록될 것이다. 따라서 원형 버퍼를 사용할 경우에는 아직 저장되지 않은 유효한 자료 위에 겹쳐서 기록되지 않게 관리된다.

 

시스템이 고장(crash)나면 로그 파일에 0개 이상의 트랜잭션이 있을 것이다. 이러한 트랜잭션들은 운영체제에 의해 커밋되었다 할지라도 파일 시스템에서 결코 실행이 완료 되지 않은 것이기 때문에 이들은 반드시 실행을 완료 해야 한다. 이 트랜잭션들은 작업이 완료될 때까지 실행될 수 있고 파일 시스템 구조는 일관성을 유지하게 된다.

 

유일한 문제는 트랜잭션이 중단되었을 때 발생하는데 트랜잭션이 커밋되기 이전에 시스템에 장애가 발생 할 경우 트랜잭션에 의해 변경된 파일 모두 복구해야 시스템의 일관성이 유지된다.

 

디스크 메타데이터 갱신에 대한 로그를 사용하는 부수적인 이득은 이들을 직접 디스크 자료 구조에 적용하는 것보다 갱신이 더 빠르다는 것이다. 이러한 성능 향상은 임의 입/출력에 비해 순차 입/출력이 빠르다는데서 찾을 수 있다.

 

비용이 많이 드는 동기식 임의 메타데이터 쓰기가 비용이 훨씬 적게 드는 로그 구조 파일 시스템의 로깅 지역에 대한 동기식 순차 쓰기로 변환된다. 이러한 변환은 다시 해당 구조에 대한 임의 쓰기를 통하여 비동기로 재실행 된다.

 

[참고자료]

Operating System Concepts / 홍릉과학출판사

 

+ Recent posts