здравствуйте, не могу понять что такое task с точки зрения операционной системы...
везде пишут, что task-based параллелилизм берет "задачу" из пула... а что значит
"задача"?
вот есть нативный thread со своим стеком... правильно ли я понимаю что task это "thread
без своего стека" т.е. легковесный поток? если да, то как это реализовано с точки зрения
операционной системы?
и правильно ли я полагаю, что async/await использует как-то эту самую концепцию легковесных
потоков?
Ответы
Ответ 1
Нет, вы понимаете не вполне верно.
Для начала, как правильно замечает @PetSerAl, Task — внутреннее понятие .NET и никак
не отображается на объекты операционной системы.
Затем, информация о том, что «task-based параллелилизм берет "задачу" из пула», просто
ошибочна. Проще всего представлять себе Task как promise (которым он реально и является).
Вы должны видеть Task лишь как объект, который в какой-то момент времени завершается.
Слово «завершается» означает лишь то, что он переходит в состояние Completed, и что
вызов var result = await task; при этом также завершается. При этом await не является
блокирующим вызовом, оно прекращает выполнение текущего кода, и возобновляет его при
завершении promise.
На деле, то, как именно реализован Task, и в какой ситуации он представляет собой
реально бегущий в каком-либо потоке (или в каких-либо потоках) код, а в какой вовсе
ни в каком (например, код подписался на какое-либо событие, и завершит таск при приходе
этого события). Вас должна интересовать лишь семантика обещания завершиться и произвести
результат (или исключение).
Это похоже на легковесный поток, но не является им: поток не производит результат,
а просто бежит, в отличие от таска, который каким-то своим образом получает результат
в какой-то отдалённый момент времени. Но и в том, и в другом случае к него нету выделенного
стека: ведь потоки и стек — более низкоуровневое понятие.
Пример Task'а, который не занимает никакого потока, легко сконструировать:
Task Delay(int milliseconds)
{
var tcs = new TaskCompletionSource
Комментариев нет:
Отправить комментарий