인터럽트 시 리소스 잠금

인터럽트 시 리소스 잠금

패킷 라우팅의 여러 지점에 netfilter 후크가 있는 커널 모듈이 있으며 이러한 후크는 공유 리소스를 사용합니다. 또한 이 모듈에는 이러한 리소스에도 영향을 미치는 쓰기 가능한 문자 장치가 있습니다.

다른 핸들러가 이러한 리소스에 액세스할 때 잠금을 사용해야 하는지 잘 모르겠습니다. 인터럽트는 잠들 수 없다는 내용을 읽었습니다. 이는 핸들러(후크 및 읽기 핸들러)가 순차적으로 실행된다는 것을 보장할 수 있다는 의미입니까, 아니면 다른 기능에서 동일한 리소스에 대한 동시 액세스를 방지하기 위해 잠금을 사용해야 합니까?

감사해요.

답변1

작성한 내용과 사용된 데이터 구조에 따라 말하기는 어렵지만 다음과 같습니다.

인터럽트는 잠들 수 없다는 내용을 읽었습니다. 이는 핸들러(후크 및 읽기 핸들러)가 순차적으로 실행된다는 것을 보장할 수 있다는 의미입니까, 아니면 다른 기능에서 동일한 리소스에 대한 동시 액세스를 방지하기 위해 잠금을 사용해야 합니까?

인터럽트 휴면이 허용되지 않는 것은 사실이지만, 이 데이터 구조에 연결된 인터럽트가 동시에 다른 CPU에서 실행될 수도 있고, 현재 처리 중인 인터럽트 위에 다른 인터럽트가 쌓일 수도 있다는 점도 고려해야 합니다. , 임시로 사용하기 CPU를 끄세요. 두 경우 모두 교착 상태 상황과 두 스레드가 쓰기/읽기를 위해 경쟁하는 상황을 처리해야 합니다.

그렇습니다. 작성한 내용을 기반으로 한 일종의 동기화 메커니즘이 필요하지 않다고 믿을 이유가 없습니다. 상황에 따라 해당 CPU에서 추가 인터럽트를 비활성화하면(예: percpu 변수의 경우) 동기화가 더 간단해질 수 있습니다.

적절한 메커니즘은 무엇에 대한 액세스를 보호하려는지, 얼마나 길고 비용이 많이 드는지에 따라 달라집니다. 하지만 인터럽트를 수행하고 있기 때문에 실제로는 비차단 프리미티브만 선택할 수 있다는 점에서 다소 제한이 있습니다.

관련 정보