파일에 액세스할 때 커널이 동기화 메커니즘을 구현한다는 내용을 읽었습니다. 예를 들어, read()
다른 프로세스에서 동시에 파일 시스템의 파일을 사용하거나 쓰거나 읽으 려고 하면 커널은 경쟁 조건을 방지합니다.write()
어떻게 구현되나요? 나는 코드를 작성할 때 서로 다른 스레드나 프로세스가 코드의 일부를 동시에 실행하는 것을 방지하는 뮤텍스와 세마포어를 사용했습니다.
이 경우 커널은 여러 프로세스나 스레드가 동일한 파일 설명자를 읽거나 쓰려고 할 때만 잠금 메커니즘을 구현해야 한다고 가정합니다. 이는 언제든지 호출 read()
되거나 write()
파일 설명자에 적용될 수 있습니다. 이 목표를 달성하는 방법은 무엇입니까?
답변1
Linux 커널의 파일 시스템에 대한 잠금 규칙은 다음과 같습니다.커널 문서에 설명되어 있습니다., 철저하지만 VFS 코드에 아직 익숙하지 않은 경우 이해하기 어려울 수 있습니다.
대부분의 파일 작업은 inode에 대한 잠금을 사용하여 동기화됩니다.i_rwsem
. 이 자물쇠는 일반적으로 직접 작동하지 않지만다양한 잠금 기능. inode_lock
Ext4에서 검색하여 어떻게 사용되는지 확인할 수 있습니다 .ext4/file.c
.