2015-05-22 3 views
2

Выход нити означает, что ОС не ожидает, что процессор потребует некоторое время, и что планировщик должен предварительно переключиться на другой процесс. Например, в C++ 11 вызов равен std::this_thread::yield().Есть ли у Bash доход от ниток?

У команды Bash такая команда? Если так, то, что это?

+0

В Bash нет ничего похожего на то, что я видел в течение большей части 20 лет. Все обращения к сторонним приложениям будут вызывать дополнительную подоболочку, за исключением, возможно, вызова чтения для чтения из файла (или трубы или stdin) а затем записывать данные в трубу, когда вы будете готовы продолжить. –

+1

У Bash нет потоковой передачи вообще, поэтому конкретный вызов, подобный потоку, такой как альтернативный вариант C++, не совсем похож на. , код bash, который будет достаточно написан, будет тратить свое время на блокировку (ожидая либо IO для выхода подпроцессов), либо из них неявно выдает CPU. –

+0

Уступка - это не о том, чтобы сообщать системе о ожиданиях процесса/потока. нужна такая вещь, потому что она может * видеть *, что процесс * на самом деле требуется в любой момент времени.Уход за одним потоком проактивно дает другим потокам возможность работать, хотя в этом потоке * есть больше работы для выполнения. И нет, 'bash' не имеет такой вещи. –

ответ

2

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

В любом случае, нет, bash не имеет такой вещи, как вы можете проверить, прочитав руководство пользователя list of internal commands и его list of built-ins.

Люди, похоже, запутались, однако, между bash (или любой другой оболочкой) и внешних команд, которые могут быть запущены для вас. Внешние команды никоим образом не являются частью оболочки, но некоторые из них являются резервными командами оболочки (grep, awk и sed - это первое, что приходит на ум). Любая программа, которую вы можете получить или написать, однако, вы можете запустить через bash. В частности, вы можете построить эту программу C для работы:

#include <sched.h> 
int main() { 
    sched_yield(); 
    return 0; 
} 

Если вы запускаете что из оболочки, то это действительно выхода процессора в то время как родительская оболочка ожидает его завершения. Сама оболочка не будет уступать, но поскольку она будет заблокирована при завершении ребенка, эффект все равно будет предусматривать, чтобы другие процессы запускались. Но какие невероятные накладные расходы связаны с этим!

В конце концов, @ комментарий CharlesDuffy лег в ситуацию очень лаконично:

Баша код, который разумно написанный будет тратить свое время блокировки (ожидание или на IO [или] для подпроцессов для выхода), либо из которых уступят CPU неявно.

bash Если ваш сценарий, кажется, есть подлинное использование для явного yield то вы делаете что-то неправильно.

+0

Спасибо за отрицательный результат. Знать, что невозможно, так же важно, как знать, что есть. FWIW, это появилось в принятом ответе на [этот вопрос] (http://askubuntu.com/questions/627019/blocking-start-of-terminal). – imallett

0

В bash (или любой действительно программе) вы можете получить, позвонив по номеру sleep 0. В большинстве случаев это вызовет планировщик ядра, чтобы переоценить, какой процесс следует запускать дальше. В некоторых распространенных расширенных версиях вы можете даже позвонить sleep с номером с плавающей запятой для обычного времени ожидания в среднем.

+1

Это похоже на плохую идею. Поскольку 'sleep' не является встроенным bash, это потребует создания процесса и уничтожения процесса. Это вряд ли такая нагрузка, которую вы хотите навязать, когда ваша цель должна быть приятной для других вещей, которые хотят получить работу. –

+1

Почти все в bash требует этого. Все нормально. Сон будет «спать» в системном вызове, пока выполняются другие процессы. – Misandrist

+0

@Misandrist, но с '0', он немедленно выходит, поэтому расход нереста исполняемого сна - далеко, * далеко * выше, чем что-либо сохраненное. ОП, по-видимому, пытается выяснить, как быть хорошим гражданином, и поставить «sleep 0» в свои петли опроса, не так ли. (Избегайте опрокидывания в первую очередь, с другой стороны ...) –

Смежные вопросы