Почему сеанс определяется на уровне ядра? Введён ли он исключительно для управления tty/задачами?

Вопрос или проблема

Я прочитал много статей и вопросов/ответов на этом сайте о сессиях. Я понимаю, что они представляют собой (источник):

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

Однако мой вопрос в том, является ли сессия как часть “ядра” ядра (часть структуры задачи) чисто из-за терминала и управления заданиями? Другими словами, является ли цель введения сессии только в этой причине, или сессия была введена “ради высшей цели” и используется (или предполагается использоваться) в других ситуациях, где терминал лишь одна из них?

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

Я понимаю, почему группы процессов существуют на уровне ядра, например, чтобы группировать процессы и что-то делать с ними вместе (отправить сигнал всей группе), но я не понимаю сессии, что они дают мне на уровне ядра…

Пожалуйста, учтите, что термин “сессия” перегружен и без контекста не очень значим.

В данном случае, вы конкретно говорите о сессии управления заданиями, реализованной с помощью системных вызовов 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 ядра функции сессий по своему усмотрению. Например, утилиты управления процессами или мониторинга системы могут использовать системные вызовы для анализа состояния или организации процессов в системе.

В конечном итоге, сессии, реализованные на уровне ядра, обеспечивают критически важные возможности для управления процессами, содействуя более безопасной и структурированной оперированной системе. Они облегчают поддержание памяти и организацию процессов и могут быть использованы для различных задач, хотя их основная функция остаётся тесно связанной с управлением контролем заданий.

Оцените материал
Добавить комментарий

Капча загружается...