"fork()"가 원래 프로세스의 주소 공간을 복사한다는 것은 무엇을 의미합니까?

"fork()"가 원래 프로세스의 주소 공간을 복사한다는 것은 무엇을 의미합니까?

나는 "운영 체제 개념"을 스스로 가르치고 있으며 chp3 작업을 하고 있습니다. 공예 부분.

"fork()" 함수가 호출되고 다음과 같이 반환된 pid 값에 따라 달라지는 예가 있습니다.

pid=fork();
if(pid<0){ //error stuff
}
else if(pid==0){
// child process stuff
}
else{
// parent process stuff
}

여기서 혼란스러운 점은 이 코드가 실행되면 "if"의 세 가지 경우 중 하나만 실행된다는 것입니다. 이는 상위/하위 프로시저 중 하나만 실행된다는 의미입니다.

그런데 찬찬히 읽어보니 나의 혼란을 해결하는 데 도움이 될 수는 있지만 완전히 해결할 수는 없는 문장이 있다는 것을 알게 되었습니다.

새 프로세스는 원래 프로세스의 주소 공간 복사본으로 구성됩니다.

내 상상으로는 이것은 "fork()" 호출이 수행될 때마다 해당 코드의 정확한 복사본이 복사되어 "하위" 프로세스로 실행되는 반면 원본 C 코드는 "상위" 프로세스로 실행된다는 의미인 것 같습니다. . .

내가 이것을 이해하는 것이 옳은가?

또한 "주소 공간"은 이것과 어떤 관련이 있습니까? 다시 한 번, 내 상상을 사용하여 상위 코드를 실행한다는 것은 코드가 RAM에 로드되고 코드에 할당된 RAM 세그먼트가 있는 곳에서 실행된다는 것을 의미하므로 해당 세그먼트가 새 세그먼트에 복사될 것이라고 가정합니다. RAM에 있는 다른 곳에 위치하며 하위 프로세스에 할당됩니다.

내 이해가 맞나요?

답변1

그래 네가 맞아.

특히, 이는 하위 프로세스가 상위 프로세스에서 분기할 때 가지고 있던 모든 변수와 값을 상속한다는 것을 의미합니다. 그러나 이후 단계에서 상위 또는 하위 프로세스 중 하나가 이러한 변수 중 하나를 수정하는 경우 해당 수정은 해당 프로세스에 국한됩니다. 하위가 변수를 수정하는 경우 상위에는 새 값 대신 이전 값이 계속 표시됩니다.

분기의 경우 하위 프로세스와 상위 프로세스가 통신하도록 하려면 명시적인 프로세스 간 통신을 사용해야 합니다.

이것이 스레드와의 차이점입니다. 개념적으로 포크와 스레드는 동일해 보입니다. 포크의 경우 동일한 코드가 두 프로세스에 의해 실행되고, 스레드의 경우 동일한 코드가 두 스레드에 의해 실행됩니다. 그러나 스레드의 경우 주소 공간은복사되지 않습니다: 두 개의 스레드가 동일한 메모리를 공유하므로 한 스레드가 변수를 수정하면 다른 모든 스레드에 영향을 미칩니다.

따라서 스레드는 스레드 간 매우 유연한 통신을 허용하지만 주의 깊게 사용하지 않으면 경쟁 조건이 발생할 가능성이 높기 때문에 오류가 발생하기 쉽습니다.

두 시스템 모두 서로 다른 요구 사항을 충족합니다. 참고로, 포크 프리미티브는 일반적으로 시스템 측에서 영리한 방식으로 구현됩니다. 주소 공간은 물리적으로 복사되지 않지만 시스템은 쓰기 시 복사 시스템을 사용하기 때문입니다. 데이터는 다음과 같은 경우에만 복사됩니다. 다음 조건 중 하나가 충족됩니다. 프로세스가 실제로 수정을 시도합니다. 데이터가 수정되지는 않지만 복사되지 않으므로 더 많은 메모리를 소비하지 않습니다.

포크와 스레드에 대한 추가 정보StackOverflow에서 찾을 수 있습니다..

관련 정보