C - ли printf () заставляет поток спать? - PullRequest
0 голосов
/ 25 июня 2018

Когда программа выполняет ввод / вывод, я понимаю, что поток ненадолго спит, а затем возобновляет работу (например, при записи в файл). Мой вопрос заключается в том, что, когда мы выполняем печать с использованием printf(), поток программы на C как-то спит?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Поскольку вы специально запросили printf(), я собираюсь предположить, что вы имеете в виду наиболее общий способ, когда он заполнит буфер разумного размера и вызовет системный вызов write(2) до stdout и что stdout указывает на ваш терминал.

В большинстве операционных систем, когда вы вызываете определенные системные вызовы, вызывающий поток / процесс удаляется из запускаемого ЦПсписок и помещен в отдельный список ожидания.Это верно для всех вызовов ввода / вывода, таких как чтение / запись / и т. Д.Временное удаление из обработки из-за ввода-вывода - это не то же самое, что перевод в спящий режим через таймер.

Например, в Linux существует непрерывное состояние сна потока / процесса, специально предназначенного для ожидания ввода-вывода., в то время как прерывистое состояние сна для тех потоков / процессов, которые ожидают на таймеры и события.Хотя, с точки зрения тупого пользователя, они оба кажутся одинаковыми, их реализация за кулисами существенно отличается.

Чтобы ответить на ваш вопрос, вызов printf() не совсемспит, но ждет, пока буфер будет сброшен на устройство, а не на самом деле во сне.Даже тогда есть еще несколько причуд, о которых вы можете прочитать в signal(7) и даже больше о различных состояниях процессов / потоков из Marek's blog.

Hopeэто помогает.

0 голосов
/ 25 июня 2018

Большая часть stdio.h состоит в том, что буферизирует I / O: вызов printf часто просто помещает текст в буфер памяти (по умолчанию принадлежит библиотеке) и выполняет ноль системных вызовов, таким образом, не предлагая возможности использовать процессор.Даже когда вызывается что-то вроде write(2) , вызывается, поток может продолжать работать: ядро ​​может скопировать данные в память ядра (из которой они будут перенесены на диск позже, например по DMA) и немедленно возвращаются.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...