명확하게 설명합시다.메모리의 저장소에 대한 참조를 가진 가상 파일을 만드는 방법
- 이의이 인자로 파일 이름을 소요하는 '-f'로 지정된 옵션이 명령이 있다고 가정 해 봅시다 :
다음은 내 요구 사항입니다.
- 이제 5 개의 파일이 있고이 5 개의 파일을 병합하는 새 파일을 만들고 위의 명령에 대한 인수로 새 파일 이름을 지정하려고합니다.
그러나 병합 된 파일을 읽는 모든 파일 &을 병합 하나의 파일 및
- 를 읽고
- 차이가있다.
더 IO가 (+ 병합 된 파일에 쓸 5 개 파일에서 읽기 + 우리의 명령은 지정된 파일과 않는 IO) IO보다 두 번째 경우에 생성 된 (모든 IO 우리의 명령은 주어진 파일로 수행)를 생성합니다.
우리는이 원치 않는 IO를 줄일 수 있습니까?
결국 나는 병합 된 파일을 전혀 원하지 않습니다. 이 병합 된 파일을 만들면 명령이 병합 된 파일 내용을 읽을 수 있습니다.
그리고이 구현을 원하지 않습니다. 파일 크기가 그렇게 크지 않기 때문에 무시할 수있는 IO를 추가해도 괜찮습니다. 그러나 이것이 가능할 수 있는지 궁금합니다.
그래서이를 구현하기 위해, 나는 다음과 같은 한 이해/질문 :
- 일반적으로 무엇을 모든 명령 (즉, 파일 이름 인수를) 수행이 파일을 읽고 있습니다.
- 우리의 경우 파일 이름 (filepath)이 준비되지 않았습니다. 모든 파일의 병합으로 존재하는 가상/상상의 파일 이름입니다.
- 그런 가상 파일 이름을 만들 수 있습니까?
- 파일 이름이란 무엇입니까? 저장소 위치에 대한 간접 inode 항목입니다.
- 우리의 경우, 개별 파일은 다른 inode 항목을 가지며 모든 inode 항목은 다른 저장 위치를가집니다. 우리의 가상/가상 파일은 실제로 inode가 없으며 가상의 inode를 생성 할 수 있다고해도 메모리의 저장소만을 가리킬 수 있습니다 (한 파일의 저장 위치에있는 다른 파일의 저장 위치에 대한 참조가 없으므로
- 하지만 고급 프로그래밍을 사용하여 메모리의 저장소를 가리키는 가상의 inode가있는 상상의 파일 경로를 만들 수 있다고 가정 해 보겠습니다.
- 이제 상상의 파일 이름을 인수로 지정하고 명령이 가상 파일을 열려고하면 inode 항목이 메모리의 저장소를 참조하고 있음을 알게됩니다. 그러나 실제 내용은 디스크에 있고 메모리에는 없습니다.따라서 데이터를 명시 적으로 읽지 않는 한 데이터는 메모리에로드되지 않습니다. 따라서 다시 데이터를 먼저 읽어야합니다. 연속성 또는 다음 파일 데이터를 디스크에 저장에서 참조가 없기 때문에
는 단순히 병합 된 데이터가 먼저 메모리에로드해야 말.
따라서 공제를 통해 적어도 데이터를 메모리에 저장해야합니다. 그러나 명령 자체가 파일을 읽을 필요가 있기 때문에 (전체 파일이 아니라면 명령의 작업이 완료 될 때까지 파일의 일부 또는 전부를 파싱해야합니다). 따라서이 방법을 사용하면 큰 파일 인 경우 상당한 IO를 절약 할 수 있습니다.
그럼 어떻게 가상 파일을 만들 수 있습니까?
- 첫 번째 대답은 병합 된 파일을 tmpfs에 쓰고 해당 파일을 참조하는 것입니다. 그러나 유일한 옵션입니까, 아니면 실제로 tmpfs가 아닌 메모리의 저장 위치를 가리킬 수 있습니까? tmpfs는 옵션이 아니기 때문에 모든 서버에서 스크립트를 실행할 수 있으며 모든 서버에서 작동하는 솔루션이 필요합니다. 내 스크립트에서/dev/shm에 병합 된 파일을 작성한다고 언급하면 / dev/shm이없는 서버에서 실패 할 수 있습니다. 그래서 나는 직접 메모리에로드 할 수 있어야합니다. 하지만 일반 사용자는 메모리에 액세스 할 수 없으므로 shm 없이는 할 수없는 것 같습니다.
귀하의 의견을 알려 주시고 친절하게도 내 이해가 잘못되어 있으면 저를 고쳐주십시오. 내 수준에서 복잡해도 친절하게 답을 게시하십시오. 적어도, 나는 몇 달 후에 그것을 이해할지도 모른다.
일부 저글링을 사용하면 프로세스가 명명 된 파이프에서 읽힐 수 있습니다. 그 파이프)'파일 이름은 무엇입니까? '* 아이 노드에 대한 * 포인터를 포함하는 디렉토리 항목입니다. (그 숫자) – wildplasser
안녕하세요, 사실 파일 이름 인수 만 제공 할 수 있고 이진 파일이므로 해킹 할 수 없습니다 –
: (1) [binary blob] 명령을 변경할 수 없습니다.(2) 출력 파일에 대해 신경 쓰지 않아야합니다. (3) 명령이 출력 파일에 기록되지 않도록 할 수 없습니다. 시도해보십시오 :'cmd -f/dev/null f1 f2 f3 f4 f5'. 그것은 그것이 얻는만큼 빨리이다. 그게 효과가없는 이유가 뭐야? –