2016-11-04 9 views
2

주어진 작업 (또는 시스템 호출)이 원자 적인지를 확인하기 위해 (커널 소스 코드를 읽는 것 외에) 신뢰할 수있는 방법을 찾고 싶다. (다른 프로세스는 그 작업 전후의 상태 만 볼 수 있다는 의미에서 그 사이에있는 것이 아닙니다). 이것의 목표는 커널이 이미 저를 위해 그것을하는 경우에 어떤 가동을 위해 불필요한 자물쇠를 사용하는 것을 피하기위한 것이다.주어진 작업 (또는 시스템 호출)이 Linux에서 어 떤 원자인지 확인하려면 어떻게합니까?

지금까지 나는이 항목에 대해 this과 같은 리소스를 찾을 수 있지만 이는 결코 권위가 있거나 철저하지 않습니다. 또한 Linux man 페이지에는 이에 대한 정보가 거의 없습니다. 예를 들어, 위의 링크에서 언급 한 대부분의 함수에서 맨 페이지의 원 자성에 대해서는 아무 것도 발견하지 못합니다.

이 정보를 제공하는 표준 또는 공식 문서가 있으면 알려 줄 수 있습니까? 어떤 도움이라도 대단히 감사 할 것입니다.

+0

저는 리눅스 커널 전문가는 아니지만 그런 목록이 존재하는지는 의심 스럽습니다. 내일 코드를 작성한다면, 도움이 될 것입니다.하지만 지금부터 12.43 개월 후에 출시되는 Linux 6.4는 구현을 변경합니다. 갑자기 자물쇠가 더 이상 필요하지 않습니다. 또는 갑자기 모든 것이 갑자기 필요합니다. – GhostCat

답변

0

POSIX 스레드로부터 안전한 함수가 좋은 출발점이라고 생각합니다. 스레드 안전 함수는 다른 스레드에서 호출 될 때 동일한 결과를 제공하는 함수입니다. 이것은 전혀 원자와 같지 않지만, 적어도 어떤 기능이 확실하게 원자 적이 아닌지에 대한 힌트를 제공합니다.

POSIX.1-2001 및 POSIX.1-2008에서는 특정 기능 집합을 제외하고 표준에서 지정된 모든 함수가 스레드 안전성이 있어야합니다 (대부분은 표준 라이브러리에서 구현되며 표준 라이브러리에서 구현되지 않음). 핵심).

스레드로부터 안전하지만 원자가 아닌 함수의 예로는 fwrite()을 고려하십시오. fwrite()은 pthread 잠금 상태의 프로세스 별 버퍼에 쓰므로 스레드로부터 안전합니다. 그러나 버퍼는 별도의 write() 청크로 플러시 될 수 있으므로 다른 프로세스는이를 원자 적 쓰기로 보지 않습니다.

+0

스레드 안전성과 원 자성이 실제로 매우 다른 개념이라고 생각하는 경향이 있습니다. 스레드 안전성은 함수가 여러 스레드에서 동시에 호출 될 때 데이터 경쟁이 없음을 의미합니다. 구현 방식에서는 일반적으로 함수가 정적 또는 전역 변수를 사용하지 않음을 의미합니다. 그러나 다른 스레드에서 그 효과를 관찰 할 수있는 방법에 대해서는 원 자성과 직접 관련이 없습니다. 또한 한 스레드가 호출하는 함수의 효과를 관찰 할 때 다른 스레드가 동일한 함수를 호출 할 필요가 없다는 점도 유의해야합니다. 제 이해가 잘못되면 저를 시정하십시오. –

+0

그래서 "나는 좋은 출발점이다"라고했습니다. 나는 그 구별을 반영하기 위해 대답을 업데이트 할 것이다. – Arnout

+0

원자 연산은 _async-safe_이며, pthread mutex는 그렇지 않습니다. 특히 스레드가 뮤텍스를 제공 할 때 뮤텍스를 보유하고 있으면 비동기 신호 처리기가이를 가져올 수 없습니다. –