2012-03-21 3 views
0

Я изучаю темы, и я не уверен, понимаю ли я некоторые понятия. В чем разница между преимуществом и доходностью? До сих пор я знаю, что превенция является принудительной доходностью, но я не уверен, что она на самом деле означает. Спасибо за помощь.Pthread Concepts

+0

Утоление осуществляется в рамках приложения. Предотвращение выполняется вне приложения (операционной системой). – Java42

ответ

1

Предотвращение, когда один поток останавливает выполнение другого потока, чтобы он мог работать.

Чтобы получить, когда нить добровольно отказывается от процессорного времени.

+0

, когда мы упреждаем, но это не значит, что бегущая нить обязательно закончится? – BBB

+0

Нет, я понимаю, что поток остановлен от запуска, не закончив его задачу, другой поток будет запущен, как только он закончится (или это временной срез закончился), тогда первый поток может быть пересмотрен для повторного запуска. – 111111

1

Разница заключается в том, как вводится ОС.

«выход» - системный вызов программного прерывания AKA, один из многих, который может привести к изменению набора запущенных потоков (есть много других системных вызовов, которые могут это сделать - блокировка чтения, вызовы синхронизации). yield() вызывается из работающего потока и может привести к тому, что другой готовый (но не работает) поток с тем же приоритетом запускается вместо вызывающего потока - если он есть.

Точное поведение yield() является некоторым аппаратным/OS/зависимым от языка. Если вы не разрабатываете низкоуровневые механизмы блокировки потоков, и вы очень хороши в этом, лучше всего просто забыть о yield().

Предотвращение является актом прерывания одного потока и отправки другого на свое место. Это может произойти только после аппаратного прерывания. Когда аппаратные прерывания, его драйвер вводится. Драйвер может решить, что он может с готовностью сделать поток готовым (например, поток блокируется при вызове read() к драйверу, и драйвер накопил хороший большой буфер данных). Водитель может это сделать, сигнализируя о семафоре и выходя через. ОС (которая обеспечивает точку входа именно для такой цели). Этот путь выхода драйвера вызывает перепланирование и, вероятно, делает поток чтения запущенным вместо некоторого другого потока, который выполнялся до прерывания, - другой поток был выгружен. По сути и просто, preemption происходит, когда ОС решает прерывать возврат к другому набору потоков, чем тот, который был прерван.

1

Выход: Нить вызывает функцию планировщика, которые потенциально «парки», что нить, и начинается другой. Другой поток - это тот, который раньше назывался уроком, и теперь, похоже, возвращается из него. Многие функции могут иметь семантику, такую ​​как чтение с устройства.

Preempt: в систему поступает внешнее событие: какое-то прерывание (часы, данные о сети, прибытие ввода-вывода на диске). В зависимости от того, какой поток работает в это время, он приостанавливается, и машина запускает код операционной системы в контексте прерывания. Когда прерывание обслуживается, и пришло время вернуться из прерывания, можно принять решение о планировании, чтобы сохранить прерванный поток припаркованным и вместо этого возобновить другой. Это предположение. Если/когда этот исходный поток снова запустится, контекст, который был сохранен прерыванием, будет активирован, и он будет точно определять, где он остановился.

Системы планирования, которые полагаются исключительно на доходность, называются «кооперативными» или «совместными многозадачными», а не «превентивными».

Традиционные (читай: старые, 1970-е и 80-е годы). Unix совместно многозадачна в ядре с упреждающим пользовательским пространством.Подпрограмма ядра проверяется на получение в разумные сроки, и поэтому при запуске кода ядра прерывание отключается. Это значительно упрощает кодирование ядра и повышает надежность за счет производительности, особенно когда вводится несколько процессоров. Linux был так много лет.