ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14. 저장 장치와 파일 시스템
    운영체제 2022. 8. 20. 21:27

     

     

    RAID 시스템

    RAID 0

    하나의 데이터를 2개의 디스크에 분할하여 저장하는 방법입니다.

     

    코드로 예시를 들어보겠습니다.

    int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    int[] disk1 = new int[10];
    int[] disk2 = new int[10];

     

    이 같은 배열 2개가 있을 때, 번갈아 가면서 값을 저장합니다.

     

    // 짝수 번째 데이터는 disk1,
    // 홀수 번째 데이터는 disk2에 저장
    for (int i = 0; i < 10; i++) {
    	if (i % 2 == 0) {
        	disk1[i] = data[i];
        } else {
        	disk2[i / 2] = data[i];
    }

     

    위 방식을 디스크에 적용시킨 것이 RAID 0이며 스트라이핑(Striping)이라고도 합니다.

     

    두 개의 디스크를 동시에 사용하여 데이터를 저장하기 때문에 쓰기 속도가 상승합니다.

    반대로 그 말은 하나의 디스크라도 고장나면 데이터를 복구할 수 없다는 말이 됩니다.

     

    그러므로 RAID 0은 다른 방법과 결합, 보완하여 사용하거나

    안전성보다 속도가 중요한 상황에서 사용할 수 있습니다.

     

     

    RAID 1

    RAID 0과 반대로 안전성을 확보하는 방법입니다.

    디스크 두 개에 완전히 동일한 데이터를 작성하여 백업을 만듭니다.

     

    for (int i = 0; i < 10; i++) {
        disk1[i] = data[i];
        disk2[i] = data[i];
    }

     

    디스크의 백업이 생기는 것이기 때문에 하나의 디스크가 고장나더라도 다른 디스크의 정보는 온전하게 보존됩니다.

    하지만 실질적으로 사용하는 공간은 1개이기 때문에 효율성이 떨어집니다.

     

     

    RAID 1 또한 다른 방법과 결합, 보완하여 안전성을 향상시킬 수 있습니다.

     

     

    RAID 2, 3, 4

    RAID 0을 기반으로, 각각 새로운 디스크에 패리티 비트, 워드, 블록을 추가한 방법입니다.

     

    RAID에서 패리티란, 오류가 발생했을 경우 데이터를 복구할 수 있도록

    디스크의 데이터 값들을 일정한 연산을 통해 새로운 값을 만들어 내는 것을 말합니다.

     

    disk1[0] = 1;
    disk2[0] = 2;
    
    // 패리티 비트
    disk3[0] = disk1[0] + disk2[0];

     

    만약 disk1이나 disk2 중 어떤 것이 고장나도 각각 3 - disk2[0], 3 - disk1[0]을 통해

    고장난 디스크의 데이터를 찾을 수 있습니다.

     

    RAID 2가 비트 단위로 패리티 디스크에 저장한다면,

    3은 바이트(8bit) 단위, 4는 블록(워드, 16bit) 단위로 패리티 디스크에 저장합니다.

     

     

     

    RAID 5, 6

    패리티 디스크를 새로 구성하는 것이 아닌, 사용하는 디스크들에 패리티 정보를 나누어 저장합니다.

     

    disk1[0] = 1;
    disk2[0] = 2;
    disk3[0] = disk1[0] + disk2[0]; // 패리티
    
    disk1[1] = 3;
    disk2[1] = disk1[1] + disk2[1]; // 패리티
    disk3[1] = 4;
    
    disk1[2] = disk1[2] + disk2[2]; // 패리티
    disk2[2] = 5;
    disk3[2] = 6;
    // 이해를 돕기위해 코드 순서는 바꾸지 않았습니다.

     

    공간 효율과 안전성을 동시에 높여 가장 무난한 방법으로 많이 사용되는 구성입니다.

     

    RAID 6은 RAID 5에서 패리티를 한 개 더 추가해서 두 개를 사용합니다.

    1개의 디스크 오류만 대처 가능한 RAID 5에 비해

    RAID 6은 2개의 디스크 오류까지 대처가 가능합니다.

     

     

    RAID 01 (0 + 1)

    RAID 0을 기반으로 RAID 1을 적용시킨 구조입니다.

     

    // ----------RAID 1------------
    
    // RAID 0
    for (int i = 0; i < 10; i++) {
    	if (i % 2 == 0) {
        	disk1[i] = data[i];
        } else {
        	disk2[i / 2] = data[i];
    }
    
    // RAID 0
    for (int i = 0; i < 10; i++) {
    	if (i % 2 == 0) {
        	disk3[i] = data[i];
        } else {
        	disk4[i / 2] = data[i];
    }
    // ----------RAID 1------------

     

    간단히 말하면, 디스크 3, 4가 디스크 1, 2의 백업이 되는 것입니다.

     

     

    RAID 10 (1 + 0)

    RAID 1을 기반으로 RAID 0을 적용시킨 구조입니다.

     

    RAID 01을 반대로 생각하시면 됩니다.

    // ----------RAID 0------------
    
    // RAID 1
    for (int i = 0; i < 10; i++) {
    	if (i % 2 == 0) {
        	disk1[i] = data[i];
        	disk2[i] = data[i];
        }
    }
    
    // RAID 1
    for (int i = 0; i < 10; i++) {
    	if (i % 2 != 0) {
        	disk3[i] = data[i];
        	disk4[i] = data[i];
        }
    }
    // ----------RAID 0------------

     

    disk1, 3은 원본 데이터를 저장하고, disk2, 4가 데이터를 백업합니다.

     

    RAID 01에 비해 RAID 10이 더 효율적이고 안전성이 뛰어납니다.

     

     

     

    RAID 50, 60

    RAID 5, 6을 기반으로 RAID 0을 적용시킨 구조입니다.

     

    안전성을 확보하고, 더 많은 비용으로 효율성을 확보하기 위해 사용합니다.

     

    출처)&nbsp;https://smsinfo.tistory.com/177

     

    RAID 5 이상부터는 구성이 복잡하고 비용이 많이 소모되기 때문에 

    주로 서버를 구축할 때 사용됩니다.

     

     

     

     

    파일 시스템

     

    먼저 파일의 개념을 알아보고 가겠습니다.

     

    파일이란 작성자가 정의한 상호 관련이 있는 정보의 집합체로서, 보조 기억 장치의 기본적인 단위가 되고,

    보통 프로그램과 데이터로 구성되어 있습니다.

     

    즉, 하나의 개체가 정의될 수 있는 바이트-스트림(비트의 나열)의 집합인 것입니다.

     

     

    파일을 구성에 따라 분류하면 다음과 같이 나눠집니다.

    • 순차 파일(Sequential File) :
      기억 장치에 순서대로 저장된 파일입니다.
      저장할 때 비용이 적게 들지만
      파일을 탐색하거나 변경할 때 비용이 많이 소모됩니다.


    • 인덱스된 순차 파일(Indexed Sequential File)
      순서대로 저장되고, 키 값 인덱스를 통해 각 레코드에 접근할 수 있는 파일입니다.
      순차 파일의 단점을 보완했지만
      설계 시 고려할 사항이 많습니다.


    • 직접 파일(Direct File)
      키 값을 해싱하여 주소를 계산하여, 물리 기억 장치의 해당 기억 장소로 바로 접근합니다.
      탐색할 때 레코드에 바로 접근하여 CRUD가 빠르지만
      순차 검색에서 비용이 많이 소모됩니다.

     

     

     

    파일 시스템은 이러한 파일을 관리하는 기능을 제공합니다.

    • 사용자가 이용하기 편리하도록 인터페이스(UI)를 제공합니다.

    • 사용자가 파일을 생성, 수정, 제거(CRUD)를 할 수 있도록 합니다.

    • 타인과 파일을 공유할 수 있도록 적절히 제어합니다.

    • 사용자가 임의대로 파일을 구성할 수 있게 합니다.

    • 파일 간에 정보 전송을 할 수 있도록 합니다.

    • 파일의 백업과 복구, 암호화와 복호화 기능을 제공합니다.

    • 디렉토리를 생성하고 제공하여 사용자가 편리하게 사용하도록 합니다.

     

     

     

    파일 시스템은 운영체제 별로, 버전 별로 사용하는 종류가 달라집니다.

    • FAT - Windows를 비롯한 다양한 시스템 :
      파일의 정보(위치, 공간 여유 등)를 담은 테이블을 이용합니다.
      단순 연결 리스트(SIngly Linked List)로 구현하여 구조가 매우 단순합니다.
      그 덕에 많은 시스템에서 사용되는 파일 시스템이지만
      성능이 좋지 못합니다.


    • NTFS - Windows :
      FAT을 보완한 시스템입니다.
      작은 용량만을 지원하는 FAT에 비해 대용량을 지원합니다.
      윈도우에 최적화 되어 있고, 다른 OS에서의 사용에는 제한이 있습니다.


    • ext - Linux :
      주로 리눅스에서 사용하는 파일 시스템입니다.
      업그레이드를 통해 ext4 버전까지 출시되었습니다.


    • HFS - Mac OS,
      APFS - Apple :
      매킨토시의 파일 시스템으로 HFS를 사용하였으며,
      HFS의 개량형으로 APFS를 출시했습니다.
      APFS는 맥 뿐만 아니라 IOS 등 애플의 다양한 기기와 호환되는 파일 시스템입니다.

     

     

     

     

    파일 시스템(운영체제) 별로 확장자를 대하는 방식이 다릅니다.

     

    Windows

    보통 확장자와 파일의 내용을 일치하도록 합니다.

    .exe라면 실행 파일, .mp4라면 동영상 파일인 것처럼요.

     

    UNIX

    확장자와 파일의 내용이 완전히 독립적입니다.

    파일명이 execute.exe라고 해서 이것이 실행 파일인지, 그림 파일일지는 알 수 없습니다.

    하지만 현재는 편의성을 위해 확장자와 내용을 일치시키는 편입니다.

     

    Mac OS

    폴더에 확장자를 붙이면 해당 확장자의 방식처럼 작동하게 할 수 있습니다.

    실제로는 눈속임으로, 파일을 확인해보면 폴더로 정상 작동함을 알 수 있습니다.

     

     

     

    참고 자료 

    https://melonicedlatte.com/computerarchitecture/2020/03/02/204500.html

    '운영체제' 카테고리의 다른 글

    13. 가상 메모리 관리  (0) 2022.08.20
    12. 가상 메모리  (0) 2022.08.18
    11. 메모리 관리  (0) 2022.08.17
    10. 프로세스 간 통신  (0) 2022.08.16
    09. 프로세스 스케줄링  (0) 2022.08.13

    댓글

Designed by Tistory.