리눅스 clone 예제

CLONE_THREAD로 만든 새 스레드는 clone(예: CLONE_PARENT)의 호출자와 동일한 상위 프로세스를 가지므로 getppid(2)에 대한 호출이 스레드 그룹의 모든 스레드에 대해 동일한 값을 반환합니다. CLONE_THREAD 스레드가 종료되면 clone()을 사용하여 만든 스레드는 SIGCHLD(또는 기타 종료) 신호를 보내지 않습니다. 이러한 스레드의 상태는 wait(2)를 사용하여 얻을 수 없습니다. (스레드는 분리된 것으로 합니다.) 낮은 수준의 C 프로그래밍은 항상 “전문가”의 무대로 간주되었습니다. 내 상위 수준의 운영 체제 과정에서, 교수는 이것이 우리의 마음에서 닦아해야 할 아이디어라고 생각했다. 이를 위해, 우리는 완전히 새로운 영역으로 우리를 밀어 꽤 많은 프로그래밍 과제를했다. 이러한 과제 중 하나는 Linux에서 제공하는 클론() 시스템 호출을 연구하고 사용하는 것이었습니다. Linux에서 제공하는 낮은 수준의 시스템 호출에 대한 정보를 찾는 것은 쉬운 일이 아니었습니다. 바라건대,이 문서는 다른 신진 전문가 – wannabees 약간의 시간과 문제를 저장합니다. 그룹 내의 스레드는 고유한 TID(시스템 전체) 고유 스레드 ID로 구분할 수 있습니다. 새 스레드의 TID는 기능 결과가 clone()의 호출자에게 반환될 때 사용할 수 있으며 스레드는 gettid(2)를 사용하여 자체 TID를 가져올 수 있습니다. 게시물의 앞에 제시된 정보를 감안할 때, 나는 프로세스 생성이 스레드 생성보다 다소 비싸지 만 극적으로 그렇게 될 것으로 예상합니다. 포크와 pthread_create 경로리눅스에서 동일한 시스템 호출에 대 한 경로 이후, 차이 그들은 전달 하는 다른 플래그에서 올 것 이다.

pthread_create가 이러한 CLONE_* 플래그를 모두 통과하면 커널에 가상 메모리 이미지, 열린 파일, 신호 처리기를 복사할 필요가 없음을 알려줍니다. 분명히, 이것은 시간을 절약 할 수 있습니다. child_stack 인수는 자식 프로세스에서 사용하는 스택의 위치를 지정합니다. 자식 및 호출 프로세스가 메모리를 공유할 수 있으므로 자식 프로세스가 호출 프로세스와 동일한 스택에서 실행될 수 없습니다. 따라서 호출 프로세스는 자식 스택에 대한 메모리 공간을 설정하고 이 공간에 대한 포인터를 복제()에 전달해야 합니다. HP PA 프로세서를 제외한 Linux를 실행하는 모든 프로세서에서 스택이 아래쪽으로 증가하므로 child_stack은 일반적으로 자식 스택에 대해 설정된 메모리 공간의 맨 위 주소를 가리킵니다. 모든 프로세스는 마운트 네임스페이스에 있습니다. 프로세스의 네임스페이스는 해당 프로세스에서 볼 수 있는 파일 계층 구조를 설명하는 데이터(마운트 집합)입니다. CLONE_NEWNS 플래그가 설정되지 않은 포크(2) 또는 복제()가 설정된 후 자식은 상위와 동일한 마운트 네임스페이스에 있습니다. 시스템은 mount(2)와 umount(2)를 호출하여 호출 프로세스의 마운트 네임스페이스를 변경하므로 동일한 네임스페이스에 속하지만 다른 마운트 네임스페이스의 프로세스에는 영향을 주지 않습니다.

カテゴリー: 未分類 パーマリンク