Почему потоки называют легкими процессами?

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

Я нашел это в одном из учебных руководств.

Кто-то может разработать то, что это точно означает?

23
задан Peter O. 7 October 2014 в 06:21
поделиться

3 ответа

REST проходит довольно хорошо с аутентификацией (т.е. обычной аутентификацией), поэтому попробуйте использовать имя пользователя вашего сайта пользователя и пароль, специфичный для приложения, связанного с этим пользователем - метод, иногда называемый API-ключами. Что-то, что делает API FriendFeed см. в документации .

Несколько заметок трудно:

  • использовать дайджест аутентификации или SSL
  • с ключом API для каждого приложения может быть немного накладных расходов, поэтому большинство сайтов имеют один ключ API для всех сторонних приложений
  • OAuth может быть стоит извлечь
-121--1429732-

2 вещей. Во-первых, если вы сохраняете имеющийся дизайн кода, вам необходимо выполнить Seek () для MemureStream, прежде чем записывать его в запись.

dt.TableName = "Declaration"; 

MemoryStream stream = new MemoryStream(); 
dt.WriteXml(stream); 
stream.Seek(0,SeekOrigin.Begin);   // <-- must do this after writing the stream!

using (ZipFile zipFile = new ZipFile())
{
  zipFile.AddEntry("Report.xml", "", stream); 
  Response.ClearContent(); 
  Response.ClearHeaders(); 
  Response.AppendHeader("content-disposition", "attachment; filename=Report.zip"); 

  zipFile.Save(Response.OutputStream); 
}

Даже если вы сохранили этот дизайн, я бы предложил предложение using (), как я показал, и как описано во всех примерах DotNetZip , вместо вызова Dispose (). Предложение using () является более надежным в случае сбоев.

Теперь вы можете задаться вопросом, почему необходимо искать в MemureStream перед вызовом AddEntry ()? Причина в том, что AddEntry () предназначен для поддержки тех вызывающих абонентов, которые проходят поток, где позиция является важной. В этом случае вызывающему абоненту необходимо считать входные данные из потока , используя текущее положение потока . AddEntry () поддерживает это. Поэтому установите позицию в потоке перед вызовом AddEntry ().

Однако лучше всего изменить код, чтобы использовать перегрузку AddEntry (), которая принимает WriteDelegate . Он был разработан специально для добавления наборов данных в zip-файлы. Исходный код записывает набор данных в поток памяти, затем выполняет поиск в потоке и записывает содержимое потока в zip. Записывать данные один раз быстрее и проще, что позволяет функция WriteDelegate. Код выглядит следующим образом:

dt.TableName = "Declaration"; 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.ContentType = "application/zip";
Response.AppendHeader("content-disposition", "attachment; filename=Report.zip"); 

using(Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile())
{
    zipFile.AddEntry("Report.xml", (name,stream) => dt.WriteXml(stream) );
    zipFile.Save(Response.OutputStream); 
}

Набор данных записывается непосредственно в сжатый поток в zipfile. Очень эффективно! Двойная буферизация отсутствует. Анонимный делегат вызывается во время ZipFile.Save (). Выполняется только одна запись (+ сжатие).

-121--1116936-

Утверждение о том, что потоки являются "легкими", является - в зависимости от платформы - не обязательно надежным.

Поток операционной системы должен поддерживать выполнение собственного кода, например, написанного на языке C. Поэтому он должен обеспечивать стек приличного размера, обычно измеряемый в мегабайтах. Таким образом, если вы запустили 1000 потоков (возможно, в попытке поддержать 1000 одновременных подключений к вашему серверу), вам потребуется 1 ГБ памяти в вашем процессе, прежде чем вы даже начнете делать какую-либо реальную работу.

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

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

Подводя итог: будьте насторожены «маркетинговыми» претензиями, выдвинутыми от имени потоков. Параллельная обработка велика (все чаще она будет иметь важное значение), но потоки являются лишь одним из способов ее достижения.

27
ответ дан 29 November 2019 в 01:16
поделиться

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

Потокам этого делать не нужно, просто измените несколько указателей, так что это намного «дешевле», чем создание процесса. Причина, по которой потокам это не нужно, заключается в том, что они работают в адресном пространстве и виртуальной памяти родительского процесса.

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

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

18
ответ дан 29 November 2019 в 01:16
поделиться

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

Кроме того, связь между потоками внутри процесса упрощена , поскольку они совместно используют адресное пространство.

9
ответ дан 29 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: