LINUX.ORG.RU

Может ли процесс заснуть посредине выполнения системного вызова?


0

0

Процесс начинает выполнять системный вызов open (например файла устройства). Может ли процесс уснуть в середине выполнения? Исходные данные: Система однопроцессорная. Предположим, что за время исполнения кода процессы, открывающие файл, не получают никаких сигналов. В коде драйвера для open() не вызываются функции вида interruptible_sleep_on(). Допустим сам код в драйвере выглядит так :

static int n_open(struct tty_struct *tty, struct file *fl){

//step_1 ......... //step_2 .........

return 0; }

Два процесса (р1 и р2) открывают файл. Допустим первым начал исполнение кода процесс р1. Выполнив step_1, процесс "засыпает". Далее процесс р2 выполняет код от начала до конца. Потом процесс р1 просыпается и завершает выполнение кода.

Возможна ли такая ситуация? Или же р1 выполнит код от начала до конца и заснуть по середине не может? Повторюсь - система однопроцессорная.

Или процессы р1 и р2 могут исполнить код только последовательно, сначала один процесс, а затем другой?

anonymous

1) Какая ОС?
2) А почему должно быть, что "не может"?

Murr ★★
()

То есть берем к примеру Linux, открытие файла с ext2 в двух процессах. Поскольку открытие приводит к чтению inode, то первый процесс засыпает, второй в это время делает запрос и тоже засыпает. Может так получиться, что данные для второго процесса придут раньше (хотя это было бы странно) или данные придут одновременно, но приоритет у второго процесса выше и его выберут раньше. В конце концов может быть, что для второго процесса данные лежат в буферном кэше, поэтому он в отличие от первого вообще нигде спать не будет.

Murr ★★
()

Канэшно можeт --- читай, напримeр, man open, а имeнно ту eго часть, гдe описаны флаги O_NONBLOCK or O_NODELAY... да и вообщe про I/O почитай.

anonymous
()

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

На эту твою абстрактную модель можно ответить по разному.

anonymous
()

И еще -> процесс засыпает тогда и только тогда когда этого захочет ядро, тоесть вызовет, например, interruptible_sleep_on() или на down, если последний устанавливает семафор < 0, вобщем процесс нужно заставить спать. И больше никогда. Единственное что может случиться, это когда процесс выйдет из системного вызова (даже в ядре перед возвратом из kernel-space) ядро может перепланировать процесс, но когда процесс находится в open, ядро никогда его не перепланирует.
И еще не слушай че пишут ламеры. Сформулируй вопрос.

anonymous
()

Пока не указно что за ОС - это всё пустой треп. Даже 2.4 может быть вытесняемым.

последнему анонимусу: reschedule на AST - это не "прерывание" системного вызова (к этому времени он уже закончился).

Murr ★★
()
Ответ на: комментарий от anonymous

Спасибо. Ядро 2.4.19. Система однопроцессорная. Пишется драйвер. Ни interruptible_sleep_on() или down() не используются (в самом верху я об этом написал). Допустим есть некоторая глобальная структура, которая изменяется в вызове open(). Может ли быть такое, что один процесс начал открытие, начал изменение структуры, а потом заснул. Пока он спит другой процесс вызывает open(), изменяет структуру и благополучно завершается. Потом первый просыпается, а структура уже изменена. Буду благодарен за конструктивный ответ ( ну и критику к постановке задачи тоже принимаю с благодарностью)

anonymous
()

Если ядро vanilla (без kernel preemption) и нигде не спишь (надо просто аккуратно посмотреть какие функции могут спать - например, выделение памяти), то системный вызов атомарен.

Но зачем тебе это? Пиши из расчета SMP, блокируй через spin/spin_irq маленькие куски доступа.

Murr ★★
()

Еще раз повторяю -> без ядерных функций синхронизации процесс никогда не заснет. Чтобы тебе сделать то, что нужно их использовать.
Кроме того, процесс может заснуть вызвав какую-либо функцию ядра которая может его усыпить, например если какой-то ресурс занят. И еще, незабывай, что когда процесс попадает в open твоего драйвера прерывания на x86 всегда открыты. Понял???

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.