포크() 다음에 먼저 실행하는 사람은 부모입니까, 자식입니까?
이것들 중 하나라도 될 수 있다는 것을 알고 있습니다.하지만 저는 항상 아이가 제 유닉스 단말기에서 먼저 실행되는 것을 봅니다.그리고 부모와 자식이 나란히 실행하는 것은 어떨까요?그들은 연속적으로 실행하고 있는 것 같습니다.이것은 그들이 같은 터미널을 공유하기 때문입니까?
일반적으로 그들의 집행의 상대적인 순서에 대해서는 아무 말도 할 수 없습니다.
이제 구체적인 문제를 생각해 보겠습니다.경우:
- 두 프로세스 모두 실행하는 데 trivial가 아닌 시간이 소요됩니다.
- 당신 말은 하나가 다른 하나가 진전을 이루기 전에 완성을 향해 달려간다는 것이고, 그리고
- 사용하지 않는 CPU 사이클이 있고,
- 이는 응용프로그램을 실행할 때마다 발생합니다.
이는 두 프로세스 간에 일부(의도하지 않은) 동기화가 진행되고 있음을 나타내는 것일 가능성이 높습니다.
실제로 그것이 의도된 행동입니다. 비록 그것이 현재 정상적인 기능을 하고 있지 않더라도, 그것은 부모가 아이보다 먼저, 아이가 부모보다 먼저 뛸 수 있다는 것을 의미합니다.
우선 자녀 프로세스를 실행하는 것이 목표입니다.
간단히 말해서, 그 이면의 논리는 아이가 먼저 실행되면 아이가 호출할 때 COW(copy on write)의 오버헤드가 제거된다는 것입니다.exec
부모가 주소 공간에 쓸 기회가 없기 때문입니다.
vfork를 호출하는 경우 거의 모든 구현에서 자식이 먼저 실행되고 부모가 실행된다고 정의합니다.(자녀가 exec을 호출할 때까지).따라서 vfork의 경우 일정에 관계없이 serial이 실행되는 것을 알 수 있습니다.그러나 포크를 단순히 두 개의 새로운 프로세스라고 부를 때 생성됩니다.그들은 독립적으로 자유롭게 달릴 수 있습니다.(다른 프로세스와 마찬가지로).먼저 실행되는 프로세스는 스케줄링 알고리즘에 크게 의존하게 됩니다.스케줄링 알고리즘 외에, 그 시간에 실행되는 프로세스의 수 또한 출력의 특성을 결정합니다.또한 표준 라이브러리 i/o 함수를 사용하는 경우 데이터를 버스트 단위로 출력합니다(올바른 단어가 아닐 수도 있음).그것은 또한 누가 먼저 글을 쓸 것인가를 어느 정도 결정할 것입니다.여기 샘플 코드가 있습니다(실제로는 많이 의미가 없지만 부모와 자녀가 실제로 동기화되어 실행되는 좋은 예입니다).
#include<stdio.h>
#include<string.h>
static void charAtTime(char buff[])
{
char *p=buff;
while(*p) {
putc(*p,stdout);
(p++);
}
}
int main()
{
setbuf(stdout,NULL); //set output stream to be unbuffered.Now each process will try to throw chars as soon as they are ready
int pid;
char buff[1000];
if((pid=fork())<0) //First fork
{
fprintf(stderr,"Fork error\n");
}
else if(pid==0)
{
strcpy(buff,"i am the child.I love beyblade.I love anime.I love pokemon\n");
charAtTime(buff);
}
else {
int pid2=fork(); //secnd fork
if(pid2==0){
strcpy(buff,"I am the younger child\n");
charAtTime(buff);
}
else {
int pid3;
pid3=fork(); //third fork
if(pid3==0)
{
strcpy(buff,"I am from the 2nd generation\n");
charAtTime(buff);
}
else {
strcpy(buff,"Our family tree is bit confusing\n");
charAtTime(buff);
}
}
strcpy(buff,"I am the big daddy of them.I have the right before them\n");
}
return 0;
}
내 시스템의 경우 다음과 같은 출력이 나옵니다.
i am thOeI u ra cmfha mtihley yoIturne geea rmi cshf irblodimt
thceo i2nnlfdd .uIg elnseoivrnea gb
teiyobnl
ade.I love anime.I love pokemon
그러나 포크의 수를 두 개로 줄이면(공정이 두 개만 경쟁) 출력이 덜 불량해집니다.먼저 실행하는 부모입니다.(아마도 다른 프로세스가 생성될 때 현재 실행 중인 프로세스 때문일 것입니다.)
실제로 다른 것보다 먼저 실행되는 것은 없습니다.단순히 부모님이fork()
그리고나서wait()
아이가 완성할 수 있도록 말입니다.예를 들어 일련의 명령어를 사용하는 경우 여러 번 포크를 사용할 수도 있습니다.
다른 대답과 마찬가지로, 여러분은 그것을 모를 수도 있고, 그것에 의존해서는 안 됩니다.
그러나 역사적으로 리눅스에서는 부모가 실행을 계속하고 이후에는 자식이 실행됩니다.오래된 리눅스 커널에서, 그것은 그 반대의 방식으로 구현되었다: 아이들을 빨리 실행하는 것, 아마도 그것을 호출할 것입니다.exec
의 모든 이러한 방식으로 쓰기 메모리에는 복사본이 없습니다(부모님의 모든 쓰기에서 수행해야 함).그거 알아? 그로 인해 많은 에), 다시 그 변화는 많은 도구들을 미묘한 방법으로 (디버깅하기도 어려운) 고장이 났기 때문에 그것을 되돌렸습니다.최적화의 실패!
따라서 어떤 프로세스를 먼저 실행할 것인지 릴레이하지 마십시오.
언급URL : https://stackoverflow.com/questions/8494732/who-executes-first-after-fork-parent-or-the-child
'programing' 카테고리의 다른 글
자바스크립트 스크롤To 메서드가 아무 것도 하지 않습니까? (0) | 2023.10.20 |
---|---|
Classic ADO / ODBC / Oracle 10g EZConnect의 연결 문자열 구문 (0) | 2023.10.20 |
준비 상태 변경 시 XMLHttpRequest가 여러 번 호출됨 (0) | 2023.10.20 |
수표와 외국 열쇠의 차이점은 무엇입니까? (0) | 2023.10.20 |
Android의 strings.xml 파일에 오류가 발생했습니다. (0) | 2023.10.20 |