что происходит на более низких уровнях после системного вызова ветвления?

Я знаю то, что ветвление () делает в более высоком уровне. То, что я хотел бы знать, является этим -

  1. Как только существует вызов ветвления, инструкция по прерыванию следует и переходы управления для выполнения ветвления "обработчик". Теперь, Как делает этот обработчик, который создает дочерний процесс путем дублирования родительского процесса путем создания другого адресного пространства и блока управления процессом, возвратите 2 значения, одно к каждому процессу?

  2. В какой точке выполнения ветвление возвращает 2 значения?

Для помещения его короче говоря, кто-либо может объяснить пошаговые события, которые происходят на более низком уровне после вызова ветвления?

6
задан Sharat Chandra 5 February 2010 в 05:31
поделиться

2 ответа

Это не так уж и сложно - половина системного вызова fork() ядра может отличить два процесса по блоку управления процессом, как Вы уже упоминали, но это даже не нужно. Итак, псевдокод выглядит так:

int fork()
{
    int orig_pid = getpid();

    int new_pid = kernel_do_fork();     // Now there's two processes

    // Remember, orig_pid is the same in both procs
    if (orig_pid == getpid()) {
        return new_pid;
    }

    // Must be the child
    return 0;
}

Edit:. Наивная версия делает то, что вы описываете - создает новый контекст процесса, копирует все связанные с ним контексты потоков, копирует все страницы и отображения файлов, и новый процесс попадает в список "готовых к запуску".

Я думаю, что часть, которую вы путаете, состоит в том, что когда эти процессы возобновляются (т.е. когда родитель возвращается из kernel_do_fork, а дочерний процесс запланирован на первый запуск), он начинает работать в середине функции (т.е. выполняет это первое 'if'). Это точная копия - оба процесса будут выполнять вторую половину функции.

1
ответ дан 17 December 2019 в 20:31
поделиться

Это не так уж и трудно - ядро половины вилки () syscall может определить разницу между двумя процессами через блок управления процессом, как вы упомянули, но вам даже не нужно этого делать. Таким образом, псевдокод выглядит следующим образом:

int fork()
{
    int orig_pid = getpid();

    int new_pid = kernel_do_fork();     // Now there's two processes

    // Remember, orig_pid is the same in both procs
    if (orig_pid == getpid()) {
        return new_pid;
    }

    // Must be the child
    return 0;
}

Изменить: Наивная версия делает то же, что и вы описываете - она создает новый контекст процесса, копирует все связанные контексты потока, копирует все страницы и сопоставления файлов, а новый процесс помещается в список «готов к выполнению».

Я думаю, что часть, на которой вы путаетесь, это то, что, когда эти процессы возобновляются (то есть когда родитель возвращается из kernel_do_fork, и потомок запланирован в первый раз), он начинается в середине функции (то есть выполнение этого первого 'if'). Это точная копия - оба процесса будут выполнять вторую половину функции.

-121--4501532-

Чак Мур, человек, который изобрел, использует диалект, называемый цветом вперед. У него есть интересные проекты:

http://colorforth.com/haypress.htm Суперкомпьютер Haipress Creek. Имеет 9 S40 мультикомпьютерных чипсы, каждый с 40 c18 компьютерами. Всего 360 компьютеров, работающих на 700 Mips или 250 Gips. Каждая микросхема имеет 3 A/D и 3 D/As. Всего 27 из каждого.

http://greenarraychips.com/ Его компания по производству оборудования

-121--1356486-

Значение, возвращаемое каждому процессу, различно. Родительский/исходный поток получает PID дочернего процесса, а дочерний процесс получает 0.

Ядро Linux достигает этого на x86, изменяя значение в регистре eax, поскольку оно копирует текущий поток в родительском процессе.

1
ответ дан 17 December 2019 в 20:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: