Linux의 스레드 정의는 시스템 호출에 의존합니까?

Linux의 스레드 정의는 시스템 호출에 의존합니까?

클론

clone()/ systemcalls 매뉴얼 페이지에서 다음을 clone3()찾았습니다.

CLONE_THREAD(Linux 2.4.0부터).

CLONE_THREAD가 설정되면 하위 프로세스는 호출 프로세스와 동일한 스레드 그룹에 배치됩니다. CLONE_THREAD에 대한 나머지 논의를 더 읽기 쉽게 만들려면,"스레드"라는 용어는 스레드 그룹의 프로세스를 나타내는 데 사용됩니다..

따라서 제가 이해한 바에 따르면 clone스레드는 CLONE_THREAD플래그가 설정된 상태로 생성됩니다(따라서 호출자와 동일한 스레드 그룹에 속하게 됩니다).

퓨텍스

그러나 예를 들어 매뉴얼 페이지를 보면 다음과 같은 내용을 futex()발견했습니다.

FUTEX_PRIVATE_FLAG (Linux 2.6.22부터)

이 옵션 비트는 모든 futex 작업에 사용할 수 있습니다. 이는 futex가 프로세스 비공개이며 다른 프로세스와 공유되지 않음을 커널에 알려줍니다(즉, 동기화에만 사용됨).동일한 프로세스의 스레드). 이를 통해 커널은 추가적인 성능 최적화를 수행할 수 있습니다.

이는 의 정의와 관련이 있는 것으로 보이지만 clone완전히 관련이 있는 것은 아닙니다. 클론처럼 스레드가 생성되면(즉, CLONE_THREAD플래그가 지정됨) 생성된 작업도~ 해야 하다가상 머신을 공유하세요. 그러나 스레드가 아닌(복제에서와 같이) 두 개의 작업을 생성하고 여전히 VM을 공유하는 것이 가능합니다(만 지정 CLONE_VM). 그러나,FUTEX: 새로운 비공개 futex기사/패치에서 futex에 대한 최적화는 _PRIVATE물리적 주소 대신 futex 단어의 가상 주소를 사용하는 것입니다. 따라서... 로 생성된 작업에서 개인 futex를 사용할 수 있지만 CLONE_VM그 사람은 futex()이를 금지합니다.

그러나 이것은 중요한 문제가 아닙니다. 매뉴얼은 (외견상 불필요해 보이는) 제한을 부과하지만 아무 것도 깨뜨리지 않습니다. 음, 여기에 더 흥미로운 예가 있습니다.

폐쇄

시스템 호출 매뉴얼에서 close():

또한 다음 시나리오를 고려하세요. 동일한 파일 설명자에 대해 작업을 수행합니다.

(1) 1 철사 파일 설명자에 대한 I/O 시스템 호출이 차단되었습니다. 예를 들어, 가득 찬 파이프에 쓰려고 시도하거나(2) 현재 사용할 수 있는 데이터가 없는 스트림 소켓에서 읽으려고 시도합니다(2).

(2)다른철사파일 설명자를 닫습니다.

이 경우 동작은 시스템마다 다릅니다. <...>

분명히 여기서는 두 작업이 파일 설명자 테이블을 공유한다고 가정하지만 스레드가 되는 것(복제본에서와 같이)은 파일 설명자 테이블을 공유한다고 주장하는 데 필요하지도 충분하지도 않습니다.

생성 작업을 사용하면 CLONE_THREAD|...|CLONE_FILES모든 것이 괜찮지만 CLONE_THREAD|...(허용되는 경우) 두 스레드(복제에서와 같이)는 파일 설명자를 공유하지 않으며 복제된 작업을 사용하는 ...|CLONE_FILES것은 다음과 같습니다.아니요실이지만하다파일 설명자를 공유하세요!

질문

첫째, 이것은 (적어도 예제 close()) 매뉴얼의 버그입니까? clone()시스템 호출이 설계되기 전에 작성 되었기 때문일까요 ? 아니면 내가 뭔가를 놓치고 있는 걸까?

일반적으로: 매뉴얼의 특정 시스템 호출에서 "스레드"라는 용어를 사용할 때 무엇을 의미하는지 어떻게 알 수 있습니까?

특히 (향후 커널 버전에서 작동할 코드를 작성한다고 가정할 때) VM을 공유하지만 스레드는 공유하지 않는 작업(예: 복제)에서 개인 futex를 사용해도 되나요? close스레드에서 호출할 때 스레드로부터 안전합니까(예: 클론)아니요상식적으로 파일 설명자 테이블을 공유하시겠습니까?

답변1

2.4는 우리가 "스레드"라고 알고 있는 기능을 도입한 Linux 버전입니다.여기서 토론하세요). 그리고 CLONE_THREAD프로세스가 아닌 스레드에 대해 clone()을 요청하는 플래그입니다.

2.4 이전에는 Linux에는 "프로세스"만 있었습니다... 그리고 "스레드"라는 단어는 역사적으로 모든 병렬 실행을 나타내는 데 사용되었습니다. 따라서 역사적으로 프로세스는 스레드의 한 형태였습니다.

복제 페이지의 문구는 모든 것이 프로세스라는 것을 이해하는 청중에게 스레드의 새로운 개념(현재 우리가 알고 있는)을 설명하는 것으로 이해될 수 있습니다. 따라서 clone()의 표현은 매우 구식입니다. 그러나 그것은 "잘못"이 아니다.

즉, 이 문장은 다음을 소개합니다.

관련 정보