답변:
실행 파일이 실행되는 동안 Unix가 실행 파일을 잠그지 않거나 Linux와 같은 경우에도이 잠금은 파일 이름이 아닌 inode에 적용됩니다. 즉, 파일을 삭제 (실제로 연결 해제) 한 후에도 동일한 이름의 새 데이터로 대체 된 후에도 파일을 열어 둔 프로세스가 동일한 (오래된) 데이터에 액세스하고 있음을 의미합니다.
이것이 Unix와 Windows의 주요 차이점 중 하나입니다. 후자는 파일 이름과 inode 사이에 레이어가 없어 잠긴 파일을 업데이트 할 수 없습니다. 일반적으로 전체 재부팅이 필요하기 때문에 일부 패키지를 업데이트하거나 설치해야하는 번거 로움이 있습니다.
실행 파일은 일반적으로 한 번 열리고 파일 설명자에 첨부되며 단일 실행 기간 동안 바이너리에 대한 파일 설명자를 다시 열지 않습니다. 예를 들어,를 실행 bash
하면 exec()
일반적으로 /bin/bash
호출시 한 번만 가리키는 inode에 대한 파일 디스크립터 만 작성합니다 .
이것은 종종 실행하는 동안 (이를 호출 한 경로를 사용하여) 자신을 다시 읽으려고 시도하지 않는 간단한 바이너리의 경우 캐시 된 컨텐츠가 매달려있는 inode로 유효 함을 의미합니다. 이것은 본질적으로 이전 버전의 실행 파일의 복제본이 있음을 의미합니다.
더 복잡한 경우 문제가 발생할 수 있습니다. 예를 들어, 구성 파일을 업그레이드 한 후 다시 읽거나 프로그램이 실행 된 경로를 통해 프로그램을 다시 실행할 수 있습니다. 프로그램이 서로 연결되어 있고 업그레이드 전에 하나가 실행되고 (첫 번째 프로그램에 의해) 하나가 실행되는 경우에도 문제가 발생할 수 있습니다. 일부 라이브러리의 경우에도 마찬가지입니다.
그러나 간단한 사용 사례의 경우 프로세스를 다시 시작하지 않고 업그레이드하는 것이 안전합니다.
bash
바이너리는 약 200 개의 4K 페이지이므로 모두 평균 세션에서 사용되는지는 확실하지 않습니다.
ialloc()
페이지 자체의 메모리 매핑이 아니라 읽기시 커널 구조체에 대해 이야기 하고있었습니다. 현대의 ext * 파일 시스템에서 inode가 궁극적으로 커널 내 (및 VM 서브 시스템 내부)에 일관성이 있다고 생각하는 것이 옳지 않습니까?