카피 온 라이트

Copy-on-write

COW(Copy-on-Write[1])는 컴퓨터 프로그래밍에서 수정 [3]가능한 자원에 [2]대해 "복제" 또는 "복사" 작업을 효율적으로 구현하기 위해 사용되는 리소스 관리 기술입니다.리소스가 복제되었지만 수정되지 않은 경우 새 리소스를 생성할 필요가 없습니다. 복사와 원본 간에 리소스를 공유할 수 있습니다.수정 시에도 복사가 생성되어야 하므로 첫 번째 쓰기까지 복사 작업이 지연됩니다.이러한 방법으로 리소스를 공유함으로써 수정되지 않은 복사본의 리소스 소비를 크게 줄이고 리소스 수정 작업에 약간의 오버헤드를 추가할 수 있습니다.

가상 메모리 관리

Copy-on-Write는 운영체제프로세스가상메모리공유하거나 포크 시스템콜을 실장하는 경우에 주로 사용됩니다.일반적으로 이 프로세스는 메모리를 변경하지 않고 새 프로세스를 즉시 실행하여 주소 공간을 완전히 대체합니다.따라서 포크 중에 프로세스의 모든 메모리를 복사하는 것은 낭비이며 대신 Copy-on-Write 기술이 사용됩니다.

메모리의 특정 페이지를 읽기 전용으로 마크 해, 페이지에 대한 참조수를 카운트 하는 것으로써, 페이지 테이블을 사용해 카피 온 라이트(Copy-on-Write)를 효율적으로 실장할 수 있습니다.이러한 페이지에 데이터를 쓸 때 운영 체제 커널은 쓰기 시도를 가로채고 Copy-on-Write 데이터로 초기화된 새 물리적 페이지를 할당합니다. 단, 참조가 하나만 있는 경우에는 할당을 건너뛸 수 있습니다.그런 다음 커널은 페이지 테이블을 새 페이지(쓰기 가능)로 업데이트하고 참조 수를 줄인 후 쓰기를 수행합니다.새로운 할당을 통해 한 프로세스의 메모리 변경이 다른 프로세스의 메모리에 표시되지 않도록 합니다.

Copy-on-Write 기술은 물리 메모리의 페이지를 0으로 채움으로써 효율적인 메모리 할당을 지원하도록 확장할 수 있습니다.메모리가 할당되면 반환되는 모든 페이지는 0의 페이지를 참조하고 있으며 모두 Copy-on-Write 마크가 붙어 있습니다.이렇게 하면 데이터가 기록될 때까지 프로세스에 물리적 메모리가 할당되지 않으므로 프로세스가 물리적 메모리보다 더 많은 가상 메모리를 예약하고 메모리를 희박하게 사용할 수 있으므로 가상 주소 공간이 부족해질 위험이 있습니다.결합된 알고리즘은 요구 [3]페이징과 유사합니다.

Copy-on-Write 페이지는 Linux 커널의 같은 페이지 병합 [4]기능에서도 사용됩니다.

소프트웨어 내

COW는 라이브러리, 애플리케이션시스템 코드에도 사용됩니다.

C++ 표준 라이브러리에서 제공되는 문자열 클래스는 초기 C++98 [5]표준에서는 Copy-on-Write 구현을 허용하도록 특별히 설계되었지만 새로운 C++11 [6]표준에서는 허용되지 않습니다.

표준::스트링 x("안녕하세요");  표준::스트링 y = x;  // x 와 y 는 같은 버퍼를 사용합니다.  y += "세상!";    // 현재 y는 다른 버퍼를 사용하고 있지만 x는 여전히 같은 오래된 버퍼를 사용합니다. 

PHP 프로그래밍 언어에서는 참조를 제외한 모든 유형이 Copy-on-Write로 구현됩니다.예를 들어 문자열과 배열은 참조로 전달되지만 수정 시 참조 수가 0이 아니면 중복됩니다.이를 통해 할당 시 복사하거나 변경할 [7]수 없는 성능 문제 없이 값 유형으로 작동할 수 있습니다.

Qt 프레임워크에서는 많은 타입이 Copy-on-Write(Qt 용어로 "암묵적으로 공유")입니다.Qt는 아토믹 비교 및 스왑 연산을 사용하여 내부 참조 카운터를 증가 또는 감소시킵니다.복사본이 저렴하기 때문에 Qt 유형은 뮤텍스 등의 잠금 메커니즘 없이 여러 스레드에서 안전하게 사용할 수 있습니다.따라서 COW의 이점은 단일 스레드 시스템과 멀티 스레드 [8]시스템 모두에서 유효합니다.

컴퓨터 저장소

COW는 논리 볼륨 관리, BtrfsZFS [9]등의 파일 시스템, Microsoft SQL Server 의 데이터베이스 서버 등에 의해 제공되는 스냅샷의 기본 메커니즘으로도 사용할 수 있습니다.일반적으로 스냅샷은 수정된 데이터만 저장하고 원본에 가깝게 저장되므로 약한 형태의 증분 백업일 뿐 전체 [10]백업을 대체할 수 없습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "Implicit Sharing". Qt Project. Retrieved 4 August 2016.
  2. ^ Rodeh, Ohad (1 February 2008). "B-Trees, Shadowing, and Clones" (PDF). ACM Transactions on Storage. 3 (4): 1. CiteSeerX 10.1.1.161.6863. doi:10.1145/1326542.1326544. S2CID 207166167. Retrieved 4 August 2016.
  3. ^ a b Bovet, Daniel Pierre; Cesati, Marco (2002-01-01). Understanding the Linux Kernel. O'Reilly Media. p. 295. ISBN 9780596002138.
  4. ^ Abbas, Ali. "The Kernel Samepage Merging Process". alouche.net. Archived from the original on 8 August 2016. Retrieved 4 August 2016.
  5. ^ Meyers, Scott (2012). Effective STL. Addison-Wesley. pp. 64–65. ISBN 9780132979184.
  6. ^ "Concurrency Modifications to Basic String". Open Standards. Retrieved 13 February 2015.
  7. ^ Pauli, Julien; Ferrara, Anthony; Popov, Nikita (2013). "Memory management". PhpInternalsBook.com. Retrieved 4 August 2016.
  8. ^ "Threads and Implicitly Shared Classes". Qt Project. Retrieved 4 August 2016.
  9. ^ Kasampalis, Sakis (2010). "Copy-on-Write Based File Systems Performance Analysis and Implementation" (PDF). p. 19. Retrieved 11 January 2013.
  10. ^ Chien, Tim. "Snapshots Are NOT Backups". Oracle.com. Oracle. Retrieved 4 August 2016.