파일은 추상 데이터 유형입니다. 파일을 올바르게 정의하려면 파일 작업을 고려해야 합니다. 운영 체제는 파일 작성, 쓰기, 읽기, 재배치, 삭제 및 자르기 시스템 호출을 제공합니다.
"논리적 구조" 란 사용자가 파일 내부의 데이터를 어떻게 구성해야 하는지를 말합니다. "물리적 구조" 란 운영 체제의 관점에서 파일의 데이터가 외부 스토리지에 저장되는 방식을 말합니다.
구조화되지 않은 파일: 파일 내의 데이터는 일련의 이진 스트림 또는 문자 스트림으로 구성됩니다. 스트리밍 파일이라고도 합니다
파일 내부의 데이터는 실제로 일련의 문자 스트림이며 명백한 구조적 특징이 없습니다. 따라서 비정형 파일의 "논리적 구조" 를 논의할 필요가 없습니다.
구조화된 파일: "로그 파일" 이라고도 하는 유사한 레코드 세트로 구성됩니다. 각 레코드는 여러 데이터 항목으로 구성되어 있습니다. [1] 일반적으로 각 레코드에는 키워드로 사용할 수 있는 데이터 항목이 있습니다. 각 레코드의 길이 (차지하는 저장 공간) 가 같은지 여부에 따라 고정 길이 레코드와 가변 길이 레코드로 나눌 수 있습니다. 구조화된 문서는 다음과 같이 나눌 수 있습니다.
N 개의 레코드가 있는 순차적 파일의 경우 키 값이 있는 레코드를 찾는 데 평균 N/2 번 필요합니다. 색인 순서 파일에서는 N 개의 레코드가 N 그룹으로 나뉘어 있고 색인 테이블에는 N 개의 항목이 있으며 각 그룹에는 N 개의 레코드가 있다고 가정합니다. 특정 키 값을 가진 레코드를 검색할 때 먼저 인덱스 테이블을 검색한 다음 기본 파일의 해당 그룹에서 √N /2 번 검색해야 하므로 * * 는 √N/을 찾아야 합니다. 분명히 색인 시퀀스 파일은 검색 효율성을 향상시킵니다. 많은 레코드가 있는 경우 두 개 이상의 색인을 사용할 수 있습니다.
순서가 지정된 일련의 FCB 를 파일 디렉토리라고 하며 FCB 는 파일 디렉토리 항목입니다. FCB 에는 파일에 대한 기본 정보 (파일 이름, 물리적 주소, 논리적 구조, 물리적 구조 등) 가 포함되어 있습니다. ), 액세스 제어 정보 (읽기/쓰기 여부, 액세스가 금지된 사용자 목록 등 ) 및 사용 정보 (예: 파일 작성 시간, 수정 시간 등). 가장 중요하고 기본적인 것은 파일 이름과 파일 저장소의 물리적 주소입니다.
디렉토리는 다음과 같이 작동합니다.
작업 시 다음과 같은 디렉토리 구조를 가질 수 있습니다.
이전 운영 체제는 다중 레벨 카탈로그를 지원하지 않았습니다. 전체 시스템에는 하나의 카탈로그 테이블만 작성되며 파일당 하나의 카탈로그 항목이 사용됩니다.
단일 레벨 디렉토리는 "이름별 액세스" 를 구현하지만 파일 이름은 바꿀 수 없습니다. 파일을 생성할 때 먼저 카탈로그 테이블에 이름이 같은 파일이 있는지 확인하고, 중복 이름이 없는지 확인한 후 파일 생성을 허용하고, 새 파일에 해당하는 카탈로그 항목을 카탈로그 테이블에 삽입해야 합니다. 분명히 단일 레벨 디렉토리 구조는 다중 사용자 운영 체제에 적합하지 않습니다.
이전 다중 사용자 운영 체제는 2 단계 디렉토리 구조를 사용했습니다. 마스터 파일 디렉토리 (MFD) 와 사용자 파일 디렉토리 (UFD) 로 구분됩니다.
다른 사용자의 파일 이름을 바꿀 수 있습니다. 파일 이름은 같지만 실제로는 다른 파일에 해당합니다. 2 단계 디렉토리 구조를 사용하면 서로 다른 사용자의 파일 이름을 바꿀 수 있으며, 디렉토리에 액세스 제한을 적용할 수 있습니다 (현재 로그인된 사용자 이름이 일치하는지 확인). 그러나 2 단계 디렉토리 구조는 여전히 유연성이 부족하여 사용자가 자신의 파일을 분류할 수 없습니다.
사용자 (또는 사용자 프로세스) 가 파일에 액세스하려는 경우 파일 경로 이름으로 파일을 식별해야 합니다. 경로 이름은 문자열입니다. 모든 레벨의 디렉토리는 "/"로 구분됩니다. 루트 디렉토리의 경로를 절대 경로라고 합니다.
시스템은 절대 경로를 기준으로 레이어별로 다음 디렉토리를 찾습니다. 외부 메모리에서 루트 디렉토리의 카탈로그 테이블을 읽기 시작했습니다. 디렉토리의 저장 위치를 찾으면 외부 스토리지에서 해당 카탈로그 테이블을 읽습니다. 그런 다음 디렉토리의 저장 위치를 찾아 외부 스토리지에서 해당 카탈로그 테이블을 읽습니다. 마지막으로 파일을 저장할 위치를 찾았습니다. 전체 프로세스에는 디스크 읽기 I/O 작업이 3 회 필요합니다.
동일한 디렉토리에 있는 여러 파일에 연속적으로 액세스하는 경우가 많습니다. 매번 루트에서 검색을 시작할 때마다 효율성이 떨어지는 것이 분명하다. 그래서 "현재 디렉토리" 를 설정할 수 있습니다. 현재 열려 있는 카탈로그 파일, 즉 이 카탈로그 테이블이 메모리로 이동되어 "현재 디렉터리" 로 설정할 수 있습니다. 사용자가 파일에 액세스하려는 경우 현재 디렉토리의 상대 경로를 사용할 수 있습니다.
현재 디렉토리 및 상대 경로가 도입되면서 디스크 입출력 수가 줄어든 것을 알 수 있습니다. 이를 통해 파일 액세스 효율성이 향상됩니다.
트리 디렉토리 구조는 파일을 쉽게 분류하고, 계층 구조가 명확하며, 파일을 보다 효율적으로 관리하고 보호할 수 있습니다. 그러나 트리 구조는 파일 * * * 을 즐기기가 쉽지 않습니다. 따라서 "비순환 그래프 디렉토리 구조" 가 제안되었다.
같은 파일을 다른 파일 이름으로 가리키거나 같은 디렉토리를 가리킬 수 있습니다 (* * * 같은 디렉토리의 모든 내용을 즐길 수 있음). 각 * * * 즐거움 노드에 대해 * * * 즐거움 카운터를 설정하여 현재 * * * 중 해당 노드를 즐기고 있는 위치 수를 기록해야 합니다. 사용자가 노드 삭제를 요청하면 해당 사용자의 FCB 만 제거되고 * * * 즐거움 카운터에서 1 을 뺀 후 * * * 즐거움 노드를 직접 삭제하지 않습니다. * * * 즐거움 카운터가 0 으로 줄어든 경우에만 노드를 삭제할 수 있습니다.
실제로 모든 수준의 디렉토리를 찾는 데는 "파일 이름" 정보만 필요하며 파일 이름이 일치하는 경우에만 파일에 대한 추가 정보를 읽어야 합니다. 따라서 "슬리밍" 카탈로그를 고려하여 효율성을 높일 수 있습니다.
파일 이름에 해당하는 디렉토리 항목을 찾으면 inode 를 메모리로 전송해야 합니다. Inode 는 파일이 외부에 저장되는 위치를 포함하여 파일에 대한 다양한 정보를 기록하며 "저장 위치" 에 따라 파일을 찾을 수 있습니다. 외부 메모리에 저장된 inode 를 디스크 inode 라고 하며, 메모리에 넣을 때 메모리 inode 라고 합니다. 반면, 파일이 수정되었는지 여부, 현재 파일에 액세스하고 있는 프로세스 수 등 메모리 인덱스 노드에 정보를 추가해야 합니다.
파일에 대한 암호 (예: ABC 1 12233) 를 설정합니다. 사용자는 파일에 대한 액세스를 요청할 때 암호를 제공해야 합니다.
장점: 비밀번호를 저장하는 데 드는 공간 비용이 많지 않고 비밀번호를 확인하는 데 드는 시간도 적습니다.
단점: 시스템에 올바른 "암호" 가 저장되어 있어 안전하지 않습니다.
암호로 파일을 암호화합니다. 파일에 액세스할 때 올바른 "암호" 를 제공해야 파일을 제대로 해독할 수 있습니다. [3]
장점: "암호" 를 시스템에 저장할 필요 없이 기밀성이 강합니다.
단점: 인코딩/디코딩 또는 암호화/암호 해독에는 시간이 좀 걸립니다.
각 파일의 FCB (또는 inode) 에 ACL (액세스 제어 리스트) 을 추가하여 각 사용자가 파일에 대해 수행할 수 있는 작업을 기록합니다.
일부 컴퓨터에는 많은 사용자가 있을 수 있으므로 액세스 제어 리스트가 매우 클 수 있습니다. 우리는 단순화된 방문 목록으로 이 문제를 해결할 수 있다.
축소 액세스 목록: 각 그룹 사용자가 파일에 대해 수행할 수 있는 작업을 그룹 단위로 표시합니다. 사용자가 파일에 액세스하려고 할 때 시스템은 사용자가 속한 그룹에 적절한 액세스 권한이 있는지 확인합니다.
Inode 는 파일 디렉토리 축소 전략입니다. 파일을 검색할 때 파일 이름만 필요하기 때문에 파일 이름을 제외한 모든 정보를 inode 에 배치할 수 있습니다. 이렇게 하면 디렉토리 엔트리에는 파일 이름과 inode 포인터만 포함되면 됩니다.
인덱스 노드에 연결된 사용자 디렉토리 항목 수를 나타내는 링크 수 변수가 인덱스 노드에 설정되어 있습니다.
User3 이 CCC 에 액세스하면 운영 체제는 파일 CCC 가 연결된 파일임을 판단하고, 기록된 경로를 기준으로 디렉토리를 계층별로 검색하고, 결국 User 1 의 디렉토리 테이블에서' AAA' 항목을 찾아 1 파일의 inode 를 찾습니다
메모리 페이징과 마찬가지로 디스크의 스토리지 유닛도' 블록/블록/물리적 블록' 으로 나뉩니다. 많은 운영 체제에서 디스크 블록의 크기는 메모리 블록 및 페이지와 동일합니다.
메모리와 디스크 간의 데이터 교환 (읽기 및 쓰기 작업 및 디스크 I/O) 은 블록 단위로 수행됩니다. 한 번에 하나의 블록을 읽거나 한 번에 하나의 블록을 쓰는 것입니다.
메모리 관리에서 프로세스의 논리적 주소 공간은 페이지로 나뉩니다. 마찬가지로 외부 메모리 관리에서는 파일 데이터 관리를 용이하게 하기 위해 파일의 논리적 주소 공간도 파일 "블록" 으로 나뉩니다. 그러면 파일의 논리 주소도 (논리 블록 번호, 블록 내 주소) 로 나타낼 수 있습니다. 사용자는 논리적 주소를 통해 자신의 파일을 조작하고 운영 체제는 논리적 주소와 물리적 주소 간 매핑을 담당합니다.
연속 할당을 수행하려면 각 파일이 디스크에서 연속 블록 세트를 차지해야 합니다. 사용자가 액세스할 논리 블록 번호를 제공하고 운영 체제에서 파일에 해당하는 카탈로그 항목 (FCB) 을 찾습니다. 논리 블록 번호에 해당하는 물리적 블록 번호, 물리적 블록 번호 = 시작 블록 번호+논리 블록 번호를 직접 계산할 수 있습니다. 또한 사용자가 제공한 논리 블록 번호가 합법적인지 (논리 블록 번호 ≥ 길이가 불법인지) 확인해야 하므로 순차 액세스와 직접 액세스 (즉, 임의 액세스) 를 지속적으로 할당할 수 있습니다.
디스크 블록을 읽을 때 헤드를 이동해야 합니다. 액세스한 두 디스크 블록이 멀리 떨어져 있을수록 헤드를 이동하는 데 더 많은 시간이 걸립니다. 순차적으로 할당된 파일은 순차적 읽기 및 쓰기 속도가 가장 빠르고, 물리적 확장이 불편하며, 스토리지 공간 활용도가 낮고, 사용하기 어려운 디스크 조각을 생성하며, 컴팩트하게 처리할 수 있지만 많은 시간이 소요됩니다. 。
링크 할당은 불연속 할당으로 파일에 개별 디스크 블록을 할당할 수 있습니다. 암시적 링크와 명시적 링크 두 가지가 있습니다.
사용자가 액세스할 논리 블록 번호 I 를 제공하면 운영 체제에서 해당 파일에 해당하는 카탈로그 항목 (FCB) 을 찾습니다. 카탈로그 항목에서 시작 블록 번호 (블록 0) 를 찾고 논리 블록 번호 0 을 메모리로 읽어 논리 블록 1 에 저장된 물리적 블록 번호를 알고 논리 블록/KLOC 를 읽습니다. 따라서 논리 블록 I 을 읽는 데 i+ 1 보조 디스크 I/O 시간이 필요합니다 .....
체인형 할당 (암시적 링크) 된 파일은 순차 액세스만 지원하고 임의 액세스는 지원하지 않으므로 검색 효율성이 떨어집니다. 또한 다음 디스크 블록에 대한 포인터도 소량의 스토리지 공간을 소모해야 합니다. 암시적 링크의 링크 할당 방법을 사용하면 파일을 쉽게 확장할 수 있습니다. 또한 사용 가능한 모든 디스크 블록을 조각 문제 없이 사용할 수 있어 외부 메모리 활용도가 높습니다.
링크된 파일의 물리적 블록에 대한 포인터는 하나의 테이블에 명시적으로 저장됩니다. 파일 할당 테이블 (FAT) 입니다.
디스크당 하나의 FAT 만 설정할 수 있습니다. 시작 시 FAT 를 메모리로 읽어 메모리에 상주합니다. FAT 항목은 물리적으로 연속적으로 저장되며 각 항목의 길이가 동일하므로 물리적 블록 번호 필드를 억제할 수 있습니다.
I > 인 경우 카탈로그 항목에서 시작 블록 번호를 찾습니다. 0, 메모리에서 파일 할당 테이블 FAT 를 쿼리하고 나중에 논리 블록 I 에 해당하는 물리적 블록 번호를 찾습니다. 논리적 블록 번호를 물리적 블록 번호로 변환하는 프로세스에는 디스크 읽기 작업이 필요하지 않습니다.
체인형 할당 (명시적 링크) 된 파일은 순차 액세스와 임의 액세스를 모두 지원합니다 (논리 블록 I 에 액세스하려는 경우 이전 논리 블록 0 ~ I- 1 에 순차적으로 액세스할 필요가 없습니다). 블록 번호 변환 프로세스에는 디스크 액세스가 필요하지 않으므로 암시적 링크보다 액세스 속도가 훨씬 빠릅니다. 명시적 링크는 분명히 외부 조각을 생성하지 않으며 파일 확장을 용이하게 합니다.
인덱스 할당을 사용하면 파일을 각 디스크 블록에 개별적으로 분산할 수 있으며, 파일의 각 논리 블록에 해당하는 물리적 블록을 기록하는 인덱스 테이블이 각 파일에 대해 생성됩니다. 인덱스 테이블은 메모리 관리의 페이지 테이블처럼 작동합니다. 논리 페이지와 물리적 페이지 간의 매핑 관계를 설정합니다. 인덱스 테이블에 저장되는 디스크 블록을 인덱스 블록이라고 합니다. 파일 데이터를 저장하는 디스크 블록을 데이터 블록이라고 합니다.
명시적 링크의 체인 할당 모드에서 파일 할당 테이블 FAT 는 디스크에 해당합니다. 인덱스 할당 방법에서 인덱스 테이블은 파일에 해당합니다. 물리적 블록 번호 [4] 는 고정 길이로 표시할 수 있으므로 색인 테이블에서 "논리 블록 번호" 를 억제할 수 있습니다.
사용자가 액세스할 논리적 블록 번호 I 를 제공하면 운영 체제에서 해당 파일에 해당하는 카탈로그 항목 (FCB) 을 찾습니다. 카탈로그 항목에서 인덱스 테이블이 저장되는 위치를 알 수 있고, 인덱스 테이블은 외부 메모리에서 메모리로 읽을 수 있으며, 논리적 블록 I 의 저장 위치만 찾을 수 있습니다.
인덱스 할당 방법은 랜덤 액세스를 지원할 수 있음을 알 수 있습니다. 파일 확장도 쉽게 수행할 수 있지만 (파일에 사용 가능한 블록을 할당하고 인덱스 테이블 항목을 추가하기만 하면 됨) 인덱스 테이블은 어느 정도의 저장 공간을 차지합니다.
인덱스 블록의 크기는 중요한 문제입니다. 각 파일에는 색인 블록이 있어야 하므로 색인 블록은 가능한 한 작아야 하지만 색인 블록이 너무 작아 큰 파일을 지원할 수 없습니다. 다음과 같은 메커니즘을 사용할 수 있습니다.
유휴 목록 방법은 연속 배포 모드에 적용됩니다. 디스크 블록 할당: 메모리 관리의 동적 파티션 할당과 유사하게 파일에 연속 스토리지 공간을 할당합니다. 마찬가지로 첫 번째 맞춤, 최적 맞춤, 최악의 맞춤 등의 알고리즘을 사용하여 파일에 할당할 간격을 결정할 수 있습니다. 디스크 블록 재활용: 메모리 관리의 동적 파티션 할당과 유사하게 스토리지 영역을 회수하는 네 가지 경우가 있습니다. 1 재활용 영역 앞뒤에 인접한 여유 영역이 없습니다. (2) 재활용 구역 전후의 유휴 구역; ③ 재활용 구역 앞에는 자유 구역이 있다. ④ 복구 구역 뒤에는 자유 구역이 있다. 결론적으로, 재활용할 때는 테이블 항목의 합병에 주의해야 한다.
운영 체제는 체인 헤드와 체인 테일 포인터를 저장합니다. 할당 방법: 파일이 k 개의 디스크 블록을 요청하면 k 개의 디스크 블록 할당이 체인 헤드에서 순차적으로 제거되고 유휴 체인의 체인 헤드 포인터가 수정됩니다. 재활용 방법: 재활용된 디스크는 체인 끝에 순차적으로 걸려 유휴 체인의 체인 끝 포인터를 수정합니다. 이산 분배에 적합한 물리적 구조. 한 파일에 여러 블록을 할당할 때 이 작업을 여러 번 반복해야 할 수 있습니다.
운영 체제는 체인 헤드와 체인 테일 포인터를 저장합니다. 할당 방법: 파일이 k 개의 디스크 블록을 요청하는 경우 먼저 적응, 최적 맞춤 등의 알고리즘을 사용하여 체인 헤더에서 검색을 시작하여 알고리즘 규칙에 따라 원하는 크기의 사용 가능한 디스크 블록을 찾아 파일에 할당할 수 있습니다. 적절한 연속 사용 가능 블록이 없는 경우 한 파일에 서로 다른 범위의 블록을 동시에 할당할 수도 있습니다. 할당 후 체인 포인터 및 범위 크기와 같은 해당 데이터를 수정해야 할 수 있습니다. 재활용 방법: 재활용 영역이 자유 영역에 인접한 경우 자유 영역에 병합해야 합니다. 복구 영역이 사용 가능한 영역에 인접하지 않은 경우 복구 영역을 체인 끝에 별도의 사용 가능한 디스크 영역으로 매달아 둡니다. 이산 분포와 연속 분포가 모두 적용됩니다. 한 파일에 여러 블록을 할당하는 것이 더 효과적입니다.
비트맵: 이진 비트당 하나의 디스크 블록입니다. 이 예에서' 0' 은 디스크 블록이 유휴 상태임을 나타내고' 1' 은 디스크 블록이 이미 할당되었음을 나타냅니다. 비트맵은 일반적으로 연속적인 "단어" 로 표시됩니다. 예를 들어, 이 예에서 한 단어의 길이는 16 비트이고, 단어의 각 비트는 디스크 블록에 해당합니다. 따라서 (글꼴 크기, 위치 번호) 를 디스크 블록 번호에 매핑할 수 있습니다. 물론 일부 주제도 (행 번호, 열 번호) 로 설명됩니다
디스크 블록 번호, 글꼴 크기 및 레이블 번호는 0 부터 시작합니다. N 이 글자 길이를 나타낸다면
할당 방법: 파일에 K 개의 블록이 필요한 경우 1 비트맵을 차례로 스캔하여 K 개의 인접하거나 인접하지 않은 "0" 을 찾습니다. (2) 글꼴 크기와 비트 수를 기준으로 해당 디스크 블록 번호를 계산하고 해당 디스크 블록을 파일에 할당합니다. ③ 해당 비트를' 1' 으로 설정합니다. 재활용 방법: 1 회수된 디스크 블록 수를 기준으로 해당 글꼴 크기 및 위치 번호를 계산합니다. ② 해당 이진수를 "0" 으로 설정합니다
자유 목록 및 자유 목록 방법은 대형 파일 시스템에 적합하지 않습니다. 자유 목록 또는 자유 목록 테이블이 너무 클 수 있기 때문입니다. 유닉스 시스템은 그룹 연결 방법을 사용하여 디스크 유휴 블록을 관리합니다. 파일 볼륨의 디렉토리 영역에서 하나의 디스크 블록을 "하이퍼블록" 으로 사용하며, 하이퍼블록은 시스템 부팅 시 메모리를 읽어야 합니다. 메모리가 외부 스토리지의' 하이퍼블록' 데이터와 일치하는지 확인합니다.
시스템 생성 호출을 수행할 때 몇 가지 주요 매개변수를 제공해야 합니다.
운영 체제가 시스템 호출 생성을 처리할 때 주로 다음 두 가지 작업을 수행합니다.
삭제 시스템 호출을 수행할 때 몇 가지 주요 매개변수를 제공해야 합니다.
운영 체제가 삭제 시스템 호출을 처리할 때 주로 몇 가지 작업을 수행합니다.
일:
많은 운영 체제에서 사용자는 파일을 조작하기 전에 오픈 시스템을 사용하여' 파일 열기' 를 호출해야 하며 몇 가지 주요 매개변수를 제공해야 합니다.
운영체제가 오픈 시스템 호출을 처리할 때 주로 다음과 같은 몇 가지 작업을 수행합니다.
프로세스에서 파일 사용을 마치면 "파일 닫기" 가 필요합니다.
운영체제가 종료 시스템 호출을 처리할 때 주로 다음과 같은 몇 가지 작업을 수행합니다.
이 프로세스는 읽기 시스템 호출을 사용하여 쓰기 작업을 완료합니다. 어떤 파일 ('파일 열기' 작업을 지원하는 시스템에서는 열린 파일 테이블에서 파일의 인덱스 번호만 제공하면 됨), 읽은 데이터 양 (예: 1KB 읽기), 읽은 데이터가 메모리에 배치되는 위치를 지정해야 합니다. 운영 체제는 read 시스템 호출을 처리할 때 사용자 지정 크기의 데이터를 read 포인터가 가리키는 외부 스토리지에서 사용자 지정 메모리 영역으로 읽습니다.
프로세스가 write 시스템 호출을 사용하여 쓰기 작업을 완료하는 경우 어떤 파일 (파일 열기 작업을 지원하는 시스템에서는 파일 열기 테이블에 있는 파일의 인덱스 번호만 제공하면 됨) 과 쓸 데이터 양 (예: write 1KB) 을 표시해야 합니다. 운영 체제가 write 시스템 호출을 처리할 때 사용자 지정 메모리 영역에서 지정된 크기의 데이터를 다시 씁니다.
탐색 시간 (seek time) T S: 데이터를 읽고 쓰기 전에 헤드를 지정된 트랙으로 이동하는 데 필요한 시간입니다.
지연 시간 T R: 디스크를 회전하여 헤드를 대상 섹터에 배치하는 데 필요한 시간입니다. 디스크 속도를 r (rpm 또는 rpm) 로 설정하면 평균 지연 시간이 필요합니다.
전송 시간 T t: 디스크에서 데이터를 읽거나 디스크에 데이터를 쓰는 데 필요한 시간입니다. 디스크 속도가 r 이고, 이번 읽기/쓰기의 바이트 수가 b 이고, 트랙당 바이트 수가 n 이라고 가정합니다 .. 규칙
총 평균 액세스 시간 ta
지연 시간과 전송 시간은 모두 디스크 속도와 관련이 있으며 선형적으로 관련되어 있습니다. 회전 속도는 하드웨어 고유의 속성이므로 운영 체제에서 지연 시간과 전송 시간을 최적화할 수 없지만 운영 체제의 디스크 스케줄링 알고리즘은 탐색 시간에 직접적인 영향을 미칩니다.
프로세스가 디스크 액세스를 요청한 순서에 따라 일정을 잡습니다.
장점: 공정성 요청된 트랙이 집중된 경우 알고리즘의 성능이 허용됩니다.
단점: 많은 프로세스가 디스크 경합, 요청 트랙 분산, FCFS 성능 저하, 탐색 시간이 길어질 경우.
SSTF 알고리즘은 현재 헤드에 가장 가까운 트랙을 우선적으로 선택합니다. 매번 탐색 시간이 가장 짧다고 보장할 수는 있지만, 총 탐색 시간이 가장 짧다고 보장할 수는 없다. (사실 욕심 많은 알고리즘의 사상이다. 눈앞의 최고만 고르고, 전체가 반드시 최고는 아니다. (윌리엄 셰익스피어, 욕심, 욕심, 욕심, 욕심, 욕심) ) 을 참조하십시오
장점: 성능 향상, 평균 탐색 시간 단축
단점:' 배고픔' 이 나타날 수 있다.
SSTF 알고리즘은 헤드가 작은 범위 내에서 앞뒤로 움직일 수 있기 때문에 배가 고프다. 이 문제를 방지하기 위해 헤드가 가장 바깥쪽 트랙으로 이동할 때는 안쪽으로, 가장 안쪽 트랙으로 이동할 때는 바깥쪽으로 이동하도록 지정할 수 있습니다. 이것이 스캐닝 알고리즘의 아이디어입니다. 헤드가 움직이는 방식이 엘리베이터와 비슷하기 때문에 엘리베이터 알고리즘이라고도 합니다.
장점: 성능이 좋고 평균 탐색 시간이 짧아 배고픔이 없다.
단점: ① 헤드 이동 방향은 가장 바깥쪽 궤도에 도달할 때만 변할 수 있습니다. ② 스캐닝 알고리즘이 각 위치 궤적에 대한 응답 빈도가 고르지 않다.
스캐닝 알고리즘에서 헤드 이동 방향은 가장 바깥쪽 트랙에 도달할 때만 변경될 수 있습니다. 실제로 트랙 184 에 대한 액세스 요청을 처리한 후에는 헤드를 오른쪽으로 이동할 필요가 없습니다. 스케줄링 알고리즘이 이 문제를 해결하는 것 같습니다. 머리 이동 방향에 대한 추가 요구 사항이 없는 경우 머리 이동 방향을 즉시 변경할 수 있습니다. (움직이면서 관찰하기 때문에 보라고 합니다.)
장점: 스캔 알고리즘에 비해 매번 가장 바깥쪽 또는 가장 안쪽으로 이동하여 헤드 방향을 변경할 필요가 없으므로 탐색 시간이 더욱 단축됩니다.
스캔 알고리즘은 서로 다른 위치 트랙에 대한 응답 빈도가 고르지 않습니다. C 스캔 알고리즘은 이 문제를 해결하기 위한 것입니다. 헤드가 특정 방향으로 이동해야 트랙 액세스 요청이 처리되고, 반환 시 시작 부분으로 바로 이동하며, 요청을 처리하지 않도록 지정합니다.
장점: 각 위치의 궤적 응답 빈도는 스캔에 비해 매우 평균적입니다.
단점: 헤드 이동 방향은 가장 바깥쪽 트랙에 도달할 때만 변경할 수 있습니다. 또한 평균 탐색 시간은 스캐닝 알고리즘보다 길다.
C-스캔 알고리즘의 주요 단점은 헤드 이동 방향은 최외곽 트랙에 도달할 때만 변경할 수 있으며 헤드가 반환될 때 반드시 최외곽 트랙으로 돌아갈 필요는 없다는 것입니다. C-LOOK 알고리즘은 이 문제를 해결하기 위한 것이다. 헤드 이동 방향에 트랙 액세스 요청이 없는 경우 헤드는 즉시 반환될 수 있으며 헤드는 트랙 액세스 요청이 있는 위치로만 되돌아가면 됩니다.
장점: C 스캔 알고리즘에 비해 매번 가장 바깥쪽이나 가장 안쪽을 이동하여 헤드 방향을 변경할 필요가 없어 탐색 시간이 더욱 단축됩니다.
디스크 주소 구조 설계
Q: 디스크의 물리적 주소는 (디스크 번호, 실린더 번호, 섹터 번호) 가 아니라 (실린더 번호, 디스크 번호, 섹터 번호) 입니다.
A: 주소 구조 (실린더 번호, 디스크 번호 및 섹터 번호) 를 사용하면 연속 주소가 있는 디스크 블록을 읽을 때 헤드 이동에 소요되는 시간을 줄일 수 있습니다.
지연 시간을 줄이는 방법:
1: 저수준 포맷 (물리적 포맷) 을 수행하고 디스크의 각 트랙을 섹터로 나눕니다. 섹터는 일반적으로 헤더, 데이터 영역 (예: 5 12B 크기) 및 꼬리의 세 부분으로 나눌 수 있습니다. 섹터를 관리하는 데 필요한 다양한 데이터 구조는 일반적으로 패리티, CRC 순환 중복 검사 코드 등과 같은 섹터 검사 코드를 포함하여 머리와 꼬리 부분에 저장됩니다. 검사 코드는 섹터의 데이터에 오류가 있는지 확인하는 데 사용됩니다.)
두 번째 단계: 디스크를 파티셔닝합니다. 각 파티션은 여러 개의 실린더 (친숙한 CD, D 디스크, E 디스크) 로 구성됩니다.
3 단계: 논리적 포맷 및 파일 시스템 생성. 파일 시스템의 루트 디렉토리를 만들고 스토리지 공간 관리를 위한 데이터 구조 (예: 비트맵 및 사용 가능한 파티션 테이블) 를 초기화하는 작업이 포함됩니다.
컴퓨터 전원을 켤 때 초기화 프로그램 (bootstrap 프로그램) 을 실행하여 수행되는 일련의 초기화 작업이 필요합니다.
초기화 프로그램은 ROM (읽기 전용 메모리) 에 배치할 수 있습니다. ROM 의 데이터는 공장에서 작성되었으며 나중에 수정할 수 없습니다. ROM 에는 작은 bootloader 하나만 저장되고 전체 bootloader 는 디스크의 부트 블록 (boot block/boot partition) 에 있으며 디스크의 고정 위치에 있습니다. 컴퓨터가 켜질 때 먼저 bootloader 를 실행합니다. 프로그램을 실행하여 부트 블록을 찾아 전체 bootloader 를 메모리로 읽어 초기화를 완료할 수 있습니다. 부팅 파티션이 있는 디스크를 부팅 디스크 또는 시스템 디스크 (C: disk) 라고 합니다.
간단한 디스크의 경우 논리적 포맷 중 (파일 시스템 설정 시) 전체 디스크의 손상된 블록을 검사하여 어떤 섹터가 나쁜지 (예: FAT 테이블) 를 나타낼 수 있습니다. 이런 식으로 손상된 블록은 운영 체제에 불투명하다.
복잡한 디스크의 경우 디스크 컨트롤러 (디스크 디바이스 내부의 하드웨어 구성 요소) 가 손상된 블록 체인 테이블을 유지 관리합니다. 불량 청크 체인은 출하 전에 디스크가 저수준 포맷 (물리적 포맷) 되면 초기화됩니다. 손상된 블록을 교체하기 위해 일부 "예비 섹터" 가 유지됩니다. 이 시나리오를 섹터 백업이라고 합니다. 이런 식으로 손상된 블록은 운영 체제에 투명합니다.