커널은 프로세스가 쓰고 있는 전체 파일을 저장합니까?

커널은 프로세스가 쓰고 있는 전체 파일을 저장합니까?

포즈를 취한 후이 문제, 나는 linxu 커널의 작동에 대해 약간 혼란스러워합니다.

먼저 프로세스가 파일에 문자열을 쓰는 방법을 알고 있습니다. 프로세스는 프로세스에서 쓸 수 있는 버퍼를 가져오고, 버퍼가 가득 차거나 프로세스가 버퍼를 플러시하면 버퍼의 내용이 다음에 기록됩니다.데이터 블록파일. 예를 들어 C 프로그램에서 를 사용하면 printf버퍼 \n가 플러시됩니다.

이제 위 게시물의 상황을 고려해 보겠습니다. 프로세스에서 파일이 열려 있고 여기에 쓰고 있는데 파일을 삭제하라는 명령을 받았습니다 rm.

내가 이해한 바에 따르면 이 명령은 rm파일의 링크를 해제합니다.해당 inode 및 데이터 블록. 로 표시되므로 UNUSED더 이상 파일 이름으로 액세스할 수 없습니다. 프로세스가 파일을 열면 커널은 파일에 액세스하기 위해 파일 설명자를 만듭니다.

따라서 내 말이 맞다면 rm프로세스가 파일 설명자를 통해 파일에 액세스할 수 있기 때문에 프로세스가 쓰고 있는 파일은 프로세스에 오류를 일으키지 않을 것입니다. 해당 게시물의 댓글에서 누군가 언급했듯이, 우리는 여전히 이겨낼 수 있습니다 cat /proc/<pid>/fd/3.

이제 나는 혼란스러워졌습니다. cat /proc/<pid>/fd/3inode를 통해 여전히 파일에 액세스할 수 있고 데이터가 UNUSEDfor 로 표시되어 있다면 rm커널이 전체 파일을 RAM에 보관한다는 의미입니까? 그렇다면 일부 로그 파일과 같이 파일이 매우 크다면 RAM이 많이 사용된다는 의미입니까?

즉, 파일이 rm편집되지 않는 경우 프로세스는 내용을 버퍼에 쓸 수 있으며, 버퍼가 플러시되면 해당 내용이 파일의 데이터 블록에 기록됩니다. 그러나 파일이 편집된 경우 해당 데이터 블록은 다음과 같이 rm표시됩니다 .UNUSED그것. 여기가 어디야"그것"?

답변1

내가 이해한 바에 따르면 이 명령은 rm파일의 링크를 해제합니다.해당 inode 및 데이터 블록으로 표시됩니다 UNUSED.

이것이 여기서 무슨 일이 일어나고 있는지 이해하는 열쇠입니다. rm커널은 단순히 주어진 디렉토리 항목을 삭제하라는 요청을 받습니다. 또한 커널은 디렉토리 항목이 가리키는 inode가 다른 항목(다른 디렉토리 항목, 열린 파일 설명, 파일 매핑, 루프 마운트 등)에서 더 이상 참조되지 않는 경우 inode 및 관련 데이터를 해제합니다.

따라서 커널은 삭제된 파일의 데이터를 유지할 필요가 없습니다. 파일 시스템이 이를 저장하는 위치에 관계없이 여전히 존재합니다. 프로세스에 이를 가리키는 파일 설명자가 있는 한 해당 프로세스는 그대로 유지되며 /proc/.../fd/...Linux에서 다시 시작할 수 있습니다.

관련 정보