programing

포크() 다음에 먼저 실행하는 사람은 부모입니까, 자식입니까?

padding 2023. 10. 20. 13:28
반응형

포크() 다음에 먼저 실행하는 사람은 부모입니까, 자식입니까?

이것들 중 하나라도 될 수 있다는 것을 알고 있습니다.하지만 저는 항상 아이가 제 유닉스 단말기에서 먼저 실행되는 것을 봅니다.그리고 부모와 자식이 나란히 실행하는 것은 어떨까요?그들은 연속적으로 실행하고 있는 것 같습니다.이것은 그들이 같은 터미널을 공유하기 때문입니까?

일반적으로 그들의 집행의 상대적인 순서에 대해서는 아무 말도 할 수 없습니다.

이제 구체적인 문제를 생각해 보겠습니다.경우:

  1. 두 프로세스 모두 실행하는 데 trivial가 아닌 시간이 소요됩니다.
  2. 당신 말은 하나가 다른 하나가 진전을 이루기 전에 완성을 향해 달려간다는 것이고, 그리고
  3. 사용하지 않는 CPU 사이클이 있고,
  4. 이는 응용프로그램을 실행할 때마다 발생합니다.

이는 두 프로세스 간에 일부(의도하지 않은) 동기화가 진행되고 있음을 나타내는 것일 가능성이 높습니다.

실제로 그것이 의도된 행동입니다. 비록 그것이 현재 정상적인 기능을 하고 있지 않더라도, 그것은 부모가 아이보다 먼저, 아이가 부모보다 먼저 뛸 수 있다는 것을 의미합니다.

우선 자녀 프로세스를 실행하는 것이 목표입니다.

간단히 말해서, 그 이면의 논리는 아이가 먼저 실행되면 아이가 호출할 때 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

반응형