리눅스는 1-1 스레딩 모델을 사용하는데, 커널과 프로세스와 스레드를 구분하지 않고 모든 것이 실행 가능한 작업입니다. *
리눅스에서 시스템 호출은 clone
그중 공유의 구성 수준으로, 작업을 복제합니다 :
CLONE_FILES
: 사본을 작성하는 대신 동일한 파일 디스크립터 테이블을 공유하십시오.
CLONE_PARENT
: 새 작업과 이전 작업간에 부모-자식 관계를 설정하지 마십시오 (그렇지 않으면 childs getppid()
= parent 's getpid()
)
CLONE_VM
: COW 사본 을 작성하는 대신 동일한 메모리 공간을 공유하십시오.
fork()
호출 clone(
이상 공유 )
및 pthread_create()
통화 clone(
대부분의 공유 )
. **
fork
ing pthread_create
은 테이블을 복사하고 메모리에 대한 COW 매핑을 생성하기 때문에 ing 보다 약간 더 많은 비용이 들지만 Linux 커널 개발자는 이러한 비용을 최소화하려고 노력했습니다.
동일한 메모리 공간과 다양한 테이블을 공유하는 작업 사이의 전환은 데이터가 이미 캐시에로드되어 있기 때문에 공유하지 않는 것보다 약간 저렴합니다. 그러나 아무 것도 공유하지 않아도 작업을 전환하는 것은 여전히 매우 빠릅니다. 이것은 Linux 커널 개발자가 확인하려고 노력하는 것입니다.
실제로 다중 프로세서 시스템을 사용하는 경우 공유 하지 않는 것이 실제로 성능에 도움이 될 수 있습니다. 각 작업이 다른 프로세서에서 실행중인 경우 공유 메모리를 동기화하는 데 많은 비용이 듭니다.
* 단순화. CLONE_THREAD
신호 전달이 공유되도록합니다 ( CLONE_SIGHAND
필수, 신호 핸들러 테이블을 공유 함).
** 간체. 이 모두 존재 SYS_fork
하고 SYS_clone
콜을하지만, 커널의를 sys_fork
과 sys_clone
같은 주위 모두 매우 얇은 래퍼 do_fork
자체가 주위에 얇은 래퍼입니다 기능 copy_process
. 예, 용어 process
, thread
그리고 task
리눅스 커널에 오히려 의미로 사용됩니다 ...