![동일한 디렉토리에 있는 파일에만 작동합니다.](https://linux55.com/image/154525/%EB%8F%99%EC%9D%BC%ED%95%9C%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%97%90%20%EC%9E%88%EB%8A%94%20%ED%8C%8C%EC%9D%BC%EC%97%90%EB%A7%8C%20%EC%9E%91%EB%8F%99%ED%95%A9%EB%8B%88%EB%8B%A4..png)
Linux에서는 openat
시스템 호출을 사용하여 파일을 생성하고 파일이 존재하는지 테스트할 수 있습니다. C/C++ 메모리 모델에 관한 한 파일을 생성하고 그 존재를 확인하면 동기화 관계가 생성됩니다. 내가 알아야 할 것은 이러한 동기화가 모두 순차적으로 일관성이 있는지 여부입니다. (확실히 그러기를 바라지만, 실제로 이 내용이 어디에서도 문서화되어 있는 것을 본 적이 없습니다.)
예를 들어, 프로세스 p1과 p2, 경로 A와 B가 있다고 가정해 보겠습니다.
p1이 다음을 수행하는 경우: 생성(A)을 만든 다음 생성(B)
p2는 다음을 수행합니다. 열려고 시도한 다음(B), 열려고 시도합니다(A).
그리고 A나 B를 방해하는 다른 프로세스가 없는 경우 p2가 B를 성공적으로 열었지만 A를 찾을 수 없을 가능성이 있습니까?
오히려 모든 작업이 파일 시스템 내에 있다고 가정할 수 있습니다.
답변1
모든 기본 디스크 및 멀티 코어 CPU 최적화를 사용하면 두 프로세스 간 작업 순서의 엄격한 순서를 반드시 결정할 수는 없습니다. 이것이 시간 의존적 동작의 가능성이 있는 경우 세마포어를 사용하는 이유입니다.
답변2
동일한 디렉토리에 있는 파일에만 작동합니다.
읽기 액세스. 잠금 규칙: 호출자는 우리가 액세스하는 디렉터리를 잠급니다. 자물쇠는 공유됩니다.
객체 생성. 잠금 규칙: 위와 동일하지만 잠금은 배타적입니다.
개체 제거. 잠금 규칙: 호출자는 부모를 잠그고, 피해자를 찾고, 피해자를 잠그고 메서드를 호출합니다. 자물쇠는 독점적입니다.
rename()
그건아니요디렉터리 전체에 걸쳐. 잠금 규칙: 호출자는 상위 항목을 잠그고 소스와 대상을 찾습니다. 교체하는 경우RENAME_EXCHANGE
둘 다 잠급니다 (flag 인수 사용). 그럼에도 불구하고 대상이 이미 존재하는 경우 잠급니다. 소스가 디렉터리가 아닌 경우 잠급니다. 둘 다 잠그려면 inode 포인터 순서로 잠그십시오. 그런 다음 메서드를 호출합니다. 모든 자물쇠는 배타적입니다. 참고: 공유 소스(및 스왑의 경우 대상)를 잠글 수 있습니다.링크 생성. 잠금 규칙:
상위 잠금
소스가 디렉터리가 아닌지 확인하세요.
잠금 소스
이 메서드를 호출하세요. 모든 자물쇠는 배타적입니다.
디렉터리 간 이름 바꾸기. 전체 무리 중에서 가장 힘든 것입니다. 잠금 규칙:
파일 시스템 잠금
상위 항목을 "조상 우선" 순서로 잠급니다.
소스와 타겟을 찾아보세요.
이전 부모가 대상과 같거나 대상의 하위인 경우 실패합니다.
ENOTEMPTY
새 상위가 소스와 같거나 소스의 하위이면 실패합니다.
ELOOP
스왑인 경우 소스와 대상을 잠급니다.
대상이 있으면 잠급니다. 소스가 디렉터리가 아닌 경우 잠급니다. 둘 다 잠그려면 inode 포인터 순서대로 수행하십시오.
이 메서드를 호출하세요. 모두
->i_rwsem
독점적으로 촬영되었습니다. 마찬가지로 공유 소스(및 스왑의 경우 대상)를 잠글 수 있습니다.위의 규칙은 메소드에 의해 읽혀지거나 수정되거나 삭제되는 모든 디렉토리가 호출자에 의해 잠기도록 보장합니다.
잠금력 선형화로 인해 작동단일 디렉토리에완전히 순서대로입니다. 그러나 읽기 액세스(1), 개체 생성(2) 및 개체 삭제(3)는 디렉터리 잠금보다 더 넓은 잠금을 사용하지 않으므로 다른 디렉터리에서 디렉터리 작업의 순서가 보장되지 않습니다. 다른 관찰자는 ' 의 선형 역사는 다양한 방식으로 교차합니다.