나는 "운영 체제 개념"을 스스로 가르치고 있으며 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에서 찾을 수 있습니다..