기본 데이터 구조로서 (계층 적) 파일 시스템과 어떻게 안장을 이루었습니까?


19

나는 독학이고 CS 학위가 없습니다. 데이터 구조에 대해 더 많이 배우면서 요즘 시대에 OS의 기본 데이터 스토리지 구조로 파일 시스템, 디렉토리 및 파일을 어떻게 안장하고 있습니까?

나는 그것의 단순성을 이해하지만 요즘에는 기본적으로 더 많은 옵션이있을 수 있습니다. 내가 아는 한, 파일 시스템의 기본 기능을 향상시키는 유일한 프로젝트는 ReiserFS뿐입니다. 여기서 파일의 줄을 누가, 언제 변경했는지 알 수 있습니다.

예를 들어, 이미지, 다이어그램, 워드 프로세싱 문서, 전체 코드 리포지토리를 모두 단일 프로젝트에 속하는 태그를 지정할 수있는 파일에 대한 고유 태그를 지정할 수 있다면 실제로 도움이 될 것입니다. 파일 시스템 패러다임에 갇혀 있기 때문에 모든 폴더를 단일 폴더 / 디렉토리에 넣을 수는 있지만 이미 다른 디렉토리에 있으면 어떻게해야합니까? 나는 이것을 할 수있는 프로그램이 있다는 것을 알고 있지만 왜 파일 시스템에 있지 않습니까?

RDBMS와 마찬가지로 파일 시스템의 일종의 관계형 기능이 있으면 좋을 것입니다. Vista / 7의 일부인 것으로 생각되었지만 기능 목록에서도 떨어졌습니다.

물론 어떤 프로그램이든 바이너리 파일을 저장할 수 있고 원하는 데이터 구조를 가질 수 있습니다. 왜 OS가 파일 시스템의 단순한 계층 구조를 넘어서 더 복잡한 데이터 저장 방법을 제공 할 수 없었습니까?


2
그것의 핵심은 간단해야합니다. 언급 한 선택적인 팽창은 간단한 핵심 위에 있어야합니다. 또는 20 년이 지나면 누군가 파일 시스템의 개념을 다시 발명하게됩니다.
Job

3
"이미 다른 디렉토리에 이미 존재하고 그대로 있어야한다면 어떨까요?" 때때로 당신은이 문제를 해결하기 위해 하드 링크를 사용할 수 있습니다 ...
FrustratedWithFormsDesigner


3
실제로 Windows 7의 솔루션은 아니지만 새로운 라이브러리는 여러분이 관심있는 기능 중 일부를 제공 할 수 있습니다. lifehacker.com/#!5464350/…
DKnight

1
한 번에 두 개의 다른 폴더에 파일을 저장하려면 해당 파일에 대한 바로 가기를 한 파일에 넣습니다. 단점은 해당 폴더 / 파일을 재배치하면 바로 가기가 유효하지 않다는 것입니다.
Mateen Ulhaq

답변:


17

이것으로 시작하십시오 : http://en.wikipedia.org/wiki/Unix_File_System

이것을 읽으십시오 : http://www.unix.org/what_is_unix/history_timeline.html

그런 다음 이것을 읽으십시오 : http://www.amazon.com/UNIX-Filesystems-Evolution-Design-Implementation/dp/0471164836

"OS가 파일 시스템의 단순한 계층 구조를 넘어서 더 복잡한 데이터 저장 방법을 제공 할 수 없었던 이유"에 대한 간단한 대답이 있습니다.

OS가 할 일이 너무 많기 때문입니다.

이것이 바로 라이브러리와 응용 프로그램 패키지입니다.

예를 들어, Oracle은 Oracle 툴셋으로 관리하는 파일 시스템과 유사한 기능 세트를 판매합니다.

파이썬은 DBM 라이브러리를 사용하여 매우 정교한 온 디스크 스토리지 구조를 만듭니다.

CouchDB 및 Mongo (및 기타)는 데이터베이스와 유사한 기능을 제공하는 매우 정교한 스토리지 구조입니다.

요점은 OS가 최소한으로해야하며 모든 것이 애드온이라는 것입니다.


4
동의합니다. 실제로 OP가 요청한 많은 것들이 죽거나 죽어가는 WinFS 프로젝트 ( en.wikipedia.org/wiki/WinFS)에 있습니다. 괴짜가 말하는 것처럼 'Neat!' 저의 숙련 된 사용자 및 소프트웨어 엔지니어는 "너무 열심히 노력하고 있습니다!"라고 말합니다.
Adam Crossland

6
"핵심은 OS가 최소한으로해야하며 모든 것이 애드온이라는 점입니다." 일부 운영 체제에는 내장 창 시스템, 파일 인덱싱 서비스, 미디어 플레이어, 원격 데스크톱, 방화벽 또는 Netris가 포함되어있는 시대에 대담한 진술입니다.
biziclop

1
@biziclop : 동의합니다. Windows는 Linux 관점에서 분기되었습니다. 놀라운 것은 없습니다.
S.Lott

1
@ S.Lott 실수하지 마십시오. 귀하의 접근 방식에 동의하지만 Windows는 어쨌든 쓸모없는 쓰레기로 가득 차 있습니다. 하나의 추가 기능은 차이가 없습니다. :)
biziclop

4
이것이 유닉스 철학입니다. 반드시 옳은 것은 아닙니다. 유닉스를 하드웨어로 쉽게 포팅 할 수있게 해준다. 또한 사람들이 유닉스를 오늘날 우리가 찾은 -ix와 같은 맛으로 복제 할 수있을 정도로 간단합니다. 기능이 유용하고 맞춤법 검사 입력 필드와 같이 모든 프로그램에서 기능이 필요한 경우 런타임 환경에서이를 제공하는 데 가치가 있습니다. 400 개의 독립적 인 버전의 리본 바가 필요하지 않습니다.
Tim Williscroft 2016 년

8

짧은 대답은 : 매일 사람들은 파일 시스템을 이해합니다. 파일 캐비닛을 상기시킵니다. 웹 페이지와 팻 앱에 대해 생각해보십시오. 왜 Tabs그렇게 인기가 있다고 생각 하십니까? 사람들은 그들과 함께 식별하고 빨리 이해할 수 있습니다.

Grandma에게 속성 태그를 기반으로 File에 대한 DB를 검색하도록 가르치려고하는 영상. 파일 시스템을 통해 Grandma는 파일이 어디에 있는지 알고 있습니다 .

WinFS를 사용하더라도 MS가 파일 시스템의 모양과 느낌을 없애지 않을 것이라고 생각합니다.


9
나는 이것에 동의하지 않는다. 파일 시스템을 탐색하지 않는 대부분의 사람들은 그렇게하지 않습니다. 워드 프로세서를 열고 최근 문서를 클릭하거나 Windows 7의 시작 메뉴 등을 검색합니다. 많은 사람들이 파일을 어디에 두 었는지 추적하지 못합니다. 할머니가 "쿠키 레시피"또는 "손자 사진"또는 폴더 계층 구조를 유지하는 것보다 훨씬 쉽게 검색 할 수 있습니다.
Matthew 읽기

16
일상적인 사람들은 파일 시스템을 이해하지 못합니다. 그들은 아이디어가 희미하지 않습니다. 그리고 마운트 포인트, 심볼릭 링크 및 하드 링크가있는 유닉스 스타일 FS를 의미하는 것이 아니라 파일이 포함 된 늪지 표준 디렉토리 구조를 의미합니다.
biziclop

2
@Morons, 할머니는 물건을 어디에 두는지 전혀 몰라 Gmail은 이미 원하는 패러다임을 태그 시스템으로 전환했으며, 특히 자동으로 태그를 지정하는 필터를 사용했습니다. 파일 시스템 패러다임은 프로그래밍 트리 구조의 단순성으로 인해 크게 구현되었다고 생각합니다. 또한 프로그래밍 관점에서보다 쉽게 ​​주소를 지정할 수 있습니다. 태그 기반 시스템에서 문서의 위치를 ​​어떻게 지정 하시겠습니까? 할 수는 없지만 세부 사항을 다룰 필요가 있습니다.
zzzzBov

3
캐비닛 자체의 작동에 필요한 수천 개의 폴더와 문서로 가득 찬 파일 캐비닛을 구입합니까? 서랍을 꺼낼 때마다 파일 캐비닛이 다른 위치에서 열리는 것처럼 보입니까? 기타 등등 나는 Matthew와 biziclop에 동의합니다 – "매일"사람들 은 그것을 얻지 못합니다 .
Nicole

2
나는 CS 학위가 있습니다. 그러나 Windows가 어떤 파일을 넣을 폴더를 알 수 없습니다. 특히 데스크탑, 시작 메뉴, QuickLaunch 및 기타 모든 사용자 / 시스템 특정 기본 폴더. (M $ -Help 시스템은 버튼을 누르는 방법을 설명하는 데 도움이되지 않습니다.) 최신 M $ 검색 기능이 더 이상 간단한 기존 파일을 찾지 않기 때문에 CygWin을 설치하여 내 파일을 검색 할 수 있어야합니다. win2k에. hide-system-files, hide-file-extensions와 같은 잘못된 기능을 비활성화해도 더 이상 대부분의 문제를 해결할 수 없습니다. 나는 (새로운) winXP 작업을 강요 받았을 때 Windows를 포기했습니다.
comonad

6

여기에 모든 대답에 약간의 진실이 있지만 그것이 전부 진실이라고 생각하지 않습니다.

당신이 나열하는 것은 대부분 사용자와 개발자 모두가 매일 그리워하는 기능입니다.

사람들은 DAG 기반 파일 시스템을 이해하는 것보다 트리 기반 파일 시스템을 더 이상 이해하지 못합니다.

그리고 확장명이라는 파일 이름의 애매한 추가에 대한 변명은 전혀 없습니다. 그것들은 파일 형식을 식별하는 목적에 완전히 부적합 할뿐만 아니라 사용자에게 끝없는 성가신 소스입니다.

우리가 여전히 그것들을 사용하는 이유는 "할 것이다"태도와 이전 코드와의 호환성을 유지하기위한 실질적인 필요성이 혼합되어 있기 때문입니다. 파일 저장에 대한 새로운 접근 방식은 기본 파일 I / O API의 급격한 변화를 의미하며 대부분의 기존 코드를 쓸모 없게 만듭니다. 그 중 하나이거나 레거시 API를 유지하면서 발끝을 내야합니다. PROGRA ~ 1을 기억하십시오.

미래에는 특수 응용 프로그램을 위해 더 전문화 된 파일 시스템을 보유 할 수 있지만 현재의 데스크톱 및 랩톱 PC 아키텍처는 살아남지 만 메타 데이터와 그 끔찍한 작은 확장.


이제 측면을 바꾸겠습니다.

그것이 우리 주변에 있기 때문에, 우리는 나무의 은유가 얼마나 놀랍게도 강력하다는 것을 결코 감사하지 않습니다. 내 하드 드라이브에는 수십만 개의 파일이 있습니다. 하나를 찾아야 할 경우 파일에 대해 거의 알지 못하더라도 1 분 이상 걸리지 않습니다. 이제 구조가없고 동일한 이름의 목록 만 있고 끝없이 스크롤되는 동일한 작업을 상상해보십시오.

그러나 모든 작전은 간단하고, 먼 거리에서 짜증나는 행동은 없습니다.

실제로, 풍부한 메타 데이터와 DAG 기반 계층 구조로 문서 저장소를 한 번 구현했습니다. (자유형 DAG조차 아니었고, 엄격하게 2 단계 메타 구조이며 문서는 레벨 1 또는 레벨 2 컬렉션의 하위 항목이 될 수 있습니다. 따라서 매우 간단합니다.)

분명히, 문서 이름이 컬렉션 내에서 고유해야한다는 요구 사항이 유지되어야했습니다.

그리고 문제가 시작되었습니다. 컬렉션을 열고 문서의 이름을 문서가 속한 다른 컬렉션과 충돌하는 이름으로 변경하면 어떻게 되나요? 오류 메시지가 표시되었지만 사용자가 완전히 당황했습니다. (이 요구 사항을 요청한 동일한 사용자입니다.)

그들은 문서를 삭제하려고 시도했지만, 그 모든 것은 컬렉션에서 문서를 제거하기 만했습니다. 따라서 여전히 검색 결과에 나타납니다. 우리는 다른 방법으로 시도했지만 컬렉션 A에서 문서를 삭제하고 컬렉션 B에서 마술처럼 사라 졌다고 불평했습니다. 따라서 "링크 해제"와 강제 삭제 작업이 모두 필요했습니다.

결국 우리는 운 좋게도 여전히 제 시간에 패배를 인정했습니다.

메타 데이터가 가능해지면서 추가 검색이 가능해졌지만 절대적인 대우를 받았습니다.


5MB 하드 드라이브의 Rememebr CP / M? 수백 개의 파일이 스크롤되어지나갑니다. 무서운!
quick_now

@quickly_now Ah, 좋은 오래된 CP / M. :)
biziclop

3

솔직히 말하면, 나는 Mac에서 파일의 메타 데이터를 거의 만지지 않습니다. 지난 5 년 동안 OSX (댓글 등을 지원하는)를 사용했을 때 아마도 2 개의 파일에서 메타 데이터를 사용했다고 생각합니다. 나쁜 생각은 아닙니다.

태그 지정 오버 헤드가 어떻게 실용적인지 잘 모르겠습니다.

내가 아는 가장 좋은 파일 시스템 기능은 파일 시스템 수준 버전 관리 시스템 일 것입니다 ... 그것은 70 년대와 80 년대 초 VAXen에서 이루어졌으며, 왜 Unix와 NTFS / Windows를 따라 잡지 않았는지 확실하지 않습니다.


최신 버전의 NTFS / Windows 는 버전 관리 기능을 제공합니다. 그것은 정확히 당신의 얼굴에 있지는 않지만 존재합니다. 그래도 VMS와 어떻게 비교되는지 말할 수 없습니다.
Shog9

2

HP3000 및 Encore / Gould와 같은 구형 미니에서 비 계층 파일 시스템으로 작업했습니다. 디렉토리가 없었습니다. 당신은 그룹 및 계정을 가지고 및 파일은 다음과 같이 "라는 한 그룹 . 계정 . 파일 "users.jbode.myfile1 ","dev.jbode.main "등처럼"

이제 이들은 개별 디스크 공간 할당량이 단일 메가 바이트 로 된 오래된 시스템이므로 물건을 구성하는 데 너무 많은 수준이 필요하지는 않지만 사용자와 프로그래머의 관점에서 보면 계층 적 시스템이 훨씬 좋습니다.


1

현재 파일 시스템이 (적어도 일부) 실제로 태그를 지원하기 위해 많은 부분을 편집해야하는 것을 보지 못했습니다. 당신은 관련된 몇 가지 여분의 데이터보다 조금 더 많은 태그 수단을 지원하고, 그것을 내려 할 때 파일 만 바이트의 스트림으로 기록되지 않습니다 에 대한 해당 파일.

NTFS ( 광범위하게 사용 되는 하나의 예를 선택 하기 위해)는 그렇게 할 수 있습니다. NTFS가 관심을 갖는 한 파일은 반드시 단일 바이트 스트림 일 필요는 없습니다. NTFS에서는 임의의 수의 데이터 스트림을 단일 파일 이름과 연결할 수 있습니다. 각 파일에는 이름이없는 (기본 비어 있음) "기본 스트림"이 있습니다. 그러나 또한 임의의 수의 다른 스트림을 가질 수 있으며 각 스트림에는 이름이 있어야합니다. 이것을 사용 하면 기존 파일에 "tags"라는 이름의 스트림을 추가하고 태그를 해당 스트림에 작성하는 것이 정말 간단 합니다.

그 후에는 다소 어려운 부분이 생깁니다. 도구를 사용하여 태그를 활용하는 것입니다. 이상적으로는 빠른 검색을 위해 색인을 생성하고 싶을 수 있으므로 특정 태그가있는 모든 파일의 "가상 디렉토리"를 만드는 것과 같은 작업을 수행 할 수 있습니다.

적어도 내 관점에서 볼 때 파일 시스템에는 이미 필요한 것이 있습니다. 데이터를 저장하고 검색해야하며 지금 당장 완벽하게 수행 할 수 있습니다. 해당 데이터를 활용하는 것은 다른 도구의 역할입니다. 이러한 도구는 현재 존재하지 않지만이를 지원하는 파일 시스템 인프라는 존재합니다.

내가 냉소적으로 허용된다면, NTFS의이 기능이 거의 완전히 무시되고 알려지지 않은 채로있을 수밖에 없다고 말하고 싶습니다. 결국, 사용이 간단하고 특별한 API 또는 다른 것이 필요하지 않습니다. 완전히 이식 가능한 C, C ++ 또는 임의의 파일 이름을 지정할 수있는 다른 것에서 아주 잘 사용할 수 있습니다. 다음은 AFS를 사용하여 파일을 작성하는 방법을 보여주는 간단한 코드입니다.

#include <fstream>

int main() {
    std::ofstream out("test.txt");
    std::ofstream tag("test.txt:tags");

    out << "This is the output file";
    tag << "tag1 tag2";

    return 0;
}

태그를 읽고 표시하는 코드는 다음과 같습니다.

#include <fstream>
#include <iterator>
#include <iostream>
#include <string>

int main() { 
    std::ifstream tags("test.txt:tags");

    std::copy(std::istream_iterator<std::string>(tags),
          std::istream_iterator<std::string>(),
          std::ostream_iterator<std::string>(std::cout, " "));
    return 0;
}

매우 간단하고 쉽습니다. 비록 거기에 사소한 비트의 데이터 만 작성했지만 AFS를 다른 파일과 같이 취급 할 수 있습니다. 모든 일반적인 "소재"는 다른 것과 마찬가지로 작동합니다. 일반 디렉토리 표시에서 모든 것은 1 차 스트림 (예 : 파일에 표시된 크기는 1 차 스트림의 크기 임)이지만,보고 싶다면 대체 스트림에 대한 정보도 표시 dir 할 수 있습니다. 와 /R플래그. 예를 들어, 위에서 만든 파일 목록은 다음과 같습니다.

03/16/2011  08:22 PM                23 test.txt
                                     9 test.txt:tags:$DATA
               1 File(s)             23 bytes

1
DIR은 그것을 보여줄 수도 있지만, 대체 스트림을 가진 파일의 백업은 특히 다른 시스템에서는 끔찍한 일입니다. 예를 들어 오늘날 대부분의 NAS 드라이브는 Linux를 사용하며 파일 시스템은 대체 스트림을 전혀 처리하지 않습니다. 파일을 복사하면 ... 모든 대체 항목이 사라집니다.
quick_now

그렇습니다. 대부분의 NAS 시스템은 다소 어려움을 겪었습니다. (그리고 이것이 유일한 방법은 아닙니다). 실제 백업 및 복원 종류의 경우 문제는 발생하지 않지만 (적어도 문제의 소프트웨어가 유능하게 작성 된 경우) : BackupRead모든 스트림을 직렬화 BackupWrite하고 파일에서 (대체 스트림으로) 파일을 재구성합니다 직렬화 된 형식.
Jerry Coffin

백업 된 파일을 NAS에서 직접 읽을 수 있는지 여부에 따라 다릅니다. 그렇게하면 (특별한 복원 프로그램이 필요하지 않은 경우) 일반 OLE 파일이 붙어 있습니다.
quick_now
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.