Вопрос или проблема
Я прочитал много статей и вопросов/ответов на этом сайте о сессиях. Я понимаю, что они представляют собой (источник):
Коллекция групп процессов, созданных для управления заданиями. Каждая группа процессов является членом сессии. Процесс считается членом сессии, частью которой является его группа процессов.
Однако мой вопрос в том, является ли сессия как часть “ядра” ядра (часть структуры задачи) чисто из-за терминала и управления заданиями? Другими словами, является ли цель введения сессии только в этой причине, или сессия была введена “ради высшей цели” и используется (или предполагается использоваться) в других ситуациях, где терминал лишь одна из них?
Если это правда, что только из-за терминала, мне кажется это немного нелогичным. Это можно было бы реализовать на уровне оболочки (как это сделано с управлением заданиями).
Я понимаю, почему группы процессов существуют на уровне ядра, например, чтобы группировать процессы и что-то делать с ними вместе (отправить сигнал всей группе), но я не понимаю сессии, что они дают мне на уровне ядра…
Пожалуйста, учтите, что термин “сессия” перегружен и без контекста не очень значим.
В данном случае, вы конкретно говорите о сессии управления заданиями, реализованной с помощью системных вызовов getsid/setsid. Поскольку это системные вызовы (а не просто вызовы библиотеки), они реализованы в ядре.
Сессия управления заданиями реализована в ядре, она может быть реализована в оболочке только с помощью этих системных вызовов и управления заданиями tty, назначения управляющего терминала и функций группы процессов, которые все связаны вместе.
Обратите внимание, что когда задание приостановлено, вся сессия приостановлена. Сессия является частью системы управления заданиями. Управляющий терминал также является частью управления заданиями; для того чтобы ctrl-z приостановил программу, она должна быть фоновым процессом для управляющего терминала процесса.
Думаю, вы ищете границу между тем, где ядро реализует API и где пользовательский процесс (например, оболочка) использует этот API, а не реализует его напрямую. Часто разделительная линия определяется соображениями безопасности или потому, что существующий API уже был в ядре, и когда добавлялась связаная функциональность, она также добавлялась в ядро.
Иногда, когда вы смотрите на такой API, вы можете подумать “почему это не было реализовано в оболочке вместо ядра”, когда ответ заключается в том, что оболочка реализует его, вызывая API ядра. Помните, что оболочка — это просто пользовательский процесс; это нечто особенное, у нее нет дополнительных привилегий, которыми не обладали бы другие пользовательские процессы. Это упрощает реализацию новых оболочек и не требует разрешений для их написания или запуска.
Вы спрашиваете, почему управляющий терминал и сессии процессов реализованы в ядре, а не в оболочке? Оказывается, управление заданиями очень сложное и выходит за рамки того, что может сделать оболочка, и реализация оболочки опирается на функциональность, предоставляемую ядром, и эти функции реализованы для поддержки управления заданиями. Это их основное назначение, и я не думаю, что имелась в виду какая-то высшая цель при их разработке.
Спрашивать, предназначено ли это для использования чем-то еще, бессмысленно, потому что API существует, и все что угодно может использовать его для любых целей. Например, я могу написать программу, как
ps -eO sid | awk '$1==$2'
которая выведет всех лидеров сессий. Считается ли это “высшей целью”? Это API ядра, доступный всем пользовательским программам. Любая пользовательская программа может использовать его для любых целей. Задача API ядра не в том, чтобы определять цель, он просто предоставляет ресурсы.
.
Ответ или решение
Теория:
Сессии на уровне ядра операционной системы представляют собой фундаментальные структуры, которые связывают группы процессов в целях осуществления контроля над заданиями. Сессии позволяют группировать процессы в логические блоки и обеспечивают средства управления этими блоками на уровне операционной системы, используя системные вызовы, такие как getsid
и setsid
. Эти вызовы позволяют манипулировать сессиями, изменяя их статус и управление доступом через терминал, связанный с процессами. Несмотря на то, что концепция сессий тесно связана с управлением задачами в терминалах, их реализация имеет более глубокие причины, связанные с архитектурой и обеспечением безопасности системы.
Пример:
Предположим, что пользователь запускает несколько процессов через интерфейс командной строки в Unix-подобной системе. Каждый из этих процессов может быть объединен в процессную группу, которая, в свою очередь, будет частью сессии. Сессии и процессные группы позволяют организовать и управлять этими процессами посредством сигналов и других механизмов. К примеру, если пользователю нужно временно приостановить выполнение задачи, он может использовать ключевую комбинацию Ctrl+Z, чтобы поставить на паузу процесс, работающий в переднем плане. Эти функции невозможны без участия ядра, поскольку оно обеспечивает выполнение системных вызовов, управляющих сессиями и взаимодействием с терминалом.
Применение:
Сессии на уровне ядра не только укрепляют безопасность интерфейса командной строки, но и предоставляют мощные возможности для управления группами процессов. Контроль над заданием (job control) включает в себя взаимодействие с терминалом и влияет на внутренние процессы оболочки, но это только часть функциональности сессий. Выбор реализации на уровне ядра часто обусловлен необходимостью обеспечения защиты и консистентности выполнения операций на низком уровне. Ядро интегрирует функции управления сессиями, потому что только оно имеет необходимые привилегии для выполнения определенных операций с процессами, не подвергая при этом систему риску.
Вы также можете рассмотреть сессии как часть более широкой инфраструктуры управления ресурсами в многозадачных операционных системах. Хотя их первичное предназначение связано с терминальной работой и контролем процессов, южерские приложения могут применять доступные в API ядра функции сессий по своему усмотрению. Например, утилиты управления процессами или мониторинга системы могут использовать системные вызовы для анализа состояния или организации процессов в системе.
В конечном итоге, сессии, реализованные на уровне ядра, обеспечивают критически важные возможности для управления процессами, содействуя более безопасной и структурированной оперированной системе. Они облегчают поддержание памяти и организацию процессов и могут быть использованы для различных задач, хотя их основная функция остаётся тесно связанной с управлением контролем заданий.