Linux에서 스레드가 서로를 방해합니까? [폐쇄]

Linux에서 스레드가 서로를 방해합니까? [폐쇄]

멀티스레딩의 중요한 부분을 배우고 있습니다. 나는 일반적인 진술을 가지고 있습니다 :

단일 CPU 시스템에서는 인터럽트를 비활성화하는 것이 경쟁 조건에 대한 해결책입니다.

하지만 다른 웹사이트에서도 배웠어요

스레드는 일반적으로 서로를 방해하지 않습니다.

그렇다면 경쟁 조건을 방지하기 위해 인터럽트를 어떻게 비활성화합니까? 이것을 리눅스의 관점에서 설명할 수 있습니까?

답변1

첫 번째 설명은 정확하지만 Linux나 다른 시스템에서는 의미가 없습니다. 이는 대부분의 드라이버 또는 하드웨어 처리가 인터럽트를 통해 수행되며 이를 다르게 수행하는 것이 불가능하기 때문입니다. 예를 들어, 네트워크에서 패킷이 도착하면 CPU는 네트워크 카드에 의해 시작된 인터럽트를 통해 이에 대해 학습합니다.

그러나 이러한 인터럽트는 사용자 공간 프로세스에 보이지 않으며 영향을 주지 않습니다.

드물고 일반적인 임베디드 시나리오를 제외하고 Linux는 인터럽트 처리 없이 작동합니다.

경쟁 조건을 유발할 수 있는 것은 커널이 한 프로세스에서 CPU를 가져와 다른 프로세스에 제공하는 경우 컨텍스트 전환입니다. 일반적으로 타이머 인터럽트를 통해 발생합니다. 하나의 프로세스만 실행 중이거나 전체 스케줄러가 어떻게든 종료된 경우(일부 임베디드 환경에서는 가능할 수도 있지만 매우 이례적임) 이런 일은 발생하지 않으며 DOS와 같은 단일 프로세스 시스템을 갖게 됩니다. 실제로 멀티태스킹이 없기 때문에 경쟁 조건이 불가능합니다.

다중 CPU 시스템에서는 활성 스케줄러 없이도 여러 스레드가 동시에 실행될 수 있으므로 여러 CPU가 동시에 활성화되면 경쟁 조건이 발생할 수도 있습니다. 이 상황은 Linux(또는 내장되지 않은 운영 체제)에도 매우 이질적입니다.


두 번째 문장 "스레드는 서로를 방해하지 않습니다"는 대부분 사실입니다. 스레드는 본질적으로 프로세스이며 동일한 주소 공간을 사용합니다. 여러 스레드는 일반적으로 서로를 방해하지 않습니다. 어쩌면 그들은 서로에게 신호를 보낼 수도 있지만 그게 전부입니다. 이 진술은 이전 진술과 무관합니다.

관련 정보