Во-первых, программа может сделать свою собственную выходную буферизацию. Это иногда называют “stdio буферизующий” после названия компонента библиотеки, который выполняет эту задачу в C: функции как putc
, fputs
, fprintf
, и т.д., объявленный в stdio.h
. Если это сделает, то это произведет вывод в пакетах, обычно нескольких килобайтов (когда вывод будет терминалом, значение по умолчанию должно сбросить буфер в каждом символе новой строки).
В какой-то момент, или программист или базовые вызовы библиотечной функции write
явно. Это запрашивает, чтобы ядро записало указанные данные в канал. Ядро может решить записать все или часть данных. Так как файл является каналом, ядро скопирует данные в буферную область канала. Если буфер канала полон, то write
блоки системного вызова до существуют комната: Ваша программа (или более точно, поток, который звонил write
, в случае, если существует несколько потоков уровня ядра), не возобновит выполнение до вызова к write
возвраты.
(Это возможно, но вряд ли в этом situtation, что программа установила дескриптор файла канала как неблокирование. Если это верно, если ядро решит, что не может скопировать данные, то оно возвратит управление программе; write
системный вызов возвращается 0. Программа, которая делает такие системные вызовы неблокирования, обычно звонила бы select
или poll
или epoll
в цикле для блокирования, пока одни из дескрипторов файлов, на которых это связывается, не готовы к вводу или выводу.)
То, что программа заблокирована во время системного вызова, не связано с выбором алгоритма планирования. В его ядре любой планировщик различает готовые потоки, которым можно дать процессорное время и потоки ожидания, которые не могут. Суть планировщика должна выбрать готовый поток и позволить ему работать до любого, которого поток делает системным вызовом (который помещает поток в состояние ожидания), или некоторое асинхронное событие имеет место (на практике, прерывание процессора). Во время обработки системного вызова может случиться так, что поток, который был до тех пор заблокирован, становится готовым, например, потому что тот поток был в a write
звоните и ядро теперь смогло освободить данные из того вызова. Несколько вещей могут сделать готовый поток заблокированным из внешней стороны, например, сигнал приостановиться (SIGSTOP
). Планировщик ведет некоторый готовый список для решения который поток запланировать затем: список потоков, которые готовы (это обычно намного более сложно, чем простой список в реальном планировщике).
Необходимо использовать devstack. Взгляните на инструкции здесь: http://devstack.org/guides/single-machine.html