2009-10-29 3 views
0

clone_VM 플래그를 clone()에 전달하지 않으면 새 프로세스가 메모리를 원본과 공유합니다. 동일한 프로세스에서 두 개의 별개의 응용 프로그램 (두 개의 main()이 실행 됨)을 만들 수 있습니까? CLONE_VM을 사용하여 clone()을 호출 한 다음 exec()를 호출하는 것만 큼 간단하지만 실제로는 더 복잡합니다. 적어도, 생성 된 응용 프로그램은 재배치 가능하도록 컴파일해야한다고 가정합니다 (-fPIC). 나는 항상 응용 프로그램을 라이브러리로 재 코딩 할 수 있으며 스레드로 다른 '응용 프로그램'을 생성하는 마스터 응용 프로그램을 만들 수 있음을 알고 있습니다. 그러나이 접근 방식이 궁금합니다.Linux의 clone() 시스템 호출을 사용하여 동일한 주소 공간에서 여러 응용 프로그램을 실행할 수 있습니까?

답변

2

음, 그렇습니다. 스레드는 무엇이며 "두 개의 별개 메인 (/ 응용 프로그램)"부분을 뺀 것입니다.

실제로 이유는 clone(2)입니다. 스레드를 구현하는 것입니다.

클론 (2) 더 많거나 적게는 별도의 스택을 선언해야합니다. 그렇지 않으면 자식이 현재의 호출 수준에서 파괴되지 않고 반환 할 수 없으므로 부모의 스택.

각 프로세스마다 스택을 설정하기 시작하면 posix 스레드 라이브러리를 사용할 수 있습니다.

두 개의 다른 응용 프로그램이로드되는 부분에 대해서는 execve(2)을 호출하는 것이 가장 쉬운 방법 일 것입니다. 요즘 커널은 어쨌든 프로그램을 정확하게 실행하지 않습니다. 이미지가 Elf 동적 로더를 실행하도록 설정되는 것이 더 일반적이며, 커널이 실제로 실행하는 것입니다. 그러면 로더가 주소 공간에 프로세스 및 해당 라이브러리 mmaps(2)을로드합니다. 분명히 "두 개의 별개의 응용 프로그램"을 얻으려면이 작업을 수행 할 수 있으며 스레드 스케줄러는 clone (2)을 통해 두 프로세스로 실행하게됩니다.

0

왜 응용 프로그램을 동일한 실행 파일로 컴파일하고 main에서 스레드로 시작하지 않습니까?

어쨌든 별도의 작업으로 실행하는 데 문제가 있습니까? 정말로 원한다면 여전히 메모리를 공유 할 수 있습니다.

+0

두 개의 오래된 소프트웨어가 있다고 상상해보십시오. 중복되는 전역 변수 이름이나 기능으로 가득 차 있습니다. 같은 응용 프로그램으로 컴파일하려고하면 오류가 발생합니다. –

+0

실제로 더 좋은 예 : 두 개의 응용 프로그램을 함께 실행하면 컨텍스트 전환이 병목 현상이됩니다. 따라서 동일한 주소 공간에서 두 개의 앱을 실행하여 TLB를 스왑 아웃 할 필요가 없습니다. –

+0

이 컨텍스트 전환은 실제로 병목 현상이됩니까? 당신은 더 많은 코어를 가진 기계에서 그것을 시도 했습니까? 대부분은 요즘 적어도 두 가지가 있습니다. – MarkR

0

짧은 대답 : 불가능합니다.

사용자 정의 ELF 로더를 작성하고 커널이 프로세스에 대해 일반적으로 수행하는 많은 작업을 시뮬레이션 할 수 있다면 가능합니다.

각 앱을 하나의 기능 (주 이름 (다른 이름으로 바뀐 항목))을 제공하는 라이브러리로 컴파일하는 것이 좋습니다. 그런 다음 메인 스텁 프로그램은 두 라이브러리와 연결되어 각각의 내 보낸 함수를 호출해야합니다.

관련 문제