Другая абстракция — это файл.
В ядре реализован системный вызов wait4()
. В операционной системе Linux через библиотеку функций языка С доступны функции wait()
, waitpid()
, wait3()
и wait4()
. Все эти функции возвращают информацию о состоянии завершившегося процесса, хотя в несколько разной семантике.
Иногда в литературе по построению операционных систем этот список называется task array (массив задач). Поскольку в ядре Linux используется связанный список, а не статический массив, его называют task list .
Причиной создания структуры thread_info
было не только наличие аппаратных платформ, обедненных регистрами процессора, но и то, что положение этой структуры позволяет достаточно просто рассчитывать смешения адресов для значений ее полей при использовании языка ассемблера.
Скрытый тип (opaque type) — это тип данных, физическое представление которого неизвестно или не существенно.
Именно из-за этого появляются наводящие ужас "неубиваемые" процессы, для которых команда ps(1)
показывает значение состояния, равное D
. Так как процесс не отвечает на сигналы, ему нельзя послать сигнал SIGKILL
. Более того, завершать такой процесс было бы неразумно, так как этот процесс, скорее всего, выполняет какую-либо важную операцию и может удерживать семафор.
Отличным от контекста процесса является контекст прерывания, описанный в главе 6, "Прерывания и обработка прерываний". В контексте прерывания система работает не от имени процесса, а выполняет обработчик прерывания. С обработчиком прерывании не связан ни один процесс, поэтому и контекст процесса отсутствует.
Под exec()
будем понимать любую функцию из семейства exec*()
. В ядре реализован системный вызов execve()
, на основе которого реализованы библиотечные функции execlp()
, execle()
, execv()
и execvp()
.
В действительности сейчас это работает не так, как хотелось бы, однако усилия прилагаются к тому, чтобы порожденный процесс запускался на выполнение первым.
В действительности уже сейчас есть заплаты для добавления такой функции в ОС Linux. Хотя, скорее всего, возможность совместного использования таблиц страниц в ядрах серии 2.6 реализована не будет, такая возможность может появиться в будущих версиях.
Как пример можно привести тесты по измерению времени создания процессов (и даже потоков) и операционной системе Linux по сравнению с другими операционными системами. Результаты очень хорошие.
Обозначение O(1) — это пример обозначения "большого O". Практически, эта запись означает, что планировщик может выполнить все свои действии за постоянное время, независимо от объема входных данных. Полное объяснение того, что такое обозначение "большого O", приведено в приложении В, "Сложность алгоритмов".
Вместо термина timeslice (квант времени) иногда также используется quantum (квант) или processor slice. В ОС Linux применяется термин timeslice.
Может возникнуть вопрос: почему используется файл kernel/sched.c
, а не заголовочный файл include/linux/sched.h
? Потому что желательно абстрагироваться от реализации кода планировщика и обеспечить доступность для остального кода ядра только лишь некоторых интерфейсов.
Для аппаратной платформы x86 используется инструкция bsfl
, а для платформы PPC — инструкция cntlzw
.
Для аппаратной платформы x86 существует около 250 системных вызовов (для каждой аппаратной платформы разрешается определять свои уникальные системные вызовы). Хотя не для всех операционных систем опубликованы действительные системные вызовы, но по оценкам для некоторых операционных систем таких вызовов более тысячи.
IEEE, eye-triple-E (Институт инженеров по электротехнике и радиоэлектронике, Institute of Electrical and Electronics Engineers) является бесприбыльной профессиональной ассоциацией, действующей во многих технических областях и отвечающей за многие важные стандарты, такие как стандарт POSIX. Больше информации доступно по адресу: http://www.ieee.org
.
Следует обратить внимание на слово "могут". Хотя почти все вызовы создают различные побочные эффекты (т.е. приводят к каким-либо изменениям в состоянии системы), тем не менее небольшое количество вызовов, как, например, вызов getpid()
, просто возвращают некоторые данные ядра.
Читать дальше