Простой поток это в строительстве

Содержание

«Единственная страна, которой может быть выгоден выход из строя сразу двух российских газопроводов – США. Кроме того, они угрожали тем, что «Северного потока –2» вскоре просто не будет», – заявил газете ВЗГЛЯД эксперт в сфере энергетике Игорь Юшков. Ранее сразу в трех нитках «Северных потоков» упало давление. Немецкие СМИ пишут о возможной диверсии и «беспрецедентных разрушениях».

«История выглядит дикой. Одно дело, когда повреждается одна нитка одного газопровода. Тогда инцидент можно было бы списать на технический брак при сварке стыков, на механическое повреждение якорем или что-то в этом роде. Но когда сразу три нитки выходят из строя, это сложно назвать случайностью», – сказал Игорь Юшков, эксперт Финансового университета при правительстве РФ и Фонда национальной энергетической безопасности.

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

«Надо учитывать тот факт, что ранее поступали угрозы со стороны США. В начале года Байден заявил, что «агрессия России» против Украины приведет к тому, что «Северного потока – 2» просто не будет. И теперь «вдруг» оба газопровода вышли из строя», – замечает он.

«Странными кажутся и недавние заявления Польши о необходимости просто разобрать «Северный поток – 2». Эта акция была спланирована. Конечно, можно было бы обвинить Россию в том, что Газпром просто откачал газ из трубы. Но тот факт, что датчане зафиксировали утечку метана близ одного из островов, делает эту версию несостоятельной», – добавил эксперт.

Естественная вентиляция дома. Воздушные потоки

«В целом, эта история выгодна, пожалуй, только США, поскольку так они сжигают мосты газового сотрудничества Европы с Россией. Теперь у нас нет технической возможности поставить необходимые объемы газа в Европу. Восстановление будет долгим», – сказал Юшков.

«Выгодно ли это России? Нет. Мы неоднократно заявляли о готовности вести переговоры, хотели повысить свои переговорные позиции. И «сушить» таким образом европейский рынок нам не на руку», – рассуждает собеседник.

«Надо ли это европейцам? Тоже нет. Им было важно сохранить хотя бы техническую возможность получить российский газ в случае экстренной ситуации. Но теперь им придется покупать только СПГ и вести торговлю с другими странами», – заключил Юшков.

«Если кто-то представил бодрого водолаза, спрыгнувшего с резиновой лодки в Балтийское море и лишившего Германию газа, то зря. Для такой диверсии нужна специализированная подводная лодка и, вероятно, какое-то вооружение, подобное торпеде или подводному беспилотнику», – написал в своем Telegram-канале экономист Антон Любич.

Эксперт также отметил, что «круг тех, кому это выгодно и кто мог бы такое провернуть, оскорбительно мал».

В ночь на понедельник в газопроводе «Северный поток – 2» упало давление. Датское морское управление сообщило, что вблизи «Северного потока – 2» произошла утечка газа. Позднее падение давления зафиксировали на обеих нитках газопровода «Северный поток – 1».

Почему движутся литосферные плиты: теория тектонических плит | Планета Земля | Познавательное видео

Причиной падения давления в газопроводе «Северный поток – 2» и на обеих нитках трубопровода «Северный поток» могла стать целенаправленная диверсия, сообщили источники газеты Der Tagesspiegel.

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

«Мы не можем представить себе сценарий, который не является целенаправленной диверсией. Все говорит против совпадения», – передает ТАСС сообщение источников.

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

При этом уточняется, что поставки российского газа в Европу транзитом через Украину 27 сентября сохраняются в прежнем объеме – около 42,4 млн куб. м в сутки, а поставки по «Северному потоку» полностью остановлены до тех пор, пока не будут устранены повреждения оборудования.

Оператор Nord Stream AG отметил, что сроки восстановления работоспособности трех ниток «Северных потоков» назвать сложно. Сами же разрушения, по мнению оператора, носят беспрецедентный характер Министерство по делам экономики и защиты климата Германии, впрочем, заявило, что не ожидает какого-либо влияния на обеспечение снабжения страны энергией.

Песков заявил, что в Кремле обеспокоены сообщениями о «диверсии» на «Северных потоках»

Падение давления в трубопроводах «Северный поток» и «Северный поток — 2» является беспрецедентной ситуацией, требующей разбирательства. Об этом заявил пресс-секретарь президента РФ Дмитрий Песков, комментируя публикацию газеты Tagesspiegel о том, что давление в газопроводах могло снизиться из-за целенаправленной диверсии.

Он назвал информацию от «Газпрома» и компании-оператора «тревожными новостями».

«Речь идет о неких разрушения в трубе в датской зоне и значительно упало давление. Это совершенно беспрецедентная ситуация, которая требует разбирательств», — сказал Песков, подчеркивая, что в Кремле «обеспокоены новостями».

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

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

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

Читайте также:  Долевое строительство какие документы должны быть

Датские власти заявили о «большой дыре» в газопроводах «Северный поток»

Глава Датского энергетического агентства Кристоффер Беттцаув заявил, что утечки на газопроводе «Северный поток» может быть следствием преднамеренного действия, т.к. там не маленькая трещина, а «большая дыра». Об этом пишет «Газета.ру» со ссылкой на Berlingske.

«Мы обеспокоены тем, что там произошло. И если на подходе еще что-то», — сказал Беттцаув.

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

Премьер Польши Моравецкий назвал саботажем нарушение работы «Северных потоков»

Премьер-министр Польши Матеуш Моравецкий на символической церемонии запуска газопровода Baltic Pipe, который соединяет Польшу с норвежским шельфом через Данию, заявил, что прерывание работы газопроводов «Северный поток» и «Северный поток — 2» является актом саботажа. Об этом сообщает ТАСС.

«Мы еще не знаем подробностей того, что случилось, но ясно видим, что это акт саботажа», — сказал он.

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

Сейсмолог Лунд: рядом с «Северным потоком» прогремело два подводных взрыва

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

По информации издания, измерительные станции в Швеции и Дании зарегистрировали сильные подводные взрывы в районе, где произошла утечка газа в понедельник. Немецкие власти расследуют происшествие на газопроводах как преднамеренную атаку.

«Нет никаких сомнений в том, что это взрывы <. >Хорошо видно, как волны отскакивают от дна к поверхности. Нет сомнений, что это был взрыв. У нас даже была станция в Гношё, которая зафиксировала эти данные», — пояснил Лунд.

Он добавил, что район, где произошла утечка газа, обычно не используется для военных учений.

Еврокомиссия оценила влияние разрушений на «Северном потоке» на безопасность

Разрушения на газопроводах «Северный поток» и «Северный поток-2» не влияют на безопасность снабжения Европы топливом. Так оценил последствия утечек представитель пресс-службы Европейской комиссии (ЕК) Тим Макфи, передает РИА Новости.

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

«На данный момент нет влияния на безопасность снабжения Европы, поскольку, как вы знаете, поставки по «Северному потоку-1» находятся на нулевом уровне в течение нескольких недель, а «Северный поток-2» не авторизован на данный момент», — добавил он.

После новостей об аварии на «Северном потоке» в Европе подорожал газ

Биржевая стоимость газа в Европе преодолела отметку в $1900 за 1 тыс. куб. м. Цена октябрьского фьючерса на хабе TTF в Нидерландах повысилась на 11%, до €192,84 за 1 МВт•ч, или $1948 за 1 тыс. куб. м., следует из данных биржи ICE по состоянию на 12:22 мск.

Повышение цен произошло после заявления компании Nord Stream AG о том, что чрезвычайное происшествие, которое произошло практически одновременно на нитках газопровода системы «Северный поток», является беспрецедентным.

Источник: finance.rambler.ru

Многопоточность в C++. Основные понятия

Разработчики часто сталкиваются с необходимостью разработки многопоточных приложений, поэтому вопросы многопоточности требуют детального изучения. Давайте познакомимся с основными терминами, используемыми в источниках информации о многопоточности, рассмотрим задачи и проблемы многопоточности и изучим средства стандартной библиотеки C++, которые помогут создавать многопоточные приложения.

Основные определения

Многозадачность и многопоточность

Многозадачность (multitasking) – свойство операционной системы или среды выполнения обеспечивать возможность параллельной (или псевдопараллельной) обработки нескольких задач.

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

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

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

Процессы и потоки

В различных источниках информации можно найти много разных определений процессов и потоков. Такой разброс определений обусловлен, во-первых, эволюцией операционных систем, которая приводила к изменению понятий о процессах и потоках, во-вторых, различием точек зрения, с которых рассматриваются эти понятия.

В рамках данной серии статей предлагаю придерживаться следующих определений.

С точки зрения пользователя:

Процесс – экземпляр программы во время выполнения;

Потоки – ветви кода, выполняющиеся «параллельно», то есть без предписанного порядка во времени.

С точки зрения операционной системы:

Процесс – это абстракция, реализованная на уровне операционной системы. Процесс был придуман для организации всех данных, необходимых для работы программы.

Процесс – это просто контейнер, в котором находятся ресурсы программы:

  • адресное пространство;
  • потоки;
  • открытые файлы;
  • дочерние процессы;
  • и т.д.;

Поток – это абстракция, реализованная на уровне операционной системы. Поток был придуман для контроля выполнения кода программы.

Поток – это просто контейнер, в котором находятся:

  • счётчик команд;
  • регистры;
  • стек.

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

Почему нужна поддержка множества потоков внутри одного процесса?

В случае, когда одна программа выполняет множество задач, поддержка множества потоков внутри одного процесса позволяет:

  • разделить ответственность за разные задачи между разными потоками;
  • повысить быстродействие.

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

  • у процесса будет отдельное адресное пространство и данные, что затруднит взаимодействие частей программы;
  • создание и уничтожение процесса дороже, чем создание потока.
Читайте также:  Экологичные материалы для строительства дома что это

Отличие процесса от потока

Процесс рассматривается ОС, как заявка на все виды ресурсов (память, файлы и пр.), кроме одного – процессорного времени. Поток – это заявка на процессорное время. Процесс – это всего лишь способ сгруппировать взаимосвязанные данные и ресурсы, а потоки – это единицы выполнения (unit of execution), которые выполняются на процессоре.

Планирование, состояния потоков, приоритеты

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

Поток может находиться в одном из трёх состояний:

  • выполняемый (executing) – поток, который выполняется в текущий момент на процессоре;
  • готовый (runnable) – поток ждет получения кванта времени и готов выполнять назначенные ему инструкции. Планировщик выбирает следующий поток для выполнения только из готовых потоков;
  • ожидающий (waiting) – работа потока заблокирована в ожидании блокирующей операции.

В реальных задачах важность работы разных потоков может сильно различаться. Для контроля этого процесса был придуман приоритет работы. У каждого потока есть такое числовое значение приоритета. Если есть несколько спящих потоков, которые нужно запустить, то ОС сначала запустит поток с более высоким приоритетом. ОС управляет потоками так, как посчитает нужным.

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

Потоки могут быть созданы не только в режиме ядра, но и в режиме пользователя, в зависимости от того, какой планировщик потоков используется:

  • Центральный планировщик ОС режима ядра, который распределяет время между любым потоком в системе.
  • Планировщик библиотеки потоков. У библиотеки потоков режима пользователя может быть свой планировщик, который распределяет время между потоками различных процессов режима пользователя.
  • Планировщик потоков процесса. К примеру свой Thread Manager есть у каждого процесса Mac OS X, написанного с использованием библиотеки Carbon.

Системные вызовы, режимы доступа

Системный вызов – это вызов функции ядра, из приложения пользователя.

Чтобы защитить жизненно важные системные данные от доступа и (или) внесения изменений со стороны пользовательских приложений, в WIndows и Linux используются два процессорных режима доступа (даже если процессор поддерживает более двух режимов): пользовательский режим и режим ядра.

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

Также следует отметить, что в случае выполнения системного вызова потоком и перехода из режима пользователя, в режим ядра, происходит смена стека потока на стек ядра. При переключении выполнения потока одного процесса, на поток другого, ОС обновляет некоторые регистры процессора, которые ответственны за механизмы виртуальной памяти (например CR3), так как разные процессы имеют разное виртуальное адресное пространство. Здесь я специально не затрагиваю аспекты относительно режима ядра, так как подобные вещи специфичны для отдельно взятой ОС.
Старайтесь не злоупотреблять средствами синхронизации, которые требуют системных вызовов ядра (например мьютексы). Переключение в режим ядра – дорогостоящая операция!

Задачи и проблемы многопоточности

Какие задачи решает многопоточная система?

К достоинствам многопоточной реализации той или иной системы перед однопоточной можно отнести следующее:

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

К достоинствам многопоточной реализации той или иной системы перед многопроцессной можно отнести следующее:

  • Упрощение программы (взаимодействия её параллельных частей) в некоторых случаях за счёт использования общего адресного пространства.
  • Меньшие относительно процесса временные затраты на создание потока.

Распараллеливать работу приложения бывает удобно в самых разных ситуациях. Вот несколько примеров:

  • Многопоточность широко используется в приложениях с пользовательским интерфейсом. В этом случае за работу интерфейса отвечает один поток, а какие-либо вычисления выполняются в других потоках. Это позволяет пользовательскому интерфейсу не подвисать, когда приложение занято другими вычислениями.
  • Многие алгоритмы легко разбиваются на независимые подзадачи, которые можно выполнять в разных потоках для повышения производительности. Например, при фильтрации изображения разные потоки могут заниматься фильтрацией разных частей изображения.
  • Если некоторые части приложения вынуждены ждать ответа от сервера/пользователя/устройства, то эти операции можно выделить в отдельный поток, чтобы в основном потоке можно было продолжать работу, пока другой поток ждёт ответа.
  • и т.д.

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

Какие проблемы несёт реализация многопоточных приложений?

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

Читайте также:  Сроки строительства дома на участке под ИЖС после выделения земельного участка

Рассмотрим некоторые проблемы синхронизации.

Состояние гонки (race condition)

Состояние гонки – ошибка проектирования многопоточной системы или приложения, при которой работа системы или приложения зависит от того, в каком порядке выполняются части кода.

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

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

Поток 1Поток 2 Целочисленное значение
0
прочитать значение 0
увеличить значение 0
записать обратно 1
прочитать значение 1
увеличить значение 1
записать обратно 2

В результате мы получаем значение 2, как и ожидали. Однако, если два потока работают одновременно, и их работа не синхронизируется, результат операции может быть неправильным. Возможна следующая последовательность операций:

Поток 1Поток 2 Целочисленное значение
0
прочитать значение 0
прочитать значение 0
увеличить значение 0
увеличить значение 0
записать обратно 1
записать обратно 1

В этом случае результат будет равен 1, хотя ожидалось значение 2.

Код на C++, приводящий к состоянию гонки:

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

Использование атомарных операций:

Подробнее про atomic :

Ограничение доступа к переменной так, чтобы только один поток в один момент времени мог изменять переменную:

В этом примере поток перед тем как изменить переменную захватывает mutex (устанавливает флаг о том, что переменная занята), а другой поток, пытаясь захватить тот же mutex в это же время, обнаруживает, что первый поток уже работает с переменной, и дожидается её освобождения.

Подробнее про mutex :

Используя mutex в примере выше, мы синхронизируем работу потоков. Mutex является примитивом синхронизации.

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

Примитивы синхронизации преследуют различные задачи:

  • Взаимное исключение потоков – примитивы синхронизации гарантируют то, что единовременно с критической областью будет работать только один поток.
  • Синхронизация потоков – примитивы синхронизации помогают отслеживать наступление тех или иных конкретных событий, то есть поток не будет работать, пока не наступило какое-то событие. Другой поток в таком случае должен гарантировать наступление данного события.

Однако если взаимоотношения между потоками более сложные, то неаккуратные блокировки потоков могут приводить к новой проблеме – взаимным блокировкам (deadlock).

Взаимная блокировка (deadlock)

Deadlock – ситуация, при которой несколько потоков находятся в состоянии ожидания ресурсов, занятых друг другом, и ни один из них не может продолжать выполнение.

Взаимная блокировка (deadlock)

Взаимная блокировка (deadlock)

Представим, что поток 1 работает с каким-то объектом 1, а поток 2 работает с объектом 2. При этом программа написана так:

  • Поток 1 перестанет работать с объектом 1 и переключится на объект 2, как только поток 2 перестанет работать с объектом 2 и переключится на объект 1.
  • Поток 2 перестанет работать с объектом 2 и переключится на объект 1, как только поток 1 перестанет работать с объектом 1 и переключится на объект 2.

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

Кстати, на Quora есть отличные примеры из реальной жизни, объясняющие что такое deadlock.

Пример возникновения взаимной блокировки в программе на C++:

Менее наглядный, но более жизненный пример можно посмотреть тут.

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

С учётом этого пример принимает следующий вид:

В нашем простом примере легко было вручную задать верный порядок блокировки мьютексов, однако, это не всегда так легко. Например, в ситуации, когда два мьютекса передаются в функцию по ссылке и блокируются ею, порядок блокировки будет зависеть от порядка переданных аргументов. Поэтому для блокировки мьютексов одинаковом порядке стандартная библиотека предоставляет функцию std::lock (аналог std::mutex::lock() ) и класс std::scoped_lock (аналог std::lock_guard ).

std::scoped_lock – это улучшенная версия std::lock_guard , конструктор которого блокирует произвольное количество мьютексов в фиксированном порядке (как и std::lock ). В новом коде следует использовать std::scoped_lock , std::lock_guard остался в языке для обратной совместимости. Пример:

Аналогичный код с std::lock и std::lock_guard выглядел бы следующим образом:

Если требуется больше гибкости, например, при использовании condition variables , можно использовать std::unique_lock :

Другие проблемы

Кроме описанных выше проблем, иногда можно столкнуться с проблемой голодания потоков и с проблемой livelock.

Голодание потоков – это ситуация, в которой поток не может получить доступ к общим ресурсам, потому что на эти ресурсы всегда претендуют какие-то другие потоки, которым отдаётся предпочтение.

Поток часто действует в ответ на действие другого потока. Если действие другого потока также является ответом на действие первого потока, то может возникнуть livelock. Потоки не блокируются – они просто слишком заняты, реагируя на действия друг друга, чтобы возобновить работу.

Источник: radioprog.ru

Рейтинг
Загрузка ...