#c #linux-kernel
#c #linux-ядро
Вопрос:
Я хочу знать, что на самом деле происходит с процессом, ожидающим ввода пользователя. Допустим, в моем коде я вызвал scanf() для чтения пользовательского ввода с консоли. Он вызовет системный вызов read(). Но в этом случае нет данных для чтения, пока пользователь не введет какие-либо данные. Итак, наш процесс спит до тех пор?
Комментарии:
1. Ваш процесс будет заблокирован , что означает: ожидание ввода-вывода. Ядро запоминает состояние процесса (внутри системного вызова read()) и позволяет ему запускаться, как только ввод-вывод становится доступным.
2. значит ли это, что драйвер TTY каким-то образом уведомит планировщика о том, что данные доступны, и планировщик переместит процесс в очередь готовности?
3. Драйвер TTY здесь не имеет значения. Программа может получать входные данные из канала или сокета, или из чего угодно, на что ссылается filedescriptor. IIRC linux использует отдельные списки (очереди) для запущенных процессов и ожидающих процессов. Как только данные будут доступны / недоступны, запись процесса будет перемещена между этими очередями. Планировщик имеет дело только с выполняемой очередью.
4. @techiek7 В значительной степени. Если вы знаете, что такое переменные условия, это в значительной степени то, что ядро использует внутренне, чтобы уведомить всех заинтересованных лиц о том, что что-то интересное произошло в tty (или любом другом файловом дескрипторе, из которого вы читаете).
Ответ №1:
Да, он спит (по крайней мере, в OS X).
Попробуйте скомпилировать и запустить следующую программу на C:
#include <stdio.h>
int main() {
int x;
puts("Enter a number:");
if (scanf("%d",amp;x)) {
printf("You entered %dn",x);
}
else {
puts("That isn't a number");
}
return 0;
}
Запустите программу, запущенную в консоли, затем откройте другую консоль и введите ps -v
в командной строке. Вы должны увидеть что-то вроде этого:
PID STAT TIME SL RE PAGEIN VSZ RSS LIM TSIZ %CPU %MEM COMMAND
19544 S 0:00.01 0 0 0 2463084 1596 - 0 0.0 0.0 -bash
19574 S 0:00.01 0 0 0 2454892 1568 - 0 0.0 0.0 -bash
19582 S 0:00.00 0 0 0 2434816 676 - 0 0.0 0.0 ./a
Здесь ./a
указано имя программы. Запись для этого процесса в STAT
столбце S
, что означает, что процесс находится в спящем режиме ( S
) и находится на переднем плане (
) .