Что делает sys_schedule() в Minix 3.1.8?

Я модифицирую планировщик в Minix 3.1.8 и задаюсь вопросом, что системный вызов sys_schedule() делает с процессором. Может ли кто-нибудь объяснить?

sys_schedule.c

PUBLIC int sys_schedule(endpoint_t proc_ep, unsigned priority, unsigned quantum)
{
    message m;

    m.SCHEDULING_ENDPOINT = proc_ep;
    m.SCHEDULING_PRIORITY = priority;
    m.SCHEDULING_QUANTUM  = quantum;
    return(_kernel_call(SYS_SCHEDULE, &m));
}

ком.ч

#define KERNEL_CALL 0x600   /* base for kernel calls to SYSTEM */ 
#  define SYS_SCHEDULE   (KERNEL_CALL + 3)  /* sys_schedule() */

kernel_call.c

PUBLIC int _kernel_call(int syscallnr, message *msgptr)
{
  msgptr->m_type = syscallnr;
  _do_kernel_call(msgptr);
  return(msgptr->m_type);
}

ipc.h

_PROTOTYPE( int _do_kernel_call, (message *m_ptr)           );

_ipc.S

ENTRY(_do_kernel_call)
    /* pass the message pointer to kernel in the %eax register */
    movl    4(%esp), %eax
    int $KERVEC
    ret

person Hiroaki Machida    schedule 27.11.2019    source источник
comment
Вы спрашиваете, что делает код, который вы показали, или вы спрашиваете, что делает код, который фактически реализует sys_schedule()?   -  person Ross Ridge    schedule 27.11.2019
comment
Спасибо за ваш комментарий! Я спрашиваю, что делает ЦП, например ЦП запускает поток или ЦП помещает поток в некоторую очередь.   -  person Hiroaki Machida    schedule 27.11.2019
comment
Разве у MINIX нет документации по системным вызовам? Судя по аргументам, это может быть что-то вроде POSIX renice для вас, например, сделать ваш процесс максимальным приоритетом в реальном времени для нескольких временных интервалов планирования, или, возможно, это что-то вроде синхронизированного сна или выхода. Это полные предположения, основанные на том, что вы хотите, чтобы ОС делала, и именах аргументов. Я совсем не знаю MINIX.   -  person Peter Cordes    schedule 27.11.2019
comment
Спасибо за ваш комментарий! К сожалению, это должно быть задокументировано. wiki.minix3.org/ Да, это вызывается, когда приятно команда выполняется. Я хочу знать точное поведение внутри процессора.   -  person Hiroaki Machida    schedule 27.11.2019
comment
@HiroakiMachida ЦП считывает инструкцию по адресу, хранящемуся в регистре счетчика программ, затем увеличивает регистр счетчика программ на количество байтов в инструкции, а затем выполняет инструкцию, как указано в руководстве ЦП. Это повторяется до тех пор, пока не отключится электричество.   -  person user253751    schedule 27.11.2019


Ответы (2)


Любой системный вызов в MINIX переключится на задачу SYSTEM (что и делает код, который вы показали, по крайней мере частично). Системная задача содержит таблицу, в которой теги SYS_XXX сопоставляются с подпрограммами do_xxx(). Эти подпрограммы обычно содержатся в небольших исходных файлах в папке system/.

Там мы быстро находим do_schedule.c. Этот файл в 3.1.8 довольно прост (и это ясно объяснено в книге IIRC), но, чтобы дать вам резюме, он проверяет свои аргументы и сохраняет новые параметры планирования в таблице вызывающего процесса; эти новые значения могут затем изменить процесс, который будет выбран, когда задача SYSTEM завершит свою работу и собирается вернуться в пользовательский режим.

person AntoineL    schedule 13.02.2020

Minix поддерживает планирование пространства пользователя, что означает, что процесс пространства пользователя отвечает за принятие решений по планированию для одного или нескольких процессоров. Процессы планировщика вызываются ядром, когда возникает необходимость принять такое решение.

Целью системного вызова sys_schedule является включение этого дизайна планирования пользовательского пространства. Планировщик может вызвать sys_schedule, чтобы сообщить ядру, как запланировать данный процесс. См. страницу документации по планированию пользовательского пространства.

Я написал описание системного вызова SYS_SCHEDULE, на которое вы можете ссылаться до официальная документация обновляется.

Параметры:

  • proc_ep: Конечная точка процесса должна быть перепланирована.
  • priority: приоритет, назначаемый процессу.
  • quantum: количество времени, необходимое для запуска процесса. Когда процесс исчерпает квант, планировщик, связанный с процессом, будет проинформирован ядром, которое может вызвать sys_schedule, чтобы перепланировать процесс, тем самым снова переводя его в работоспособное состояние. Если процесс не связан с планировщиком пользовательского пространства, менеджер процессов Minix (PM) автоматически обновляет свой квант.

Возвращаемое значение:

  • EINVAL: proc_ep содержит неверный номер процесса.
  • EPERM: Процесс, выполнивший системный вызов, не является планировщиком, связанным с proc_ep, поэтому у него нет разрешения перепланировать процесс, указанный proc_ep.
  • EINVAL: Неверный приоритет или квант.
  • OK: Вызов выполнен успешно. В этом случае процесс был добавлен в очередь, связанную с указанным приоритетом. Планировщик ядра планирует процессы в циклическом режиме, начиная с тех, которые находятся в очереди с наивысшим приоритетом.

Обратите внимание, что _do_kernel_call не реализует sys_schedule, а выполняет int $KERVEC, инструкцию x86, которая выполняет переход от пользователя к ядру и вызывает обработчик прерывания, связанный с номером прерывания $KERVEC. Затем обработчик прерывания вызывает фактическую реализацию системного вызова, указанного параметром msgptr->m_type. (См. ответ @AntoineL.)

sys_schedule используется PM, работающим в пользовательском пространстве, для периодической балансировки приоритетных очередей и автоматического обновления кванта процессов, у которых нет планировщиков.

person Hadi Brais    schedule 13.02.2020