프로세스를 포크 할 때 OS가 Copy on Write 최적화를하는 것을 보았습니다. 포크의 대부분이 exec에 의해 진행되기 때문에, 페이지 할당 비용과 불필요하게 발신자 주소 공간에서 데이터를 복사하는 것을 원하지 않습니다.
ext4 또는 xfs (저널링) 파일 시스템이있는 Linux에서 CP를 수행 할 때도 마찬가지입니다. 이 발생하지 않으면 왜 안됩니까?
프로세스를 포크 할 때 OS가 Copy on Write 최적화를하는 것을 보았습니다. 포크의 대부분이 exec에 의해 진행되기 때문에, 페이지 할당 비용과 불필요하게 발신자 주소 공간에서 데이터를 복사하는 것을 원하지 않습니다.
ext4 또는 xfs (저널링) 파일 시스템이있는 Linux에서 CP를 수행 할 때도 마찬가지입니다. 이 발생하지 않으면 왜 안됩니까?
답변:
에서 cp
man 페이지 :
--reflink [= always]가 지정되면 경량 복사를 수행하십시오. 여기서 데이터 블록은 수정시에만 복사됩니다. 이것이 불가능하면 복사에 실패하거나 --reflink = auto를 지정하면 표준 복사본으로 폴백합니다.
지원하는 파일 시스템에서이 작품 을 복사 -에 - 쓰기 ( reflink는 ) 주로 순간에 BTRFS. XFS reflink 구현이 개발 중입니다 [1] [2] .
에 대한 시스템 콜을 도입하지 않으면 cp
(또는 최소한 블록을 복사하기 위해) OS는 cp
프로그램이 작성하려고 하는 데이터가 다른 블록에서 읽은 데이터 와 동일 하다는 것을 알아내는 데 어려움을 겪습니다 . 또한 "여러 파일이 동일한 블록을 공유"시나리오를 관리하기위한 추가 오버 헤드가 있습니다. 몇 블록 만 다른 큰 유사한 파일은 거의 발생하지 않습니다. 따라서 해당 블록을 복사 한 다음 모든 파일 에이 관리 오버 헤드를 추가하는 것이 전체적으로 저렴 합니다.
이제 BTRFS와 같이 파일 시스템의 다른 복제 / 스냅 샷을 추가하여 파일 (많은 파일)을 "복사"하면 상황이 달라집니다. 이제 파일 시스템의 모든 파일을 "복사" 했습니다. 복사시 복사됩니다. 이것은 존재하지만 ext4에는 존재하지 않습니다.
"저널링 (Journalling)"은 그것과는 완전히 독립적 인 개념으로, 계산되는 파일의 관리 구조입니다.