Brian Kernighan 은이 비디오 에서 메모리 제한을 기반으로하는 작은 언어 / 프로그램에 대한 초기 Bell Lab의 매력을 설명합니다.
큰 기계는 64k 바이트 (K 또는 M이 아닌 G)이므로 개별 프로그램이 크지 않을 수 있으므로 작은 프로그램을 작성하는 자연스러운 경향이 있었고 파이프 메커니즘은 기본적으로 입력 출력 리디렉션을 통해 한 프로그램을 다른 프로그램에 연결할 수 있습니다.
그러나 프로그램간에 전송하기 위해 데이터를 RAM에 저장해야한다는 사실을 고려할 때 이것이 메모리 사용을 제한 할 수있는 방법을 이해하지 못합니다.
에서 위키 백과 :
대부분의 유닉스 계열 시스템에서 파이프 라인의 모든 프로세스는 동시에 시작됩니다. [강조 광산]시스템에서 실행중인 다른 모든 프로세스와 함께 스트림이 적절하게 연결되고 스케줄러에 의해 관리됩니다. 유닉스 파이프를 다른 파이프 구현과 구별하여 설정하는 중요한 측면은 버퍼링의 개념입니다. 데이터가 손실됩니다. 대신, 송신 프로그램의 출력이 버퍼에 보유됩니다. 수신 프로그램이 데이터를 읽을 준비가되면 파이프 라인의 다음 프로그램이 버퍼에서 읽습니다. Linux에서 버퍼 크기는 65536 바이트 (64KB)입니다. 필요한 경우 더 큰 버퍼를 제공하기 위해 bfr이라는 오픈 소스 타사 필터를 사용할 수 있습니다.
소규모 프로그램의 목적을 완전히 상실하기 때문에 (이것은 특정 규모까지 모듈화 될 수 있기 때문에) 이것은 나를 더 혼란스럽게합니다.
첫 번째 질문 (크기 데이터에 따라 문제가되는 메모리 제한)에 대한 해결책으로 생각할 수있는 유일한 것은 큰 데이터 세트가 단순히 계산되지 않았고 파이프 라인이 해결해야 할 실제 문제는 프로그램 자체에 필요한 메모리 양 그러나 Wikipedia 인용문에 굵은 글씨가 있으면 한 번에 하나의 프로그램이 구현되지 않기 때문에 혼란 스럽습니다.
임시 파일을 사용하면이 모든 것이 의미가 있지만 파이프가 디스크에 쓰지 않는다는 것을 이해합니다 (스왑이 사용되지 않는 한).
예:
sed 'simplesubstitution' file | sort | uniq > file2
sed
파일을 읽고 한 줄씩 뱉어내는 것이 분명 합니다. 그러나 sort
BK 링크 된 영상의 상태로 모든 데이터의 다음이에게 전달있어, 메모리에 읽을 수있다 (또는합니까?) 때문에, 전체 정류장이있다 uniq
한 것 (내 마음을)하는, 한 번에 한 줄씩 프로그램. 그러나 첫 번째 파이프와 두 번째 파이프 사이의 모든 데이터는 메모리에 있어야합니다.
unless swap is used
스왑은 RAM이 충분하지 않을 때 항상 사용됩니다