“모든 것이 파일”인 이유가 Unix 운영 체제에 고유 한 이유는 무엇입니까?


70

나는 사람들이 "유닉스의 유일한 철학은 모든 것을 파일로 취급한다는 것"또는 "유닉스에서는 모든 것이 파일이다"라는 말을 자주 듣는다. 그러나 유닉스 고유의 이유를 설명하는 사람은 없습니다.

그렇다면 왜 이것이 유닉스 고유의 것입니까? Windows 및 Mac과 같은 다른 운영 체제는 파일에서 작동하지 않습니까?

그리고 다른 운영 체제와 비교하여 독특합니까?


26
참고 사항 : macosx는 유닉스 맨 위에서 실행됩니다.
akira

2
하위 레벨 Windows는 핸들 주위에 내장되어 있지만, 상위 레벨의 항목은 파일 (* nix의 dbus 또는 X와 같은)을 사용하지 않습니다. * nix (열기, 닫기, 제어 및 일반적으로 보내기 / 받기)에있는 파일처럼 많은 작업을 수행 할 수 있지만 해당 인터페이스를 보려면 프로그래머 여야합니다. 그것이 좋은지 여부는 선호의 문제입니다.
Mark

1
네트워크 인터페이스를 제외한 모든 것이 파일입니다.
alvin dec

8
@akira-OSX는 유닉스 인증을 받았으며 "위에서"실행되지 않습니다.
Rob

1
@akira 유닉스 위에는 없다. OSX는 몇 가지 인증 된 UNIX OS 중 하나입니다.
Let_Me_Be

답변:


53

그렇다면 왜 이것이 유닉스 고유의 것입니까?

일반적인 운영 체제는 Unix 이전의 파일을 한 방향으로 처리하고 해당 장치의 특성에 따라 각 주변 장치를 처리했습니다. 즉, 프로그램의 출력이 디스크의 파일에 기록 된 경우 출력이 갈 수있는 유일한 위치입니다. 프린터 나 테이프 드라이브로 보낼 수 없습니다. 각 프로그램은 입력 및 출력에 사용되는 각 장치를 알고 있어야하며 대체 I / O 장치를 처리하기위한 명령 옵션이 있어야합니다.

유닉스는 모든 장치를 파일로 취급하지만 특별한 속성을 가지고 있습니다. 프로그램을 단순화하기 위해 표준 입력표준 출력 이 프로그램의 기본 입력 및 출력 장치입니다. 따라서 콘솔 화면 용으로 의도 된 프로그램 출력은 어느 곳에서나 디스크 파일 또는 프린터 또는 직렬 포트로 이동할 수 있습니다. 이를 I / O 리디렉션 이라고 합니다.

Windows 및 Mac과 같은 다른 운영 체제는 파일에서 작동하지 않습니까?

물론 모든 최신 OS는 다양한 파일 시스템을 지원하고 "파일에서 작동"할 수 있지만 장치는 어떻게 처리됩니까? Mac에 대해 모르지만 Windows는 일부 I / O 리디렉션을 제공합니다.

그리고 다른 운영 체제와 비교하여 독특합니까?

더 이상은 아닙니다. 리눅스는 같은 기능을 가지고 있습니다. 물론 OS가 I / O 리디렉션을 채택하면 다른 Unix 기능을 사용하는 경향이 있으며 결국 Unix와 유사하게됩니다.


29
OS X는 기본적으로 Unix이므로 별 차이가 없습니다.
slhck December

6
좀 더 모든 파일 모델.
artistoex

1
첫 단락은 사실이 아닙니다. Unix 이전에는 운영 체제가 있었고 나중에 I / O 리디렉션을 포함하여 Unix에서 발견 된 기능이있었습니다.
패트릭 시모어

3
계획 9는 같은 개념을 가짐 모든 것이 파일 개념이며 심지어 "더 많은 유닉스보다 유닉스"라고 불려 짐
William

2
Windows (NT 이후)는 조금 더 나아갑니다. 직렬 포트 및 명명 된 파이프와 같이 파일처럼 작동하는 많은 장치가 있습니다. 를 사용하여 모두에게 쓸 수 있습니다 WriteFile. 또한 파일뿐만 아니라 뮤텍스도 포함하는 "동기화 객체"범주가 훨씬 더 넓습니다.
MSalters

34

"모든 것이 파일"이라는 아이디어는 Multics에서 나왔습니다. 유닉스의 디자이너는 전임자, 특히 Multics에 대한 많은 작업을 기반으로했습니다. 실제로, 컴퓨팅의 많은 것들이 전임자를 기반으로합니다.

데니스 리치 (Dennis Ritchie)의 유닉스 디자인에 대한 자세한 내용을 읽어보십시오. 그는 트리와 같은 파일 시스템, 명령 셸 및 파일의 비 구조화와 같이 Multics에서 "복사 한"항목을 참조했습니다. 나는 Unix 사람들이 Multics 사람들로부터 훔쳤다는 것을 암시하지 않습니다. 모든 의도와 목적을 위해, 그것은 같은 사람들이었습니다.


6
이것은 가장 많이 투표 된 답변이 아니어야합니다. 질문에 대답하지 않고 사람들에게 다른 질문을하도록 요구합니다. "Multics에서 왜 '모든 것이 파일입니까?'
Lie Ryan

13
@ LieRyan : 실제로 그것은 왜 독특 합니까 ?
Goran Jovic

1
유닉스 사람들은 Multics 프로젝트가 중단되고 이름이 바뀌었을 때 아이디어를 얻었습니다. 유닉스는 단어 대 한 연극-하나의 VS 많은.
Fiasco Labs

2
@Lie Ryan-문제는 모든 것이 파일 인 이유가 아니라 고유 한 이유입니다. Goran과 내가 지적했듯이 그렇지 않습니다.
패트릭 시모어

1
문제는 정말 "유닉스 운영 체제를 의미 가족, 즉". 이 제품군에는 합리적으로 Multics와 Linux가 포함됩니다.
MSalters

28

독특한? 아뇨. 정의? 물론.

알려진 계층 구조에서 모든 것을 파일 또는 장치로 사용한다는 것은 모든 것에 동일한 도구 세트를 사용할 수 있음을 의미합니다. Bell Labs의 Plan 9는 하드웨어 장치를 파일로 사용하여이를 더욱 발전시킵니다.

더 중요한 것은 두 가지 매우 간단하고 강력한 개념을 허용한다는 것입니다. 필요에 따라 파이프와 함께 묶을 수있는 One Thing Well (tm)을 수행하는 기본 유틸리티. 텍스트 파일에서 무언가를 찾고 싶습니까? 사용 cat을 보여주고, 그것을 통과 grep, 당신은 가스로 요리하고 있습니다. 이것이 바로 '유닉스 (Unix)'방식의 진정한 힘입니다. 전문화 된 응용 프로그램은 엄청난 양의 유연성을 위해 함께 작동합니다.

맥 오에스텐도 유닉스 철학을 따르지만, 더 잘 숨겨져있다 ( '애플리케이션'번들은 실제로 파일로 가득 찬 디렉토리이다). 실제로는 FreeBSD의 비트를 사용한 NeXT 에서 유래 한 인증 된 유닉스 이다 .

Windows에는 이벤트 뷰어 및 레지스트리와 같은 이진 구성 요소가 있으며 특정 시나리오에서 속도 이점이 있습니다.


1
계획 9를 언급하는 데 1을 더한 것입니다. IMHO 퓨즈는 계획 9를 임시 및 반복을 통해 구현에 더 가깝게 만듭니다.
Danny Staple

2
음, 계획 9는 계획 9입니다. 이미 작동하고 있습니다. 퓨즈는 단지 사용자 공간 파일 시스템 확장을 흥미로운 방법으로 허용합니다. 나는 IRC가 FS로 취급되는 것을 좋아합니다.
Journeyman Geek

흠-아시다시피, 몇 년 전에 에릭 레이몬드 책을 통해 알게 된 이후로 여러 해 동안 그것을 찾아 보려고 했어요 ... 당신은 마침내 "둥근 곳으로 가자"혹에 대해 마침내 알게되었습니다. ISO를 사용해보십시오.
Danny Staple

2
나도 inferno라는 새로운 버전이 있다고 생각합니다
Journeyman Geek

1
OS X의 Darwin도 '실제 Unix'라는 점에 주목하십시오.
calum_b

18

특수 파일 때문입니다. 사람들이 "모든 것이 유닉스의 파일"이라고 말할 때, 공통 파일과 디렉토리는 그들이 생각한 것이 아닙니다. 특수 파일은 많은 유닉스 계열 OS에 고유합니다. 그래서 고유하지 유닉스.

특수 파일은 여러 목적으로 사용됩니다. 파이프, 소켓 및 장치 파일 등이 있습니다. 파이프와 소켓은 프로세스 간 통신 스트림입니다. 서브 시스템의 많은 기능은 장치 파일을 통해 사용자 공간에서 사용 가능합니다.

파이프와 소켓

프로그램은 일반 파일을 사용하는 것처럼이를 사용합니다. 실제로 대부분의 경우 사용하는 파일 형식은 신경 쓰지 않습니다. 그렇기 때문에 Unix 명령을 여러 가지로 결합하여 강력한 새 시스템을 만들 수 있습니다. (톱밥의 답변에서 I / O 리디렉션 참조)

장치 파일

앞에서 언급했듯이 이들은 사용자 공간의 인터페이스처럼 작동합니다. 예를 들어, CD 트레이를 꺼내기 위해 프로그래머는 먼저 해당 장치 파일을 엽니 다. 다른 예 : 프로그램이 가상 터미널을 전환하기를 원합니다. / dev / console을 먼저여십시오.

다음에 무슨 일이 단순한 문자를 전송하지 해당 파일 만 발행 ) (IOCTL을 그들. 발행 할 수있는 개별 ioctl은 장치에 따라 다릅니다. 예를 들어 콘솔은 console_ioctl (4)에 문서화되어 있습니다


12

아마 이런 말을하게 될 것입니다. 그러나 모든 것이 유닉스의 파일이라고 말하는 것은 사실상 잘못된 것입니다. 실제로는 두 가지입니다.

  1. 파일 및 장치 (및 기타 많은 것)는 열기, 닫기, 읽기, 쓰기 및 제어 (ioctl) 기능으로 구성된 인터페이스로 모델링 할 수있는 객체입니다.
  2. 이러한 객체의 네임 스페이스는 계층 적입니다. 즉, 이러한 객체는 계층으로 구성됩니다.

파일 시스템은이 네임 스페이스를 구현하고 이러한 객체에 인터페이스 함수를 전달할 수있는 프레임 워크를 구현합니다. 파일 시스템은 처음에는 파일을 저장하도록 개념화되었지만 네임 스페이스 계층 구조에서 다른 객체를 구성하도록 선택되었습니다. 객체 지향 이전의 다형성의 예가 하나였습니다.

모든 파일을 호출하는 데 아무런 해가 없습니다. 그러나 실제로는보다 일반적인 객체 (파일이 하나의 객체)입니다. 이러한 관점에서이 아이디어는 유닉스 고유의 것이 아닙니다. 다른 많은 OS는 이러한 다형성 객체의 계층을 구현합니다.


바로 그거죠! 유닉스에서 모든 것은 파일 디스크립터 ( 파일 일 필요는 없다!), 즉 모든 것 (메모리 제외)은 I / O, 심지어 파일이다. 파일은 I / O 스트림 인 것처럼 액세스해야합니다 (탐색 가능하지만 다소 임의로 액세스 가능하지만 추가 시스템 호출 비용이 많이 듭니다). (작은으로 무엇을 할 수 있는지를 제외한 mmap()물론 ....)
그렉 A. 우즈

9

사람들이 "유닉스에서 모든 것이 파일입니다"라고 말하면 파일이 아닌 것도 파일로 취급된다는 것입니다.

물론 대부분의 운영 체제는 파일을 사용합니다. 텍스트 파일, 이미지 파일, 사운드 파일. 그러나 모든 운영 체제가 장치를 파일로 취급하는 것은 아닙니다. 중요한 차이점입니다. Ubuntu 운영 체제 (Unix 기반)에서 내 / dev / 폴더의 내용을 나열하면 200 개가 넘는 장치 목록이 나타납니다. 이러한 장치 중 일부는 하드웨어이지만 폴더 안에 표시됩니다. 예를 들어 하드 드라이브, USB 포트, 마우스 및 키보드, 오디오 장치 및 프린터 등이 있습니다. / dev / urandom과 같은 일부 장치는 임의의 숫자로 가득 찬 무한한 파일로 동작하는 가상 장치입니다. 내 하드 드라이브의 실제 파일이 아닙니다.

이러한 장치는 모두 파일로 취급됩니다. 해당 장치에서 데이터를 읽거나 데이터를 쓸 수 있습니다. 다음 은 다른 장치에서 오디오 장치로 데이터를 복사 하는 예 입니다. 파일로 취급되기 때문에 가능합니다. (괴짜) 결과 할 수 있다는 것입니다 들을 하드 드라이브, 마우스 움직임, 컴퓨터 메모리 또는 이미지의 픽셀의 내용. 각 장치마다 데이터를 읽고 쓰는 데 다른 방법이 필요하기 때문에 장치를 파일로 취급하지 않으면 달성하기가 훨씬 어려워집니다.

"모든 것"의 의미는 시스템마다 다릅니다. 예를 들어, OS X는 Unix를 기반으로하지만 / dev / audio 장치는 없습니다. CoreAudio라는 독점 오디오 시스템을 사용합니다. 따라서이 경우 "거의 모든 것이 파일입니다"라고 말할 수 있습니다. 그런 다음 "모든 것이 파일이 아닌"Windows와 같은 시스템에서 파일의 내용을 프린터 포트에 복사하는 것과 같은 작업을 수행 할 수 있습니다 ( copy mydocument.txt >lpt1:유사와 같은 것을 입력 ). 이것은 문서를 Unix의 프린터 장치에 복사하는 것과 유사합니다 시스템.

Windows 및 OS X와 ​​같은 다른 운영 체제가 파일에서 작동하지 않습니까? 그렇습니다. Windows 및 OS X는 파일에서 작동하지만 Windows는 장치를 파일로 취급하지 않습니다. 이는 "모든 것이 파일"의 일부입니다.


8

Multics는 "모든 것이 파일"의 출처로 인용되었지만 장치 파일, 명명 된 파이프, 일반 파일 등보다 조금 더 깊게 봐야한다고 생각합니다. 파일 이름 지정 구문을 살펴 봐야합니다. 이는 AUX, CON 및 LP "마법 파일 이름"이 존재하더라도 큰 차이를 만듭니다.

Rob Pike의 " 숨겨진 이름 "을 참조하십시오 . Unix 파일 이름 지정 구문과 다른 두 가지 구문, 특히 VMS를 비교합니다. 유닉스가 시작되었을 때 60 년대 후반 ~ 70 년대 초반의 메인 프레임 OS는 현대적인 마음에 특별한 로코코 파일 명명 구문을 고려했을 것입니다. VM / CMS 또는 NOS 또는 NOS / VE를 사용한 지 몇 년이 지났으며 Univac OS를 사용하는 사람의 어깨 너머로 만 보았지만 그 기묘한 점이 규칙보다 수를 넘었다 고 말할 수 있습니다.

Multics가 실행되는 것을 본 적이 없지만 파일 시스템에 대한 논문을 볼 수 있습니다 . 원래의 Unix는 Multics보다 "모든 것이 파일입니다"라고 생각했지만 마일리지는 다를 수 있습니다.


1
Multics에서는 I / O를 제외한 모든 것이 메모리입니다 (메모리에도 매핑 될 수 있음). 유닉스에서 메모리를 제외한 모든 것은 파일을 포함한 파일 디스크립터 입니다. 즉, 유닉스에서는 모든 것이 I / O입니다.
Greg A. Woods

1
Multics를 부팅하고 실행할 에뮬레이터 인 BTW가 있습니다.
Greg A. Woods

3

Linus Torvalds조차도 "모든 것이 파일입니다"라는 의견에 동의하지 않습니다. "를 검색하면

모든 것이 바이트 스트림입니다

"당신은 우리가 모든 것이 파일이 아니라는 것을 의미하는 흥미로운 철학을 발견 할 것입니다. 예를 들어 메모리의 추상 데이터 구조 또는 포인터는 반드시 파일이 아닙니다. 물론 모든 것이 파일로 표현 될 수 있지만 두 가지 다른 행동을 나타내는 것입니다 .


1
링크를 제공하지 않았습니다. 일부 검색에서 yarchive.net/comp/linux/everything_is_file.html을 찾았 으며 이메일 스레드에서 Torvald의 응답을 인용하여 모델이 "모든 것이 파일"이어야 함을 암시 적으로 확인했습니다.
bgvaughan

1
실제로 @bgvaughan은 정반대입니다. yarchive.net/comp/linux/everything_is_file.html 인용문The UNIX philosophy is often quoted as "everything is a file", but that really means "everything is a stream of bytes".
Ancient Forest Kami

1
@LIttleAncientForestKami : 및 Unix는 전통적으로 파일을 레코드 스트림 (또는 스트림 스트림과 레코드 스트림을 모두 가짐)으로 처리하거나 스트림 (또는 리소스 포크)의 모음으로 처리했거나 여러 종류의 객체에 액세스하는 여러 가지 방법이있는 더 복잡한 모델.
ninjalj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.