메모리 할당 효율성 측면에서 fork()
자식 코드에서 a 이후에 execve()
이를 사용하여 프로그램을 실행하면 이를 사용하지 않고 실행되는 동일한 프로그램보다 더 효율적입니다 execve()
. 그 자신의?
순진한 예:
실행되지 않음
[..some father code...]
int i;
if(!fork()) {
sum() //from an #include "porg.h"
}
그리고 실행
[..some father code...]
if(!fork()) {
execve("sum", NULL, NULL); //sum is a program which executes i=2+3
}
두 번째는 메모리 할당 측면에서 더 낫습니까? 내 프로세스의 전체 가상 주소 공간을 바꾸는 것이 더 낫습니까, 아니면 그렇게 완성된 피연산자 측면에서 #include "prog"에 포함된 다른 프로그램의 함수를 호출하여 위 코드를 실행하는 것이 더 낫습니까? 프로그램 실행 중에 메모리가 운반됩니까?
답변1
첫 번째 조각의 코드에는 if
추가 및 할당이 포함되어 있습니다. 그것은 무엇보다도 간단하며 기계어 코드에서 약 두 개의 명령어로 컴파일됩니다.
두 번째에는 스택에 로드되어 푸시된 여러 매개변수, 함수 호출, 매개변수를 시스템 호출을 위한 올바른 위치로 이동하는 libc의 일부 내부 처리, 그리고 시스템 호출 자체가 있습니다.
시스템 호출은 커널 모드로 전환하고(시스템에 따라 어떤 비용을 지불하더라도) 커널을 조사하여 실제로 처리된 시스템 호출을 찾은 다음 프로그램을 실행해야 합니다 sum
. 프로그램을 실행하려면 프로그램이 포함된 파일을 찾고, 이를 메모리에 로드하고(아마도 디스크를 기다리는 중), 프로그램의 각 부분이 메모리에 있는 위치를 알기 위해 ELF 헤더를 해석하고, 일부 메모리 매핑(아마도 페이지 테이블)을 설정해야 합니다. .. .
나는 당신이 아이디어를 얻을 것 같아요.
답변2
그러한 가정은 올바르지 않습니다. 분기된 하위 프로세스나 하위 프로세스 모두 sum
명시적으로 힙을 사용하지 않습니다. 그러나 에서 sum
C 런타임은 프로그램이 시작될 때 일부 힙 구조를 초기화할 수 있습니다. 스택에도 비슷한 가능성이 있습니다.
그러나 이는 생각해 볼 가치가 있는 타당한 질문입니다. 하위 프로세스가 실행되는 동안 상위 프로세스도 메모리를 수정하는 경우 하위 프로세스는 수정된 모든 메모리의 복사본을 호스팅합니다(기록 중 복사). 일반적으로 아이는 하위 작업을 수행하고 해당 데이터의 하위 집합만 사용합니다.
이는 대규모 상위 프로세스와 장기간 실행되는 하위 프로세스에 중요할 수 있습니다.