Отдел продаж

Телефоны: (3532) 25-27-22, 93-60-02, 93-50-02

E-mail: [email protected]

г.Оренбург, ул.Беляевская, д.50/1, стр.1

 

Разное

Блок розеток как подключить: Схема подключения блока розеток: инструкция

Содержание

Схема подключения блока розеток: инструкция

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

Блок розеток может состоять из трех и более точек электропитания

Различные варианты подключения блока розеток

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

  • последовательное, оно же шлейфовое;
  • параллельное, другое название – звездой.

Оба варианта доступны для самостоятельного выполнения. Благодаря простоте монтажа, наиболее популярным является первый способ, но для соблюдения справедливости, вторая версия также будет рассмотрена в данной публикации. Читайте также статью: → «Пошаговая инструкция и схемы подключения трехфазных розеток».

Схема последовательного подключения блока розеток

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

Простая схема последовательного подключения блока розеток с RE проводником

Обычная розетка рассчитана на токовую нагрузку до 16 А. Однако в предложенной схеме данный показатель не может быть применен для каждого разъема, так как здесь принимается во внимание общее суммарное значение силы тока на всех точках. Следовательно, такой вариант подходит для запитывания группы приборов с незначительной мощностью.

Практический совет: Согласно Правилам устройства электроустановок (ПУЭ), разрыв защитного заземляющего RE проводника не допускается, поэтому его подводка с помощью перемычек будет считаться нарушением.

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

Схема параллельного подключения блока розеток

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

Схема параллельного подключения блока розеток с разводкой от распределительной коробки

Практический совет: Для обеспечения надежного контакта на месте расщепления фазного и нулевого проводника рекомендуется использовать клеммные колодки (клемники) или специальные металлические гильзы для обжимки провода.

Применение обжимных устройств делает соединение проводов надежным и безопасным

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

Пошаговая инструкция установки блока розеток

Работу по установке коммутационного узла разъемов можно условно разделить на два этапа, один из которых назвать подготовкой, а второй – монтажом. Первый сводится к обустройству ниши в стене для размещения в ней подрозетников. Второй заключается в непосредственной работе с электрикой – проводами и контактами. Читайте также статью: → «Виды розеток и рекомендации по их выбору и монтажу».

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

Инструкция по выполнению подготовительных работ и установке подрозетников

Первый, подготовительный этап – установка подрозетников в стену

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

  1. В стене, от распределительной коробки до места будущего расположения электрического коммутационного узла, пробивается штроба для последующей скрытой укладки проводов, либо устраивается кабель-канал для наружной проводки
  2. Используя строительный уровень, отмечается горизонтальная линия, которая станет «маяком» при установке коробок для розеток, после чего осуществляется разметка ниши
  3. С помощью дрели со специальной насадкой производится выборка в стене, в которую помещается блок подрозетников
  4. Оставшееся свободное пространство вокруг изделия замуровывается подготовленной строительной смесью (замазкой, алебастром, шпаклевкой).

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

Инструкция по монтажу электрической части

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

  1. В штробу или кабель-канал укладывается провод, один конец которого выводится в распределительную коробку, второй – в установленный накануне подрозетник
  2. Блок розеток разбирается, лицевая панель отделяется, а болты на контактах внутренней части послабляются
  3. Между соответствующими контактами устройств устанавливаются перемычки: светлые провода на фазные клеммы, синие – на нулевые
  4. Первая из ячеек подключается к проводу, проложенному по стене, после чего внутренняя часть помещается в подрозетник и закрепляется там
  5. В распределительной коробке производится коммутация с проводами электрической сети, а места соединения тщательно изолируются
  6. Возобновляется подача электроэнергии, с помощью индикатора проверяется поступление тока на розетки
  7. Лицевая панель блока устанавливается на место, производится проверка работоспособности через подключение электроприбора.

Заключительным действием является заделывание штробы в стене или закрывание короба кабель-канала крышкой. При подключении с помощью перемычек фазы и нуля образуются шлейфы, а RE проводник коммутируется с розетками путем ответвления.

Конечный результат монтажа блока розеток, выполненного своими руками

Наиболее часто допускаемые ошибки при монтаже

Во время установки блока розеток могут быть допущены следующие ошибки способные повлиять на внешнюю привлекательность или работоспособность изделия:

  1. Использование для соединения с алюминиевым проводом через скрутку проводника с медной жилой. Подобная ошибка может привести к нарушению контакта из-за окисления и прекращению работы изделия. Жилы соединяемых токоведущих проводов должны быть либо из одного металла, либо соединяться через клеммник
  2. Использование плоского провода с однослойной изоляцией и замуровывание его в стене без помещения в пластиковую или гофрированную трубку. Ранее такой метод разрешался, но в настоящее время рекомендуется применение дополнительной защитной оболочки
  3. Применение для изготовления перемычек проводов разного сечения. Это нельзя назвать грубой ошибкой, но для этих целей рекомендуется применять жилу с площадью сечения равной сечению электропроводки
  4. Подключение RE проводника шлейфовым способом, то есть с помощью перемычек между розетками. Как указывалось выше, такой способ считается нарушением ПУЭ
  5. Оставление слишком длинных концов провода при вводе в подрозетник или распределительную коробку. Для комфортной работы, концы провода должны составлять 12-15см. В противном случае могут возникнуть проблемы с его укладкой при завершении монтажа
  6. Устройство счалок или скруток провода в кабель-канале или штробе. Все контакты и соединения должны выполняться только в электрических монтажных коробках (распределительных или розеточных). Это облегчает ремонт и ревизию электрических сетей.

Избегая перечисленных ошибок, пользователь сможет самостоятельно смонтировать блок розеток и пользоваться им на протяжении длительного времени. Читайте также статью: → «Как правильно установить и подключить розетку? Схемы подключения».

Актуальные вопросы по теме

Вопрос №1. Допускается ли установка блока розеток на стене из гипсокартона?

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

Вопрос №2. На какой высоте от пола должны располагаться розетки в жилом помещении?

В Советском союзе действовали строгие правила, определяющие высоту расположения розеток 90 см от пола. Сейчас таких жестких ограничений нет и точки электропитания могут устанавливаться на разной высоте, но все же рекомендуется монтировать их не ниже 15-30 см от основания.

Вопрос №3. Если блок розеток нельзя использовать для подключения мощных потребителей, как пользоваться водонагревателем или конвектором?

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

Схема отдельного подключения блока розеток и линии для мощных приборов

Вопрос №4. Можно ли подключать провод не к крайней розетке блока, а к средней?

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

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

Оцените качество статьи:

как подключить, специфика и схемы установки

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

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

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

Содержание статьи:

Устройство и места установки розеточных блоков

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

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

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

Розеточные блоки бывают двух типов:

  • Предназначены для скрытой проводки. Устанавливаются в толщу стены с помощью модуля из выполненных в форме стаканов подрозетников;
  • Предназначены для открытой проводки. Устанавливаются на поверхность стены с помощью выполненного в форме пластины подрозетника.

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

Розеточные блоки часто , располагая их за рабочим столом на высоте в 10 см, внутри кухонных тумб и за стенками соседних тумбочек на уровне 30-60 см от чистового пола.  Встроенные розетки удобно использовать при подключении группы не мощных бытовых приборов: вытяжки, мультиварки, холодильника…

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

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

Способы подключения с учетом потребителей

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

Единственным «минусом» такой схемы является то, что в случае повреждения в месте контакта одной из жил перестают функционировать и все расположенные за ней элементы

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

Параллельное подключение предполагает прокладку от распределительной коробки двух кабелей:

  • первый направляется в виде шлейфа, запитывая четыре из пяти розеток 5-местного блока;
  • второй – подводится отдельно к пятой точке розеточной группы, которая предназначена будет для запитки мощного прибора.

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

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

Единственный недостаток схемы – увеличение расхода кабеля и затрат труда электромонтажника.

Как шлейфовый, так и комбинированный способ подключения может быть закрытого и открытого исполнения. Первый предполагает выдалбливание каналов в стене для прокладки линий и «гнезд» под разъемы, второй реализуется путем прокладки РЕ проводника на поверхности стены.

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

Применение пластиковых кабель-каналов повышает безопасность и эстетичность открытой проводки. Большинство из них снабжено перегородками, между которыми и прокладывают линию. Контроль за состоянием РЕ проводника удобно осуществлять через съемную переднюю часть.

Инструкция по монтажу розеточного блока

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

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

Проведение подготовительных работ

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

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

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

Из материалов необходимо заранее подготовить:

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

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

Из инструментов потребуются:

  • перфоратор, оснащенный бурильной коронкой D 70 мм;
  • строительный уровень;
  • рулетка, линейка и маркер;
  • электромонтажный набор инструментов;
  • емкость для замешивания гипса;
  • шпатель.

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

Нанесение разметки на стену

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

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

Галерея изображений

Фото из

Шаг 1 — выбор места установки блока подрозетников

Шаг 2 — использование лазерного или пузырькового уровня

Шаг 3 — обозначение на стене точек монтажа розеток

Шаг 4 — определение точного места посадки каждого подрозетника

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

Расстояние между центрами подрозетников должно соответствовать 72 мм, иначе при установке декоративной крышки она просто не «сядет» на свое место

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

Способы устройства разводки и прокладки кабеля в квартире подробно изложены в нашего сайта.

Создание штроб и «посадочных» мест

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

Чтобы обеспечить точность монтажа, отверстие сначала намечают сверлом небольшого диаметра. Лишь после этого насаживают коронку, которая делает углубление по контуру будущего «посадочного» места.

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

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

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

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

Если под рукой нет перфоратора – смело используйте болгарку; оснастив прибор алмазным диском, вы сможете при минимуме усилий создать идеально ровные контуры канавок

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

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

Специфика крепления подрозетников

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

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

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

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

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

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

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

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

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

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

Тонкости подключения электрики

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

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

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

Главное – не допускать резкий изгиб или перелом, чем нередко «грешат» неопытные хозяева, укладывая провода внутри стакана на “скорую руку”

Заранее подготавливают отрезы разноцветных проводов для создания перемычек. Сечение перемычек должно соответствовать проводниками питающей линии. Проводники перемычки не стоит делать слишком длинными. Иначе в процессе подключения они будут мешать и не позволять розетке плотно «сесть» в монтажную коробку. В отрезанных проводах также зачищают изоляцию приблизительно на сантиметр.

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

С самого розеточного блока снимают защитную крышку, затем на 5-6 мм откручивают зажимные винты. Зачищенный конец фазного провода питающего кабеля подводят к первой розетке с учетом положения клемм. От нее через контакты РЕ проводник и нулевые провода питающего кабеля направляют во вторую розетку.

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

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

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

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

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

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

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

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

Пошаговая фотоинструкция:

Галерея изображений

Фото из

Шаг 1 — выведение и зачистка проводов

Шаг 2 — монтаж проводов в клеммы

Шаг 3 — установка корпуса в подрозетник

Шаг 4 — посадка корпуса на крепежные винты

Шаг 5 — монтаж последней в ряду розетки

Шаг 6 — выравнивание розеток по горизонтали

Шаг 7 — протяжка крепежа в «ушках»

Шаг 8 — монтаж декоративной крышки

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

Выводы и полезное видео по теме

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

Видео #1. Обустройство подрозетников для розеточной панели:

Видео #2. Инструкция по установке пятирозеточного блока:

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

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

Подключение блока розеток

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

Что дает использование блока розеток

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

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

  • Монтируем в стене количество подрозетников, размер зависит от количества потребителей, которое планируется подключить к блоку;
  • Собираем в блоке розеток линию заземления;
  • Заводим в подрозетники шлейфы и подключаем контакты к проводке;
  • Собираем блок розеток.

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

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

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

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

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

Последовательность сборки блока

Перед тем как искать способ подключения розеток к сети, нужно выбрать правильное расположение блока согласно ПЭУ. Например, для ванной комнаты точка установки должна быть удалена от источника воды не менее чем на 600 мм. Для обычной жилой комнаты блок должен располагаться на высоте не менее 300 мм над уровнем пола.

Кроме того, потребуется:

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

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

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

Монтируем подрозетники для блока розеток

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

Перфоратором вырезаем нишу под подрозетники, на каждую розетку приходится 72 мм ширины и 42 мм глубины. Если планируется установить пять розеток, потребуется вырезать нишу 75 мм высотой и 360 мм длиной.

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

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

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

Как правильно подключить заземление и питающие провода

В большинстве случаев проще и удобнее подключить контакты розеток к вводной части электропроводки с помощью готовых отрезков провода, длиной 20 см. Лучше всего подойдет многожильный провод ПВ3 с загильзованными концами. Фазу можно подключить коричневым проводом, массу синим. Заземление розетки можно подключить проводом желтого или желто-зеленого цвета. Многожильный провод намного удобнее и мягче одножильных, его можно легко сложить, согнуть и даже уложить в самых труднодоступных местах подрозетника.

Первым делом необходимо подключить заземление. Перед установкой на контакт заземления каждой розетки необходимо подключить провод определенной длины. Для последнего подрозетника необходимо отрезать кусок в 40 см, для первого — в 15 см, остальные необходимо вымеривать по месту. Все провода заземления нужно подключить в одной точке к «земле» вводного кабеля. Для этого можно использовать разъем «Scotchlok», монтажную колодку, но большинство электриков предпочитают соединить «землю» обычной скруткой, заизолированной термоусадочной трубкой.

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

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

Завершающие операции

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

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

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

Заключение

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

Отправить комментарий

Подключение блока розеток и установка своими руками

Чаще всего розеточный блок из 2, 3, 4 «электрических точек» устанавливают на кухне и в зале за телевизором. Горизонтальная либо вертикальная панель из евророзеток очень удобная, т.к. позволяет в одном месте подключить взаимодействующую группу бытовой техники, к примеру: телевизор, аудиосистему и DVD проигрыватель. Далее мы расскажем, как правильно выполнить установку и подключение блока розеток в доме своими руками!

В чем может быть нюанс

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

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

Инструкция по монтажу

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

Шаг 1 – Подготовительные работы

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

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

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

Шаг 2 – Разметка стен

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

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

Шаг 3 – Создание штроб

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

Как выполнить штробление кирпичной стены под установку розеточной панели

Если стены в вашей квартире зашиты листами ГКЛ, тут еще проще – с помощью перфоратора и коронки по гипсокартону вырезаете круглые штробы согласно разметке.

Монтаж стаканов в гипсокартонной перегородке

Шаг 4 – Крепление подрозетников

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

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

Шаг 5 – Подключение электрики

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

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

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

Видео инструкция по монтажу

Как быстро подключить тройную розеточную панель к электросети?

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

Также читают:

Как подключить блок розеток или блок розетка + выключатель

Мы с вами рассмотрели, как подключается розетка 220 вольт. Настала очередь рассказа об установке блока из нескольких устройств.

Важно! В современные модульные блоки часто включают не только силовые розетки, но также компьютерные и телефонные.

Техника безопасности

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

Подключение блока розетка + выключатель

«Штатное» место установки такого модульного изделия– в коридоре на перегородке, разделяющей ванную комнату и санузел. На одной панели размещены выключатели осветительных приборов в этих помещениях и розетка для электроприборов, которыми постоянно пользуются в ванной комнате. Изделие без защиты от влаги использовать в ванной комнате опасно, поэтому блоки без влагозащиты монтируют в коридоре.

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

  1. Заземляющий проводник на схеме показан светло-зеленым цветом, ноль – синим. Два эти проводника напрямую идут от распредкоробки до розетки.
  2. Фаза обозначена красным цветом. Этот проводник подключается к розетке, затем перемычкой – на общий контакт входящей фазы выключателя.
  3. Оставшиеся два провода подсоединяют на два коммутируемых контакта. Через них фаза подключается к осветительным приборам при нажатии клавиш. Это светильники в санузле и ванной комнате. Такая схема обеспечивает постоянную фазу, ноль и заземление на розетке, и фазу на нижнем контакте клавиш выключателя (ноль идет на осветительный прибор). На верхнем контакте фаза появляется при нажатии клавиш.

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

Важно! Для изменения порядка срабатывания клавиш требуется поменять местами бежевый и желтый провода на выключателе.

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

Использование трехклавишного изделия требует применение 6-жильного кабеля. Шестая жила кабеля подсоединяется на третий коммутируемый контакт сверху вместе с бежевым и желтым проводниками.

Подключение

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

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

Как подключить розетки в модульном изделии?

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

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

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

Совет! Лучше при зачистке оставить небольшой запас кабеля, идущего от распределительной коробки. В будущем у вас будет возможность снова зачистить провода и сделать новое подключение.

Первое устройство подключается как обычное электроустановочное устройство на 220 вольт. Само устройство устанавливается в монтажной коробке по уровню. Провода одинакового цвета подключаются параллельно. Затем устанавливается второе устройство. К третьему подводятся три провода. Проверяется надежность установки всех устройств, монтируется общая планка и лицевые панели.

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

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

Как установить блок розеток. Инструкция от А до Я / Публикации / Элек.ру

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

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

Под блоком розетки понимается несколько одиночных розеток объединенных в одно целое. Он может состоять из 2-6 мест. На большее количество просто не сможете найти общую рамку. Если такого количества не хватает, то нужно тогда делать два блока розеток. Ниже расскажу, как это все можно организовать самому, т.е. как установить. Это будет выглядеть как инструкция от А до Я. Сразу отмечу, что в ней не будет 33-х пунктов согласно количества букв в нашем алфавите. Если мы до буквы «Я» не дойдем, то сильно не расстраивайтесь)))

Итак, вот сама инструкция:

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

б) Начинать все работы необходимо с разметки. На нужной высоте рисуется по уровню горизонтальная линия. Далее ставим на ней точку в месте центра первой розетки. Для разметки можно использовать простой карандаш или любой маркер. Затем нужно указать центр следующей розетки. Как его найти? Тут все просто. Запомните, что между центрами соседних розеток расстояние составляет 71 мм. Поэтому от первой точки отмеряете 71 мм и ставите вторую точку. Их количество будет равно количеству одиночных розеток во всем блоке.

в) Теперь нам нужен перфоратор и сверло или бур диметром 6 мм в зависимости от материала стен. Далее сверлим очень аккуратно и точно по центрам указанных точек. Если бур во время сверления уйдет в какую-либо сторону на несколько миллиметров, то розетки у вас будут не по уровню, а одна выше другой. Этого допустить нельзя, так как потом не встанет общая рамка на несколько постов.

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

д) Далее нужно определиться откуда и с какой стороны к розеткам будет подходить кабель. Он может спускаться сверху с потолка или подниматься снизу от пола. Заводить его нужно в крайний подрозетник, так как от него шлейфом друг за другом будут соединяться соседние розетки. В месте подвода кабеля к розетке в стене зубилом нужно выдолбить углубление, т.е. организовать ему свободное место рядом с круглым высверленным отверстием.

е) Берем сами подрозетники диаметром 68 мм. Их нужно покупать одной фирмы и с одинаковыми размерами. У некоторых производителей, например, у Hegel, у подрозетников есть специальные «уши» по бокам.

С их помощью они собираются в один блок. А у других может не быть этих «ушей» и для соединения подрозетников в один блок нужно будет докупать специальные соединители. Этот момент обязательно учитывайте во время их покупки. Итак, соединили между собой несколько штук и готовый блок поставили на место. Далее нужно проверить, что он входит в стену полностью, что он стоит по уровню и не перекошен.

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

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

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

к) Разделываем и зачищаем приходящий кабель. Длину жил можно оставить где-то 10-12 см. Больше не нужно, иначе их сложно будет уместить в подрозетниках за розетками. Заранее готовим перемычки из жил кабеля аналогичного сечения. Длина перемычек должна быть 15-20 см. При необходимости лишнее можно будет откусить.

л) Берем первую розетку и подключаем к ней все приходящие жилы и уходящие перемычки на соседнюю розетку. Этот способ соединения называется подключение шлейфом, то есть последовательным. На каждом контакте розетки есть два отверстия. Одно для приходящей жилы, а другое для уходящей на соседнюю розетку. Так можно подключать их и все будет работать долго и исправно. Главное при зачистке кабеля не повредить медные жилы, иначе они могут со временем переломиться. Поэтому для этих работ стоит использовать специальные съемники изоляции.

м) После подключения кабеля к первой розетке ее нужно зафиксировать в подрозетнике строго по уровню. Она крепится с помощью маленьких саморезов, которые идут с самими подрозетниками. Еще в каждой розетке по бокам есть специальные распорки. Можно ее закрепить с помощью данных распорок. Когда первая розетка установлена на свое место, то переходим к подключению следующей розетки. Далее поступаем аналогичным способом, который описан в пунктах нашей инструкции з) и и).

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

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

Источник: Компания «Уралэнерго».

конструкция, пошаговая инструкция по установке и разновидности

На чтение 7 мин Просмотров 263 Опубликовано Обновлено

Для удобного размещения бытовой техники и осветительных приборов часто используют блок розеток. Он имеет от 2 до 5 точек электропитания. Установка комплекта не вызывает сложности при наличии у мастера навыков. Справиться с работой сможет даже новичок.

Конструкция розеточного блока

Блок розеток с 5 точками

Полный комплект под монтаж точек электропитания имеет такую конструкцию:

  • набор подрозетников;
  • сама полимерная панель с расположенными на ней 2-4 розетками.

Размеры одной равны 72х72 мм. Соответственно:

  • две точки в ряду — 142 мм;
  • три — 212 мм;
  • четыре — 284 мм.

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

  • Кухня. Как правило, точки электропитания устанавливают над рабочей поверхностью в 40 см (минимум) от мойки.
  • Гостиная. Чтобы розеток не было видно, их можно убрать за тумбу с телевизором или под барную стойку.
  • Ванная комната. Тут всю конструкцию можно расположить за встроенным шкафом. Таким образом точки питания будут скрыты от глаз и влаги дверцами мебели.

Желательно поднимать розетки от пола на уровень 60 см и выше.

Способы подключения

Комбинированный способ подключения розеток

Подключать точки питания к электрокабелю можно двумя способами:

  • Шлейфовый. Подразумевает запитывание каждой розетки от одной линии. Плюс такого способа – минимальная трудоемкость процесса. Минус — выход из строя всех точек электропитания при условии малейшего повреждения кабеля хотя бы в одной из них. Максимальная нагрузка для соединенного шлейфовым методом блока составляет 16 А.
  • Комбинированный. Более новый способ подключения нескольких розеток одновременно. Подразумевает прокладку сразу двух кабелей от распределительной коробки. Первый по типу шлейфа питает три из четырех розеток. Второй предназначается 4 точке питания и может обслуживать более мощное оборудование (кухонную плиту). Основной плюс такого соединения в том, что остальные розетки блока застрахованы от выхода из строя при проблемах с «сильной» техникой и точках питания под неё. Из минусов мастера выделяют трудоемкость процесса и удвоенный расход электрокабеля.

Оба вида подключения можно прокладывать закрытым (в штробах) и открытым (в РЕ каналах) способом. Последний вариант дополнительно защищают от механического воздействия кабель-каналами или плинтусом с внутренними пазами.

Подготовка к монтажу

Подготовка инструментов к монтажу розеток

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

  • панель с нужным количеством точек питания;
  • планку декоративную;
  • кабель проводки нужным метражом — замеряется от распределительной коробки по всем вертикальным и горизонтальным штробам до точки расположения конструкции;
  • провод для перемычек;
  • алебастр или гипс (можно шпаклевку).

Из инструментов нужно подготовить:

  • строительный уровень или линейку;
  • карандаш;
  • перфоратор с коронкой по бетону и гипсокартону диаметром 70 мм;
  • зубило, молоток;
  • электромонтажные инструменты;
  • шпатель;
  • тару для замешивания шпаклевки (гипса, алебастра).

Шумные работы желательно выполнять в будний день с 10:00 до 17:00, когда основная масса соседей находится вне дома.

Монтаж блока розеток своими руками

Все действия по установке группы точек электропитания выполняются в строгой последовательности.

Разметка стен

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

Штробление

Штробление стен под розетки

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

Принцип формирования штробы выглядит так:

  • По линии разметки болгаркой делается рез с двух сторон. Если мастер работает перфоратором, с шагам 1,5-2 сантиметра вдоль линии делаются отверстия.
  • При помощи молотка и зубила лишний бетон выбивается из стены, формируя каналы под укладку проводки.
  • Технические выемки под установку подрозетников делают перфоратором с коронкой. Здесь также нарезают бетон, а затем выбивают лишнее зубилом и молотком. При необходимости выбирают глубину выемки. Периодически вставляют подрозетник в бетон, проверяя, насколько его края выступают над плоскостью стены. Нормой считается некоторое углубление элементов внутрь. Позднее лишнее свободное пространство заполнится строительной смесью.

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

Монтаж подрозетников

Вмонтированные подрозетники должны идти в уровень со стеной

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

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

Раствор схватывается примерно за 2-4 часа. Для верности можно дать ему сутки на высыхание.

Особенности установки розеточных блоков в гипсокартоне

Установка розеток в гипсокартон требует аккуратности

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

На момент формирования гнезда под стаканы желательно не давить сильно на стену, чтобы не сломать её. Гипсокартон — материал относительно хрупкий.

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

Подключение электрики

Перед началом электромонтажных работ – проверьте напряжение на проводах в подрозетнике с помощью индикатора

После высыхания раствора приступают к подключению кабеля к розеткам. При шлейфовом способе действуют так:

    1. Смонтированный от распределительной коробки кабель заводят в первый подрозетник. Его оплетку нужно предварительно зачистить ножом или бокорезом на 10-15 см, чтобы освободить внутренние провода. Желательно оставить небольшой запас для возможного проведения ремонтных работ в будущем.
    2. Используют подготовленные заранее разноцветные провода-перемычки. Их сечение должно быть таким же, как и у питающего кабеля. Не нужно делать перемычки очень длинными. Они будут мешать блоку плотно «сесть» в гнезда. На перемычках нужно снять оплётку на 1 см.
    3. Продевают все провода сквозь технические разъемы-отверстия в подрозетниках.
    4. С наборного блока убирают верхнюю защитную крышку и откручивают зажимные винтики на 5-6 мм. Первый проводник подводят к 1 розетке, учитывая положение клемм. Уже от нее при помощи контактов проводник РЕ и все нулевые кабели отводят в остальные розетки.
    5. Все гнезда с устроенной проводкой аккуратно притягивают фиксирующими винтами без усилия. Мастер должен помнить, что соединения линии электропитания должны оставаться неразборными.
    6. Все оголенные участки проводов обматывают изоляционной лентой.
    7. Остаётся вставить подрозетник с подведенными жилами в стаканы и зафиксировать с применением боковых зажимов.
    8. Уровнем контролируют ровность размещения блока.
  1. В последнюю очередь монтируют верхнюю часть комплекта.

На момент шлейфового подключения важно отслеживать полярность контактов. От нулевой клеммы отводят такой же кабель. От фазного проводника — фазный.

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

блоков сокетов Java при подключении к серверу

Когда я пытаюсь подключиться к любому веб-сайту, например google.com или w3schools.com, моя программа зависает при вызове socket () для номеров портов, кроме 80. Поскольку эти веб-сайты не обслуживают порты 81-90, они должны вызывать исключение, а вместо этого блокируется.

Это почти наверняка не дело Java.

Когда вы вызываете конструктор Socket (String, int) , JVM просит ОС попытаться установить соединение с IP-адресом, соответствующим указанному имени, используя предоставленный номер порта.Предполагая, что мы говорим о TCP / IP, ОС отправляет сообщение TCP SYN и ждет ответа:

  • Если ответом является «SYN-ACK», он устанавливает соединение в соответствии с протоколом; см. http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment.

  • Если ответом является «RST» (сброс), соединение не выполняется, и это приводит к исключению Java «соединение отклонено». (Обычно это происходит, если «SYN» попадает на удаленный сервер только для того, чтобы обнаружить, что нет приложения, «прослушивающего» порт, к которому вы пытались подключиться.)

  • Если ответ представляет собой какое-либо сообщение ICMP (например, пункт назначения ICMP недоступен), это обычно приводит к немедленному отказу запроса на соединение и исключению Java.

  • Если ответа нет, ОС пытается снова, снова и снова. В зависимости от тайм-аута соединения по умолчанию Java (или явного тайм-аута) этот процесс может продолжаться долгое время.

Так что, скорее всего, происходит то, что что-то фильтрует сообщения «SYN» на фанк-портах и ​​просто выбрасывает их.Это может быть локальный брандмауэр на вашем ПК, брандмауэр на вашем шлюзе или сеть вашего интернет-провайдера, или программное обеспечение в удаленной системе, с которой вы пытаетесь связаться. Или это могло произойти с возвращающимся сообщением «SYN-ACK».

В любом случае поведение блокировки / тайм-аута присуще сети TCP / IP, и невозможно точно диагностировать ни на уровне ОС, ни на уровне Java. Вам просто нужно скорректировать свои ожидания. (Или установите более короткий тайм-аут подключения …)

Блокировка vs.розетки без блокировки

До сих пор в этой главе вы видели, что select () может быть
используется для определения доступности данных для чтения из сокета.
Однако бывают случаи, когда полезно иметь возможность позвонить
send (), recv (), connect (), accept () и т. д. без необходимости
жду результата.

Например, предположим, что вы пишете веб-браузер.
Вы пытаетесь подключиться к веб-серверу, но сервер не работает.
отвечая. Когда пользователь нажимает (или щелкает) кнопку остановки,
вы хотите, чтобы API connect () прекратил попытки подключения.

С тем, что вы уже узнали, этого сделать невозможно. Когда
вы вызываете connect (), ваша программа не восстанавливает
контролировать до тех пор, пока не будет установлено соединение, или пока не появится ошибка
имеет место.

Решение этой проблемы называется «неблокирующее».
розетки ».

По умолчанию сокеты TCP находятся в «блокирующем» режиме. Для
Например, когда вы вызываете recv () для чтения из потока, управление
не возвращается в вашу программу до тех пор, пока не будет выполнен хотя бы один байт
данные считываются с удаленного сайта.Этот процесс ожидания
появление данных называется «блокировкой». То же самое
верно для API write (), API connect () и т. д. Когда вы
запустить их, соединение «блокируется» до тех пор, пока операция не будет
полный.

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

Если вы вызовете «recv ()» в неблокирующем режиме, он вернет
любые данные, которые система имеет в буфере чтения для этого
разъем. Но он не будет ждать этих данных. Если буфер чтения
пусто, система немедленно вернется из recv ()
говоря: « Операция будет
Блок! «».

То же самое и с API send (). Когда вы вызываете send (),
он помещает данные в буфер, и когда они читаются
удаленный сайт, он удаляется из буфера.Если буфер когда-либо
получает значение «заполнено», система вернет ошибку «Операция.
Будет заблокирован «при следующей попытке записи на него.

Неблокирующие сокеты имеют аналогичный эффект на accept ()
API. Когда вы вызываете accept (), а клиента еще нет
подключившись к вам, он вернет «Операция будет заблокирована», чтобы
сказать вам, что он не может завершить accept () без
ожидание …

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

Возвращаясь к примеру «веб-браузер», если вы поместите
сокет, который подключался к веб-серверу, в
неблокирующий режим, вы можете затем вызвать connect (), распечатать
сообщение о подключении к хосту www.floofy.com…» потом
может сделать что-то еще, и они вернутся, чтобы подключиться ()
опять таки. Если connect () сработает во второй раз, вы можете напечатать
«Хозяин связался, ожидает ответа …», а затем начать звонить
send () и recv (). Если connect () все еще не завершен, вы
может проверить, нажал ли пользователь кнопку «отменить»,
и если это так, вызовите close (), чтобы прекратить попытки подключения.

Неблокирующие розетки также могут использоваться в сочетании с
API select (). Фактически, если вы достигнете точки, в которой вы
на самом деле ХОЧУ дождаться данных на сокете, который был
ранее помеченный как «неблокирующий», вы можете смоделировать
заблокировать recv (), просто вызвав сначала select (), а затем
recv ().

«Неблокирующий» режим устанавливается изменением одного из
«флаги» сокета. Флаги представляют собой серию битов, каждый из которых
представляющий другую возможность сокета. Итак, чтобы
для включения неблокирующего режима требуется три шага:

  1. Вызов API fcntl () для получения сокета
    текущие настройки флага дескриптора в локальный
    Переменная.

  2. В нашей локальной переменной установите O_NONBLOCK
    (неблокирующий) флаг включен.(осторожно, конечно, не
    вмешиваться в другие флаги)

  3. Вызовите API fcntl (), чтобы установить флаги для
    дескриптор значения в нашей локальной переменной.

Блокирующий и неблокирующий ввод-вывод сокета | Сетевое программирование в Python Tutorial

В клиент-серверных приложениях, когда клиент делает запрос к серверу, сервер обрабатывает запрос и отправляет ответ.Для этого и клиенту, и серверу сначала необходимо установить соединение друг с другом через сокеты (TCP или UDP). В последних нескольких руководствах мы также увидели, как клиент может отправлять данные в форме запроса на сервер, а сервер может работать с ними, а затем отправлять ответ обратно клиенту.


Блокирующее гнездо ввода / вывода

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

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

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


Неблокирующий разъем ввода / вывода

Мы можем позвонить по номеру setblocking (1), , чтобы установить блокировку, или setblocking (0), , чтобы снять блокировку. Давайте разберемся с этим на примере. Прежде всего, давайте рассмотрим Blocking Socket :

block_client.py

  #! Usr / bin / python

импортный сокет

sock = socket.socket ()

host = socket.gethostname ()
sock.connect ((хост, 12345))
sock.setblocking (1)

# Или просто опустите эту строку, так как по умолчанию сокеты TCP
# находятся в режиме блокировки

data = "Hello Python \ n" * 10 * 1024 * 1024 # Огромный объем данных для отправки
отстаивать носок.send (data) # Отправляем данные до истины  

block_server.py

  #! Usr / bin / python

# block_server.py

импортный сокет

s = socket.socket ()

host = socket.gethostname ()
порт = 12345

s.bind ((хост, порт))
s.listen (5)

в то время как True:
conn, addr = s.accept () # принимаем соединение

data = conn.recv (1024)
while data: # пока не появятся данные
данные для печати
data = conn.recv (1024)
print "All Data Received" # Будет выполнено, когда будут получены все данные
соед.Закрыть()
перерыв  

Теперь запустите сначала block_server.py , а затем block_client.py . Вы заметите, что сервер продолжает печатать Hello Python . Это будет продолжаться до тех пор, пока не будут отправлены все данные. В приведенном выше коде строка All Data Received не будет печататься в течение длительного времени, потому что клиент должен отправить большое количество строк, что займет время, и до тех пор ввод-вывод сокета будет заблокирован.

Что здесь происходит? Метод send () попытается передать все данные на сервер, в то время как буфер записи будет заполнен.Ядро переведет процесс в спящий режим до тех пор, пока данные из буфера не будут переданы в место назначения и буфер снова не станет пустым. Когда буфер становится пустым, ядро ​​снова пробуждает процесс, чтобы получить следующий фрагмент данных, который должен быть передан. Короче говоря, ваш код будет заблокирован, и ничего больше не будет продолжаться.

Теперь рассмотрим неблокирующую розетку

  #! Usr / bin / python

# non_blocking_client.py

импортный сокет

sock = socket.socket ()

хост = сокет.gethostname ()
sock.connect ((хост, 12345))
sock.setblocking (0) # Теперь установка в неблокирующий режим

data = "Hello Python \ n" * 10 * 1024 * 1024 # Огромный объем данных для отправки
assert sock.send (data) # Отправляем данные до истины  

Теперь, если мы запустим non_blocking_client.py , вы заметите, что программа будет работать в течение короткого времени, она напечатает последнюю строку «Все полученные данные» и вскоре завершится.

Что здесь происходит? Здесь клиент отправил не все данные.Когда мы делаем сокет неблокирующим, вызывая setblocking (0) , он никогда не будет ждать завершения операции. Поэтому, когда мы вызываем метод send () , он помещает в буфер как можно больше данных и возвращается.



Д. Дж. Бернштейн

TCP / IP

Ситуация: вы настраиваете неблокирующий сокет и выполняете connect (), который
возвращает -1 / EINPROGRESS или -1 / EWOULDBLOCK. Вы выбираете () сокет для
возможность записи. Это возвращается, как только соединение успешно или не удается.(Исключение: в некоторых старых версиях Ultrix select () не заметит
сбой до 75-секундного тайм-аута.)

Вопрос: что вы делаете после того, как select () вернет возможность записи? Сделал ли
соединение не удалось? Если да, то как это случилось?

Если соединение не удалось, причина кроется в чем-то
называется so_error в сокете. Современные системы позволяют увидеть so_error
с getsockopt (,, SO_ERROR ,,), но это не переносимо — фактически,
getsockopt () может привести к сбою старых систем. Другой способ увидеть so_error
через ошибка проскальзывания : любая попытка чтения или записи данных на
сокет вернет -1 / so_error.

Иногда у вас есть данные для немедленной записи в соединение. Затем
вы можете просто написать () данные. Если connect () не удалось, сбой будет
сообщается функцией write (), обычно с правильным номером ошибки connect (). Этот
это решение, которое я поставлял для IRC в 1990 году. К сожалению, на некоторых
систем, при некоторых обстоятельствах write () заменит EPIPE на
старый errno, поэтому вы теряете информацию.

Другая возможность — это чтение (fd, & ch, 0). Если connect () завершился успешно, вы получите
0, за исключением Solaris, где вы получаете -1 / EAGAIN.Если
connect () не удалось, вы должны получить правильную ошибку из-за проскальзывания ошибки.
Фатальный недостаток: под Linux вы всегда будете получать 0.

Другая возможность — это чтение (fd, & ch, 1), но это приводит к программированию
трудности, так как персонаж действительно мог прибыть. Все
который читает сокет, должен знать о вашем предварительно буферизованном символе.

Другая возможность — recv (,,, MSG_PEEK). К сожалению, recv ()
код для потоковых сокетов исторически был полностью непроверен и
массивный источник ошибок.Я бы держался подальше от этого.

Другая возможность — выбрать () для удобства чтения. Но это неправильно,
потому что connect () мог быть успешным и данные могли быть получены
прежде, чем вы успели сделать select ().

Другая возможность — это getpeername (). Если розетка подключена,
getpeername () вернет 0. Если сокет не подключен,
getpeername () вернет ENOTCONN, а чтение (fd, & ch, 1) выдаст
правильная ошибка из-за проскальзывания ошибки. Это комбинация
предложения от Дугласа К.Шмидт и Кен Киз.

Другая возможность — второй connect (). Кажется, это
строго худшее решение, чем getpeername (): удваивает сетевой трафик
если соединение не удалось (с некоторыми стеками TCP) и не улучшилось
надежность. Кен Киз упоминает, что это работает с SOCKS.

Работа с блокировкой розеток и обходное решение

Процесс — это отдельный экземпляр исполняемой программы, запущенной на компьютере.
Операционная система может запускать несколько экземпляров одной и той же программы,
это означает, что выполняется несколько процессов, по одному для каждого экземпляра программы.Операционная система контролирует запуск каждого процесса и его статус.
Один процесс может создать другой процесс, и существуют механизмы, с помощью которых процессы могут взаимодействовать друг с другом;
это называется межпроцессным взаимодействием (IPC) и довольно хорошо известно в UNIX и менее известно в Windows.
И фактические методы и вызовы функций для создания процессов, управления и IPC выполняются по-разному.
в разных операционных системах.


В UNIX создание процесса чаще всего выполняется путем объединения двух вызовов функций:

  • fork создает новый процесс, который является точной копией, клоном процесса, который его вызвал.Процесс, в котором fork s является родительским процессом, а клон — дочерним процессом,
    и два получают идентификаторы процессов друг друга (PID), которые они будут использовать для связи и управления.
  • exec * заменяет текущий процесс другим процессом.
    Звездочка (*) указывает, что это семейство функций, имена которых имеют разные окончания и различаются тем, как они создают список аргументов для передачи аргументов командной строки новому загружаемому процессу.Вам нужно будет прочитать документацию exec * для получения подробной информации (например, Google на странице руководства exec ).

Это используется следующим образом: сразу после вилки есть оператор if, который разделяет код для запуска дочернего и родительского процессов (поскольку дочерний процесс является идеальным клоном родительского процесса, они оба используют возвращаемое значение fork звонит, чтобы узнать, кто они — родитель или ребенок, как точки под веком клона в The 6th Day Арнольда Шварценеггера).Потомок вызывает exec * , чтобы заменить себя фактической программой, которую родитель хотел запустить.
Но перед тем, как вызвать замену, дочерний элемент обычно выполняет некоторые задачи по настройке связи между родительскими и дочерними элементами, обычно с помощью каналов (см. Ниже).
Кроме того, любой процесс может разветвлять и создавать практически любое количество дочерних процессов.
(есть реальные ограничения, накладываемые мощностью операционной системы, но концептуально ограничений нет).
А дочерние процессы могут разветвлять и создавать свои собственные дочерние процессы.Фактически, все процессы, запущенные в UNIX и Linux, являются дочерними, какими бы поколениями они ни были удалены.
Процесс 1, init — как сообщается, в некоторых версиях Linux init был заменен другим процессом 1, например Upstart .
Чтобы проиллюстрировать, как быстро множество процессов может быть выполнено fork ed, общая проблема при написании ваших первых экспериментов fork ing заключается в том, что дочерние процессы продолжают fork ing, когда они не должны этого делать, создавая таким образом серию процессы, которых вы даже не ожидали.В зависимости от обстоятельств и от того, происходит ли это с вами или с кем-то еще, это может быть очень неприятно или довольно забавно.

UNIX управляет группами процессов , через которые он связывает дочерние процессы с их родительскими.
Когда родительский процесс завершается, операционная система также завершает все свои дочерние процессы.
Следовательно, при написании родительского процесса вам нужно, чтобы он дождался завершения всех его дочерних процессов, прежде чем
оно может прекратиться само.Это поддерживается системными сигналами и функциями, такими как SIGCHLD и wait () и waitpid () .

IPC под UNIX широко поддерживается и широко известен.
Обычный метод для родителя — создать пару каналов, которые потомок присоединяет к своим стандартным входным и выходным файлам (stdin и stdout — если вы программист на C, тогда вы должны знать об этом уже), прежде чем он вызовет запуск * .
Другие методы включают именованные каналы, очереди сообщений, разделяемую память и доменные сокеты UNIX.Эти методы и способы их использования очень хорошо документированы и широко используются программистами UNIX и Linux.
Во многих случаях возможность заниматься таким программированием — это то, что в первую очередь привлекло программиста в Linux.

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


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

Windows (то есть Win32), с другой стороны, не поддерживает fork или что-либо подобное.
Вместо этого у него есть функция CreateProcess , которая напрямую создает новый процесс на основе программы, названной в вызове функции, в основном комбинируя fork и exec * в одном вызове функции.Боюсь, после этого для меня станет довольно туманно.
Я знаю, что процесс может получить дескриптор другого процесса (эквивалент PID в UNIX),
но я не уверен, как и что все это может с этим сделать.

В Windows также нет ничего подобного группам процессов или фактических родительско-дочерних отношений между
процесс и процессы, которые он создает.
Скорее, «родитель» должен установить эту роль.
Сигнала SIGCHLD нет, но есть две функции: WaitForSingleObject и WaitForMultipleObjects , которые используются для ожидания
«дочерние» процессы для завершения, а также для других видов событий.Например, они также используются позже в многопоточности для синхронизации потоков при использовании общих ресурсов.
(намек на грядущие кошмары).

Я также не очень хорошо понимаю IPC под Windows.
Я видел упоминания об анонимных каналах, именованных каналах и почтовых ящиках, но не играл с ними.

По сравнению с UNIX эта область не так широко известна.
Я видел всего несколько книг по этой теме.

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


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

В то же время разные процессы работают асинхронно, то есть они выполняются независимо от других процессов, так что ни один процесс не может знать, где находится другой процесс в своем исполнении; т.е. он не может знать, что именно другой процесс делает в данный момент.
Когда два процесса пытаются получить доступ к одному и тому же ресурсу, например к разделяемой памяти (механизм IPC в UNIX), им необходимо координировать свои действия.Это называется синхронизацией , и это становится действительно важным, когда мы переходим к многопоточности.

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


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

Другим решением была разработка потоков, первоначально известных как «легковесные процессы», при этом традиционные процессы считались «тяжелыми» из-за того, что им требуется поддержка ОС.
Они вроде как подпроцессы; процессы внутри процесса.
Они легкие, потому что меньше участвуют в их создании и запуске, плюс все потоки внутри процесса совместно используют память этого процесса, что снижает потребность системы в ресурсах.

Хорошо, а почему «темы»?
Что ж, все мы знаем, что компьютеры выполняют программы по одной инструкции за раз, нанизывая одну за другой, как будто в потоке.Назовем это «потоком выполнения».
Идея многопоточности состоит в том, чтобы позволить процессу иметь нескольких потоков выполнения .
Это почти похоже на многозадачность , за исключением того факта, что все эти несколько потоков выполняют в один и тот же процесс .
Это означает, что пространство памяти, принадлежащее процессу , доступно для всех потоков в этом процессе .
Внезапно жизнь стала намного проще и намного сложнее, и все сразу.Гораздо проще обмениваться данными и ресурсами, но гораздо сложнее не дать этим потокам наступить друг другу на пятки и повредить эти общие ресурсы.
Более свободный доступ требует более строгой дисциплины со стороны программиста.
Помните, я сказал, что это требует навыков и опыта программиста?
Вы должны знать, что делаете: большая свобода влечет за собой большую ответственность.

Из того, что я читал, потоки начинались в UNIX как «легковесные процессы».В POSIX UNIX это превратилось в библиотеку под названием «pthreads», которая обычно используется в UNIX и Linux.
Он даже был перенесен на 32-битную Windows (Win32) в пакете под названием
«pthreads-win32».

В Windows другая история. MS-DOS определенно была однопоточной операционной системой.
16-битные версии Windows с 1.0 по 3.11 (также известные как «Win16») просто работали поверх MS-DOS.
Win16 работает по принципу
кооперативная многозадачность, что означало, что вы могли переключаться между задачами Windows только в том случае, если
текущая задача уступила контроль другой задаче, а это означало, что программисты должны быть дисциплинированы
в том, как они писали свои приложения, чтобы никакая часть их приложения не работала слишком долго и блокировала все другие приложения, включая Windows.Win16 не поддерживает многопоточность.

Одной из главных особенностей OS / 2, которую Microsoft разработала для IBM примерно в 1987 году, было то, что она поддерживала
вытесняющая многозадачность.
Насколько я понимаю, Windows NT также поддерживала его.
UNIX всегда использовал его.
В режиме вытесняющей многозадачности всем процессам дается интервал времени , очень короткий отрезок времени для выполнения,
и все процессы запускаются по очереди, и их временной интервал истекает, ОС прерывает процесс и передает управление следующему процессу, и так далее, так что у каждого процесса есть шанс запуститься.Так продолжалось до тех пор, пока Windows не перешла на 32-разрядную версию с Windows 95, что сделало эту и последующие версии известными как «Win32»,
что основные продукты Windows могут работать на
вытесняющая многозадачность.
Это также позволило Win32 dows (Win32, начиная с Windows 95) наконец-то поддерживать многопоточность.


Как и следовало ожидать, Windows и UNIX по-разному выполняют многопоточность.
Однако, несмотря на внешние различия, концепции одинаковы, и они выполняют много одинаковых функций.Кроме того, существуют те же неотъемлемые проблемы, которые решаются очень похожими способами.

И в Windows, и в UNIX вы пишете сам поток как функцию, формат заголовка функции которой предопределен.
Вы запускаете поток, передавая его имя (которое в C является его адресом) системной функции: pthread_create в UNIX и CreateThread в Windows.
В Windows вы также можете использовать beginthreadex ; на самом деле, это рекомендуется
Джонсон М.Харт в книге Win32 System Programming (2-е изд., Addison-Wesley, 2001, стр. 214), где он советует:

Не используйте CreateThread; вместо этого используйте специальную функцию C, _beginthreadex, чтобы запустить поток и создать специфичное для потока рабочее хранилище для LIBCMT.LIB. Используйте _endthreadex вместо ExitThread для завершения потока.

Примечание: Существует функция _beginthread, предназначенная для упрощения использования, , но ее следует избегать.

И в Windows, и в UNIX функция потока принимает единственный аргумент — указатель void .
Функция создания потока передает указатель на данные, передаваемые потоку.
Поток получает этот указатель данных как единственный аргумент.
Изящный трюк, который вы можете использовать с этим указателем, — это определить структуру, которую вы заполняете всеми различными типами данных, а затем передавать все эти данные в поток через один указатель.И, конечно же, поскольку вы написали поток, поток знает объявление структуры и, следовательно, знает, как получить доступ ко всем этим данным.

Закрытие потока — самая простая часть: просто дойдите до конца функции потока.
Кроме того, существует ряд функций для управления потоками и получения их статуса.


Хорошо, теперь пришла проблема.

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

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

  1. Рассмотрим ситуацию, когда одному потоку требуется значение, предоставленное другим потоком.Второй поток сохраняет результат своих вычислений в глобальной переменной, которую считывает первый поток.
    Итак, как первый поток узнает, действительно ли значение в этой глобальной переменной?
    Первый поток не знает, когда второй поток завершил свою задачу.
  2. Эта проблема также основана на том факте, что поток может быть прерван в любой момент.
    На любое время .
    Вот сценарий, иллюстрирующий проблему.
    Один поток читает из глобальной переменной, чтобы использовать значение, записанное в него другим потоком.Допустим, это int.
    В 32-битных системах длина int составляет четыре байта; в 16-битных системах они состоят из двух байтов, но кто из них больше запускает?
    Но в любом случае это может произойти: в середине обновления многобайтового значения поток прерывается, и другой поток считывает это значение.
    Другой поток прочитал фиктивное значение.

Помните, несмотря на всю эту многозадачность и многопоточность, пока все это работает на одном аппаратном процессоре, компьютер может выполнять только одну инструкцию за раз.Два разных потока не работают одновременно. Они не могут работать в системе только с одним аппаратным процессором.
Вместо этого каждому потоку дается ограниченное количество времени для выполнения, после чего он прерывается прямо в середине того, что он делает, чтобы управление передалось другому потоку,
вытесняющая многозадачность.
Это даже так на двух- или четырехъядерном компьютере с 2 или 4 процессорами.
Ваше программное обеспечение должно быть либо специально написано, либо достаточно умным, чтобы использовать дополнительные процессоры,
и большинство программ — ни то, ни другое.ОС должна быть достаточно умной для этого, но вытеснение по-прежнему будет использоваться при выполнении большей части вашего кода.

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

Вот тут-то и вступает в игру синхронизация .


Эти проблемы называются «условиями гонки», потому что разные потоки конкурируют друг с другом за использование одних и тех же ресурсов, эффективно «гоняя» друг друга.
Мы не хотим, чтобы они соревновались друг с другом; мы хотим, чтобы они синхронизировались друг с другом.
Может быть, не синхронизировать все по времени, но хотя бы в критические моменты. В критических секциях .

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

  • Контроль резьбы.
    Данный поток может быть приостановлен (т. Е. Не запущен) до тех пор, пока не возникнут условия для его возобновления.
    Например, в нашей первой задаче поток должен ждать, пока второй поток не выполнит вычисление, поэтому первый поток будет приостановлен, а затем возобновится, когда второй поток завершит свою задачу.В pthreads это делается с помощью функции pthread_join .
  • Семафор можно использовать для подсчета количества потоков, использующих конкретный ресурс — обычно это число всего один.
    Только когда это число меньше заданного значения, новому потоку будет разрешен доступ к нему.
    И UNIX, и Windows поддерживают семафоры.

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

  • Чаще всего требуется, чтобы поток имел взаимоисключающий доступ к ресурсу, блокируя все остальные потоки до тех пор, пока это не будет выполнено.
    Это делается с помощью мьютекса (очевидно, это сокращение от «взаимоисключающие»).
    И UNIX, и Windows поддерживают мьютексы, хотя и по-разному.Кроме того, в Windows мьютекс может применяться к нескольким процессам, тогда как CRITICAL_SECTION применяет только в пределах одного процесса.

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

Оба мьютекса и CRITICAL_SECTION имеют одни и те же проблемы:

  1. Они основаны на системе чести.
    Мьютекс или семафор блокирует доступ потока , только если поток проходит через мьютекс / семафор ;
    если поток полностью обходит мьютекс / семафор, то его ничто не может остановить.Следовательно, у программиста должна быть дисциплина для написания всего кода, который обращается к общему ресурсу, чтобы он выполнял необходимые вызовы мьютексов / семафоров.
    Любой код, нарушающий эту дисциплину, сводит на нет цель синхронизации.
  2. Программист должен написать код критической секции, чтобы избежать
    тупик (еще одно предупреждение по ключевому слову!).
    Это условие, при котором два потока или процесса заблокировали ресурсы, которые нужны друг другу и которые должны ждать.Поскольку ни один поток не может освободить свои ресурсы, пока другой не освободит их, они застряли там, и это приложение теперь мертвое в воде.

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


Применение многопоточности к сетевым приложениям:

Хорошо, теперь мы можем спросить, как применить многозадачность или многопоточность к сетевым приложениям.Давайте начнем с обзора, почему мы начали этот долгий путь.
В программе с одним потоком выполнения (нормальная ситуация) блокирующий сокет приводит к внезапной остановке всей программы до тех пор, пока она не получит данные для чтения.
Нам нужно, чтобы программа могла продолжать работу, ожидая прибытия этих данных.
Нам нужно иметь возможность реагировать на ввод пользователя с клавиатуры, получать данные из других сокетов и делать все, что еще необходимо (например, обновлять отображение времени на мониторе).Это особенно необходимо для сервера, который может одновременно обрабатывать несколько клиентов, а также проверять наличие новых клиентов, пытающихся подключиться.
Блокировка любого отдельного сокета для такого сервера была бы катастрофой.

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

Многопоточный сервер:

Среди моих образцов серверов я разработал версию своего многоклиентского tcp-сервера, echomtd , который использует многопоточность под Windows. Я опишу это в следующем обсуждении, чтобы проиллюстрировать общие идеи дизайна:

  1. Когда программа запускается, она выполняет основной поток.
    Насколько я понимаю, это поток, который должен запускать ваш пользовательский интерфейс и выполнять пользовательский ввод-вывод.Насколько я понимаю, именно здесь должен выполняться цикл Windows WinMain.
    Затем этот основной поток создает «рабочие потоки», которые выполняют работу, не связанную с пользовательским интерфейсом.
    По сути, просто напишите пользовательский интерфейс, как обычно.

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

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

    Две возможные альтернативы:

    1. Пусть AcceptThread создаст свой собственный поток прослушивания и, возможно, также выполнит всю настройку и инициализацию Winsock.
    2. Для крупного проекта попросите основной поток создать ManagerThread, который будет создавать и управлять иерархией потоков, которая формирует всю внутреннюю часть приложения, оставляя основному потоку ничего не делать, кроме запуска пользовательского интерфейса и связи с ManagerThread.Затем пользователь может ввести команду, и основной поток отправит команду в ManagerThread, который выполнит ее и отправит результаты обратно в основной поток для отображения пользователю.

      Имейте в виду, что идея ManagerThread амбициозна, но имеет смысл для большого и крупного проекта.
      Большая часть его сложности может быть делегирована рабочим потокам, работающим под ним; например, ThreadManager и ApplicationManager.

  2. В простых проектах этот первый поток, созданный основным потоком, будет просто AcceptThread, который будет блокировать вызов accept , а затем, получив входящее соединение, будет создавать новый поток для обработки новый клиент.

    Это подход, который я использовал в echomtd . Когда AcceptThread принимает новое соединение, он добавляет новый клиентский сокет в список клиентов, а затем запускает новый ClientThread и передает ему новый клиентский сокет.
    Затем он возвращается к блоку на , принимает .

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

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

  4. Когда серверу дана команда на выключение, ему необходимо будет выполнить следующие операции (хотя точные данные могут сильно отличаться):
    1. Сообщите AcceptThread, что он прекратил принимать новых клиентов, после чего он закроет свой прослушивающий сокет.
    2. Сообщите каждому ClientThread о завершении сеанса, после чего он завершит свое соединение, закроет свой сокет, а затем, наконец, закроется.
    3. Когда все ClientThreads закрыты, AcceptThread сообщит об этом факте основному потоку, а затем закроется.
    4. Наконец, основной поток может выйти, завершив работу приложения.

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

    Единственное решение, которое приходит мне в голову в данный момент, — это комбинировать техники; например, сделать сокеты потоков неблокирующими — вариант select может быть вариантом, но поскольку мы имеем дело только с одним сокетом на поток, select будет немного излишним, но все равно будет вариантом, если поток имеет дело с более чем одним сокетом.
    Таким образом, потоки смогут периодически вытаскивать свои головы из своих сокетов и проверять входящую команду (например, через глобальную переменную, охраняемую CRITICAL_SECTION ), на которую им нужно будет действовать.Это также не обязательно противоречит цели многопоточности, поскольку многопоточность может принести пользу иным образом; все зависит от ваших потребностей и от вашего дизайна.

Многопоточный клиент:

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

Давайте рассмотрим, как мы можем использовать многопоточность при разработке игрового клиента.
В качестве примера предположим, что каждый игрок будет запускать свою собственную копию клиента и подключаться к серверу через TCP. Помимо прочего, сервер будет поддерживать состояние игры, включая состояние всех игроков и их местоположения в игровом пространстве.
Игроки также могут напрямую общаться с другими игроками, индивидуально, для небольшой группы или транслируя для всех, через дейтаграммы UDP,
хотя некоторые формы взаимодействия между игроками, влияющие на состояние игры, должны быть либо маршрутизированы через сервер, либо сообщены серверу постфактум.Кроме того, клиент может использовать дейтаграммы UDP для периодической передачи определенной информации серверу, такой как «контрольное сообщение», которое указывает, что клиент все еще работает и подключен;
TCP — это надежный протокол, который, как предполагается, может поддерживать соединение, несмотря на кратковременные отключения, что означает, что может быть трудно определить, когда соединение фактически потеряно (например, сетевой кабель клиентского компьютера отключен, клиент внезапно выходит из строя) .
Другой вариант — позаимствовать идею у FTP и установить два TCP-соединения с сервером, одно для команд, а другое для передачи данных.Дело в том, что у клиента может быть несколько сокетов для управления.

У клиента также будет много разных задач для выполнения; например (ни в коем случае не исчерпывающе):

  1. Пользовательский интерфейс для приема и обработки команд и отображения ответов.
  2. Обновление знаний клиента о состоянии игры и игровом пространстве.
  3. Обновление графического дисплея в реальном времени, чтобы отразить обновление знаний клиента о состоянии игры и пространстве.
  4. Связь с сервером.
  5. Связь с другими игроками.

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


Проекты многопоточного / многопроцессорного сервера

Повторяя работу моего простого многопоточного сервера echomtd в качестве типичного примера:

  1. Основной поток инициализирует сервер, а затем создает и запускает AcceptThread.
  2. AcceptThread обрабатывает поток прослушивания.
    Когда клиент подключается, он принимает соединение, создает новый клиентский сокет для этого клиента и создает новый ClientThread для обслуживания этого клиента через его клиентский сокет.Для каждого клиента будет по одному ClientThread.
  3. ClientThread ожидает, пока клиент отправит ему запрос, который он обслуживает (в эхо-службе это означает, что он отображает строку запроса обратно клиенту), а затем возвращается к ожиданию запроса от клиента.
    Когда клиент закрывает соединение, ClientThread выполняет свою часть выключения, закрывает сокет и завершает работу.

Простой многопроцессорный сервер будет работать аналогичным образом, только вместо того, чтобы создавать поток для каждого клиента, он будет создавать процесс, который будет использовать некоторую технику межпроцессного взаимодействия (IPC) для связи со своим родителем и с другими процессами на сервере.Опять же, это, скорее всего, будет сделано в UNIX / Linux, поэтому, скорее всего, будут использоваться форк , / exec * и каналы.

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

Некоторые из этих подходов к проектированию рассматриваются в книге Линкольна Штайна Сетевое программирование с помощью Perl (Addison-Wesley, 2001).
Следующие ниже обсуждения основаны главным образом на его примерах из этого источника.


Предварительная развилка и предварительная нарезка

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

В презентации Штейна сначала рассматривается простая предварительная обработка и предварительная обработка потоков на примере веб-сервера, а затем обсуждаются их проблемы и предлагается улучшенный «адаптивный» метод.Его подход включал в себя много анализа, который вы можете прочитать в его книге; Я просто сделаю короткую презентацию, чтобы вы получили общее представление.
Кроме того, общие подходы, проблемы и решения для разветвления и потоковой передачи очень похожи; В основном различаются только конкретные техники:

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

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

  • Простая предварительная развилка:
  • Штейн повторяет несколько версий этого.
    Основная идея состоит в том, что при запуске сервер порождает заранее определенное количество дочерних процессов.На этот раз каждый дочерний процесс включает accept , так что дочерний процесс запускает бесконечный цикл.
    который блокируется на , принимает до тех пор, пока к нему не подключится клиент, не обслужит этого клиента, не закроет клиентский сокет и
    возвращается к блокировке на , принимает до тех пор, пока не подключится следующий клиент.
    Это устраняет системные накладные расходы на порождение дочерних процессов при попытке обслуживания клиентов.
    И это устраняет системные накладные расходы на уничтожение дочерних процессов, потому что они никогда не уничтожаются, а, скорее, повторно используются.

    В своей первой итерации Штейн завершил родительский процесс после того, как он создал все дочерние процессы; в конце концов, ему больше нечего было делать, передав все дочерним процессам.
    Однако возникли проблемы:

    1. Если началось больше подключений, чем имеется предварительно созданных дочерних процессов, они не могут быть обработаны, что замедляет ответ сервера.
      Но есть также затраты на производительность и ресурсы для системы для каждого запущенного процесса, поэтому существует практическое ограничение на произвольно большое количество процессов, которые мы могли бы предварительно выполнить.
    2. Если дочерний процесс аварийно завершает работу или завершается, заменить его невозможно.
    3. Нет простого способа завершить работу сервера: нужно было бы обнаруживать PID каждого дочернего элемента, и каждый отдельный дочерний элемент должен был бы быть явно завершен.
    4. Со всеми этими дочерними элементами, блокирующими на , принимают на том же прослушивающем сокете, когда новый клиент пытается подключиться, тогда все из этих дочерних элементов будут конкурировать за это соединение одновременно, нагружая систему
      поскольку несколько процессов просыпаются одновременно и соревнуются за один и тот же ресурс.Штейн называет это явление «грохочущим стадом».
    5. Некоторые операционные системы не позволяют нескольким процессам одновременно вызывать accept на одном сокете.

    Штейн решает эти проблемы (кроме первой) на своей второй итерации:

    1. Установив обработчики сигналов и сохранив родительский процесс, он может реагировать на убийство дочернего процесса, порождая его замену.
      Он также может завершить работу сервера, сигнализируя всем дочерним элементам о завершении работы, обнаруживая, когда все они завершены, и затем завершает работу.
    2. Посредством «сериализации accept call» он решает как «грохочущее стадо», так и множественные accept s проблемы.
      Настройте механизм синхронизации с низкими системными накладными расходами, такой как файловая блокировка открытого файла, и потомку, который может получить доступ, будет разрешено позвонить по номеру , принять .
      Как только этот ребенок принимает соединение, он снимает блокировку файла, позволяя другому свободному ребенку позвонить по номеру , принять и так далее.

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

  • Адаптивная предварительная развилка:
  • Вот где он становится амбициозным и больше похож на реальный сервер.
    Мы хотим иметь достаточно детей, чтобы обслуживать всех клиентов, подключенных в настоящее время, плюс еще несколько, чтобы немедленно обрабатывать приходящие новые клиенты, но в то же время мы не хотим, чтобы слишком много детей сидели без дела, тратя впустую системные ресурсы.
    Это можно проиллюстрировать множеством сценариев спроса и предложения, но одна аналогия — подход «точно в срок» к системе заводских запасов.Вы хотите иметь под рукой достаточно деталей, чтобы сборочная линия работала бесперебойно, но каждая лишняя неиспользованная деталь в инвентаре — это потраченный впустую капитал.
    Вы хотите минимизировать затраты на содержание своего инвентаря, одновременно увеличивая его способность обеспечивать производство кормов.
    Как это сделать — отдельная область изучения.
    Чтобы действительно упростить это, вы работаете со многими факторами — например, сколько времени требуется, чтобы получить деталь с момента заказа (время выполнения),
    сколько деталей используется за определенный период времени (норма расхода) — и получаем две важные цифры:
    «высокий уровень» и «низкий уровень» (также термины, которые использует Штейн).Если количество деталей в инвентаре упадет до «нижней отметки», вы рискуете исчерпать запасы (что полностью остановит производство), поэтому пора увеличить количество обычно заказываемых деталей.
    Но если она вырастет до «максимальной отметки», то вы рискуете получить слишком много деталей на складе, в результате чего вам нужно будет уменьшить количество заказываемых деталей.
    Как упоминалось ранее, многие системы спроса и предложения имеют высокие и низкие отметки воды, чтобы поддерживать систему в оптимальном рабочем диапазоне.

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

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

    Существует несколько возможных методов IPC, которые может использовать сервер адаптивной предварительной форковки.Штейн исследует два, трубы и общую память.

    Многие подходы и проблемы, описанные в предыдущих схемах разветвления и префоркинга, также применимы в целом к ​​многопоточности.

  • Простая многопоточность:
  • Как и в случае с простым сервером «accept-and-fork», основной поток простого потокового сервера тратит большую часть своего времени на блокировку на accept .
    Когда приходит новое соединение, он создает рабочий поток для обслуживания этого клиента и возвращается к блокировке на accept .Новый поток существует достаточно долго, чтобы обслуживать клиента, а затем завершается, когда клиент отключается.

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

  • Простая предварительная резьба:
  • Как и в случае с простым сервером предварительной форковки, при запуске основной поток создает слушающий сокет, а затем создает все потоки, передавая слушающий сокет каждому потоку.
    Затем каждый поток будет блокироваться на accept , обслуживать клиента, который к нему подключается, а затем после завершения этого сеанса очищаться и возвращаться к блокировке на accept , ожидая следующего клиента.Тем временем основной поток простаивает, ничего не делая, но он не может выйти, как в первом простом примере предварительной форкинга, потому что при многопоточности все потоки закрываются.

    Существуют те же проблемы «гремящего стада» и нескольких accept s, что и при простом предварительном форкинге, и они решаются таким же образом.

    Подход, который я придумал, отличается от подхода Штейна тем, что я предварительно заправлял рабочие потоки ClientThread, а затем имел отдельный AcceptThread, который передавал бы новый клиентский сокет незанятому потоку.Мой многопоточный сервер ожидает этого подхода с предварительной потоковой передачей, хотя на самом деле не реализует ее.
    Мой подход потребовал бы взаимодействия с потоками для отслеживания их статуса, что предвещает следующий подход — адаптивное предварительное выполнение потоков.

  • Адаптивная предварительная резьба:
  • Опять же, этот метод отражает метод адаптивной предварительной форковки, за исключением того, что фактическая реализация специфична для потоковой передачи.

  • Pthreads Пулы потоков:
  • Другой источник, Pthreads Programming от Nichols, Buttlar & Farrell (O’Reilly, 1998, «книга тутового шелкопряда»),
    включает несколько примеров приложений, в том числе сервер банкомата.
    При разработке дизайна сервера банкомата они обсуждают пулов потоков (страницы с 98 по 107).
    Это пример предварительной нитки, который они подробно изучают с помощью кода C (в отличие от списков Perl Штейна).

    Эта схема предварительно распределяет заранее определенное количество рабочих потоков, чьи информационные структуры хранятся в массиве (динамически создаваемом при запуске).
    Работа, которая должна быть выполнена, поступает в очередь запросов и принимается одним из незанятых потоков.
    Когда задача завершена, поток возвращается в состояние ожидания.
    Когда очередь запросов пуста, все рабочие потоки будут простаивать.
    Когда все потоки заняты, новые запросы не могут быть обработаны, и система будет уведомлена в зависимости от того, какие операционные параметры были выбраны.

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

    Это всего лишь несколько возможностей.
    Как вы спроектируете свой сервер, полностью зависит от вас.

    Socket Connection — обзор

    Луковая маршрутизация и TOR

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

    Луковая маршрутизация работает на уровне приложений, заменяя сокетные соединения анонимными соединениями и не требуя каких-либо изменений в Интернет-сервисах или приложениях, поддерживающих прокси. Первоначально он был реализован в Sun Solaris 2.4 в 1997 году, включая прокси для просмотра веб-страниц (HTTP), удаленного входа в систему (rlogin), электронной почты (SMTP) и передачи файлов (FTP), и теперь работает в большинстве распространенных операционных систем.Он состоит из фиксированной инфраструктуры луковых маршрутизаторов, где каждый маршрутизатор имеет длительное соединение сокета с набором соседних. Только несколько маршрутизаторов, называемых onion router proxy , знают всю топологию инфраструктуры. При луковой маршрутизации, вместо того, чтобы устанавливать сокетные соединения непосредственно с отвечающей машиной, инициирующие приложения устанавливают сокетное соединение с луковым прокси-сервером маршрутизации, который создает анонимное соединение через несколько других луковых маршрутизаторов к месту назначения. Таким образом, луковая сеть маршрутизации позволяет соединению между инициатором и ответчиком оставаться анонимным.Хотя протокол называется луковой маршрутизацией, маршрутизация, которая происходит во время анонимного соединения, осуществляется на прикладном уровне стека протоколов, а не на уровне IP. Однако базовая IP-сеть определяет маршрут, по которому данные фактически проходят между отдельными луковичными маршрутизаторами. Учитывая инфраструктуру лукового маршрутизатора, протокол луковой маршрутизации работает в три этапа:

    Анонимное соединение настройка

    Связь через анонимное соединение

    72

    уничтожение

    На первом этапе приложение-инициатор, вместо прямого соединения с целевой машиной, открывает соединение сокета с прокси-сервером луковой маршрутизации (который может находиться на той же машине, на удаленной машине или в машина с брандмауэром).Прокси-сервер сначала устанавливает путь к месту назначения в инфраструктуре лукового маршрутизатора, затем отправляет луковицу первому маршрутизатору пути. Луковица — это многоуровневая структура данных, в которой каждый уровень лука (зашифрованный с открытым ключом) предназначен для определенного лукового маршрутизатора и содержит (1) идентификатор следующего лукового маршрутизатора на пути, по которому будет следовать анонимное соединение; (2) срок годности лука; и (3) начальное число ключа, которое будет использоваться для генерации ключей для кодирования данных, отправляемых через анонимное соединение в обоих направлениях.Луковица отправляется по пути, установленному прокси: луковый маршрутизатор, который получает лук, снимает свой слой, идентифицирует следующий переход, записывает в таблицу начальное число ключа, время истечения срока действия и идентификаторы входящих и исходящих подключений, а также ключи, которые должны быть применены, накладывает лук и отправляет его следующему луковому маршрутизатору. Поскольку самый внутренний уровень содержит имя конечной машины, последний маршрутизатор пути будет действовать как целевой прокси и открывать сокетное соединение с конечной машиной.Обратите внимание, что только предназначенный для этого луковый маршрутизатор способен отклеивать предназначенный для него слой. Таким образом, каждый промежуточный луковый маршрутизатор знает (и может взаимодействовать с) только маршрутизатор предыдущего и следующего перехода. Более того, он не способен понять содержание следующих слоев лука. Маршрутизатор и любой внешний наблюдатель не могут знать априори длину пути, поскольку размер луковицы остается постоянным благодаря тому факту, что каждый промежуточный маршрутизатор обязан добавлять заполнение к луку, соответствующему слою фиксированного размера, который он удаленный.

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

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

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

    Tor [60] — луковая маршрутизация второго поколения.Он устраняет некоторые из отмеченных ранее ограничений, обеспечивая разумный компромисс между анонимностью, удобством использования и эффективностью. В частности, он обеспечивает идеальную прямую секретность и не требует прокси-сервера для каждого поддерживаемого протокола приложения. Tor также является эффективным инструментом обхода (инструмент для обхода интернет-фильтрации для доступа к контенту, заблокированному правительствами, рабочими местами или школами). Все инструменты обхода цензуры используют один и тот же основной метод обхода сетевой фильтрации: они прокси-соединения через сторонние сайты, которые сами не фильтруются.[61] представляет собой отчет об использовании этих инструментов. Одним из наиболее интересных результатов является небольшое использование инструментов обхода по отношению к количеству фильтрующих стран, что авторы объясняют тем фактом, что пользователи, вероятно, не знают о существовании такого рода инструментов или не могут их найти. .

    Асинхронное программирование. Блокирующий ввод-вывод и неблокирующий ввод-вывод — Блог

    Это первая публикация из серии, посвященной асинхронному программированию. Вся серия пытается ответить на простой вопрос: «Что такое асинхронность?».Вначале, когда я впервые начал разбираться в вопросе, я думал, что знаю, что это такое. Оказалось, что я ничего не знал об асинхронности. Итак, давайте узнаем!

    Всего серий:

    В этом посте мы будем говорить о сети, но вы можете легко сопоставить ее с другими операциями ввода / вывода (I / O), например, изменить сокеты на файловые дескрипторы. Кроме того, это объяснение не фокусируется на каком-либо конкретном языке программирования, хотя примеры будут приведены на Python (что я могу сказать — я люблю Python!).


    Так или иначе, когда у вас есть вопрос о блокирующих или неблокирующих вызовах, чаще всего это означает работу с вводом-выводом. Наиболее частым случаем в наш век информации, микросервисов и лямбда-функций будет обработка запросов. Сразу можно представить, что вы, дорогой читатель, являетесь пользователем веб-сайта, а ваш браузер (или приложение, в котором вы читаете эти строки) является клиентом. Где-то в глубине Амазонки есть сервер, который обрабатывает ваши входящие запросы и генерирует те же строки, которые вы читаете.

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

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

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

    Есть два способа организовать ввод-вывод (я буду приводить примеры на основе Linux): блокирующий и неблокирующий .

    Также существует два типа операций ввода-вывода: синхронные и асинхронные.

    Все вместе они представляют возможные модели ввода / вывода.

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

    Блокировка ввода / вывода

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

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

    Простой пример на Python, клиент:

      импортная розетка
    import sys
    время импорта
    
    
    def main () -> Нет:
        host = socket.gethostname ()
        порт = 12345
    
        # создать сокет TCP / IP
        с socket.socket (socket.AF_INET, socket.SOCK_STREAM) как sock:
            в то время как True:
                sock.connect ((хост, порт))
                в то время как True:
                    data = str.кодировать (sys.argv [1])
                    sock.send (данные)
                    time.sleep (0,5)
    
    если __name__ == "__main__":
        assert len ​​(sys.argv)> 1, «Пожалуйста, предоставьте сообщение»
        основной()
      

    Здесь мы отправляем сообщение с интервалом 50 мс на сервер в бесконечном цикле. Представьте, что это общение клиент-сервер состоит из загрузки большого файла — для завершения требуется некоторое время.

    И сервер:

      импортная розетка
    
    
    def main () -> Нет:
        host = socket.gethostname ()
        порт = 12345
        
        # создать сокет TCP / IP
        с розеткой.socket (socket.AF_INET, socket.SOCK_STREAM) как sock:
            # привязываем сокет к порту
            sock.bind ((хост, порт))
            # прослушивать входящие соединения
            sock.listen (5)
            print ("Сервер запущен ...")
    
            в то время как True:
                conn, addr = sock.accept () # прием входящего соединения, блокировка
                print ('Подключено' + str (адрес))
                в то время как True:
                    data = conn.recv (1024) # получение данных, блокировка
                    если не данные:
                        сломать
                    печать (данные)
    
    если __name__ == "__main__":
        основной()
      

    Я запускаю это в отдельных окнах терминала с несколькими клиентами как:

      $ клиент Python.py "клиент N"
      

    И сервер как:

      $ python server.py
      

    Здесь мы просто слушаем сокет и принимаем входящие соединения. Затем мы пытаемся получить данные от этого соединения.

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

    Что здесь происходит?

    Метод send () попытается отправить все данные на сервер, в то время как буфер записи на сервере будет продолжать получать данные.Когда вызывается системный вызов для чтения, приложение блокируется, и контекст переключается на ядро. Ядро инициирует чтение — данные передаются в буфер пользовательского пространства. Когда буфер становится пустым, ядро ​​снова пробуждает процесс, чтобы получить следующую порцию данных, подлежащих передаче.

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

    Неблокирующий ввод / вывод

    Однако есть и второй вариант — неблокирующий ввод-вывод . Отличие очевидно из названия — вместо блокировки любая операция выполняется сразу. Неблокирующий ввод-вывод означает, что запрос немедленно ставится в очередь и функция возвращается. Фактический ввод / вывод обрабатывается позже.

    Установив сокет в неблокирующий режим, вы можете эффективно опрашивать его. Если вы попытаетесь читать из неблокирующего сокета и нет данных, он вернет код ошибки ( EAGAIN или EWOULDBLOCK ).

    На самом деле, этот тип опроса — плохая идея. Если вы запустите свою программу в постоянном цикле опроса данных из сокета, это потребует дорогостоящего процессорного времени. Это может быть крайне неэффективно, потому что во многих случаях приложение должно быть занято-ждать, пока данные станут доступны, или пытаться выполнить другую работу, пока команда выполняется в ядре. Более элегантный способ проверить, доступны ли данные для чтения, — использовать select () .

    Вернемся к нашему примеру с изменениями на сервере:

      импорт выбрать
    импортный сокет
    
    
    def main () -> Нет:
        хост = сокет.gethostname ()
        порт = 12345
    
        # создать сокет TCP / IP
        с socket.socket (socket.AF_INET, socket.SOCK_STREAM) как sock:
            sock.setblocking (0)
            # привязываем сокет к порту
            sock.bind ((хост, порт))
            # прослушивать входящие соединения
            sock.listen (5)
            print ("Сервер запущен ...")
    
            # сокетов, из которых мы ожидаем читать
            входы = [носок]
            выходы = []
    
            а входы:
                # ждем, пока хотя бы один из сокетов будет готов к обработке
                читаемый, доступный для записи, исключительный = select.выберите (входы, выходы, входы)
    
                для s в читаемом виде:
                    если s - носок:
                        conn, addr = s.accept ()
                        inputs.append (соединение)
                    еще:
                        данные = s.recv (1024)
                        если данные:
                            печать (данные)
                        еще:
                            inputs.remove (s)
                            s.close ()
    
    если __name__ == "__main__":
        основной()
      

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

    Что здесь происходит?

    Здесь сервер не ждет, пока все данные будут записаны в буфер. Когда мы делаем сокет неблокирующим, вызывая setblocking (0) , он никогда не будет ждать завершения операции. Поэтому, когда мы вызываем метод recv , он вернется в основной поток. Основное механическое отличие состоит в том, что send , recv , connect и accept могут возвращаться без каких-либо действий.

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

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

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

    Ключевые слова для поиска:

    Уведомлений:

    • Запуск по уровню (состояние)
    • Запуск по фронту (состояние изменено)

    Механика:

    • выберите () , опрос ()
    • epoll () , kqueue ()
    • EAGAIN , EWOULDBLOCK

    Многозадачность

    Следовательно, наша цель — управлять несколькими клиентами одновременно.Как обеспечить одновременную обработку нескольких запросов?

    Есть несколько вариантов:

    Отдельные процессы

    Самый простой и исторически первый подход — обрабатывать каждый запрос в отдельном процессе. Этот подход удовлетворителен, потому что мы можем использовать тот же API блокирующего ввода-вывода. Если процесс внезапно завершится сбоем, это повлияет только на операции, которые обрабатываются в этом конкретном процессе, а не на какие-либо другие.

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

    Давайте посмотрим, как это работает на практике. Как только запускается первый процесс (основной процесс / главный процесс), он генерирует некоторый набор процессов в качестве рабочих. Каждый из них может получать запросы в один и тот же сокет и ждать входящих клиентов.Как только появляется входящее соединение, один из обрабатывающих его процессов принимает это соединение, обрабатывает его от начала до конца, закрывает сокет и затем снова становится готовым для следующего запроса. Возможны варианты — процесс может быть сгенерирован для каждого входящего соединения, или все они могут быть запущены заранее и т.д. Это может сказаться на производительности, но для нас это сейчас не так важно.

    Примеров таких систем:

    • Apache mod_prefork ;
    • FastCGI для тех, кто чаще всего использует PHP;
    • Phusion Passenger для тех, кто пишет на Ruby on Rails;
    • PostgreSQL.

    Резьба

    Другой подход — использовать потоки операционной системы (ОС). В рамках одного процесса мы можем создать несколько потоков. Также можно использовать блокировку ввода-вывода, потому что будет заблокирован только один поток.

    Пример:

      импорт выбрать
    импорт потоковой передачи
    импортный сокет
    
    
    обработчик def (клиент):
        в то время как True:
            данные = client.recv (1024)
            если данные:
                печать (данные)
            
        client.close ()
    
    def main () -> Нет:
        host = socket.gethostname ()
        порт = 12345
    
        # создать сокет TCP / IP
        с розеткой.socket (socket.AF_INET, socket.SOCK_STREAM) как sock:
            # привязываем сокет к порту
            sock.bind ((хост, порт))
            # прослушивать входящие соединения
            sock.listen (5)
            print ("Сервер запущен ...")
    
            в то время как True:
                клиент, адрес = sock.accept ()
                threading.Thread (цель = обработчик, args = (клиент,)). start ()
    
    если __name__ == "__main__":
        основной()
      

    Чтобы проверить количество потоков в серверном процессе, вы можете использовать команду linux ps с PID серверного процесса:

      $ ps huH p  | wc -l
      

    Операционная система сама управляет потоками и способна распределять их между доступными ядрами ЦП. Потоки легче процессов . По сути, это означает, что мы можем генерировать больше потоков, чем процессов в одной системе. Мы вряд ли сможем запустить 10 000 процессов, но 10 000 потоков могут быть легкими. Не то чтобы это было эффективно.

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

    Есть общие проблемы с синхронизацией:

    1. В процессе синхронизации возможны взаимоблокировок, .Тупиковая ситуация возникает, когда процесс или поток входит в состояние ожидания, потому что запрошенный системный ресурс удерживается другим ожидающим процессом, который, в свою очередь, ожидает другого ресурса, удерживаемого другим ожидающим процессом. Например, следующая ситуация вызовет тупик между двумя процессами:
      Процесс 1 запрашивает ресурс B у процесса 2. Ресурс B заблокирован во время работы процесса 2. Для процесса 2 требуется ресурс A из процесса 1 для завершения работы. Ресурс A заблокирован, пока выполняется процесс 1.
    2. Отсутствие синхронизации, когда у нас есть конкурентный доступ к общим данным. Грубо говоря, два потока одновременно меняют данные и портят их. Такие приложения сложнее отлаживать, и не все ошибки появляются сразу. Например, хорошо известный GIL в Python — Global Interpreter Lock — один из простейших способов создания многопоточного приложения. Используя GIL, мы говорим, что все структуры данных, вся наша память защищены одним семафором для всего процесса.