Да, я закодировал семафор и нет, я не разработчик ОС.

1656530414 da ya zakodiroval semafor i net ya ne razrabotchik os

автор Сажал Сарвар Шарма

Когда вы можете использовать семафоры в повседневной жизни кодировки

1*qKfV6Xbz-CAx11Hgd__z5Q
Семафоры!

Вы сидите в 8-м стандартном классе математики и читаете о пифагоровских троицах, вы грабите теорему Пифагора. Известное уравнение (a*a)+(b*b) = (c*c) запечатлено в вашем сознании.

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

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

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

Постановка проблемы

Итак, история начинается с того, что в один прекрасный день я мирно сидел в своем уютном теплом уголке офиса, занимаясь разработкой своего обычного API. Появился пользовательский билет, который сказал, что они получили несколько сообщений от нашего сервиса, и они были раздражены этим. Я дважды проверил код, но этого не могло произойти. Cron, запускающий и отправляющий сообщение конечному пользователю, должен был отправить его только один раз (и этот cron запускается каждый час).

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

К моему ужасу, я видел, как несколько экземпляров одного и того же хрена связи запущено одновременно, выбирая те же задачи и отправляя сообщения. Это все объяснило. (Этого не должно было произойти — 1-й экземпляр cron должен был завершить свое выполнение до того, как начал работать 2-й экземпляр. Вот как должны работать задачи cron).

В тот конкретный день произошел рост количества задач, которые должен выполнять cron, что заставляло cron продолжать работать гораздо выше своего обычного времени выполнения. Это привело к перекрытию (другими словами, он продолжал работать даже через час, а потом появился 2-й экземпляр).

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

Решение

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

«Сегодня тот день», — подумал я.

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

Шаг 1

В каталоге системных файлов создайте файл с именем myCronPID.txt который будет сохранять идентификатор процесса (PID) cron, запущенного в данном конкретном экземпляре. Согласно Википедии:

В вычислительной тех идентификатор процесса (обычно именуется как идентификатор процесса или PID) — это число, используемое большинством ядер операционной системы — например, UNIX, macOS и Microsoft Windows — для уникальной идентификации активного процесс.

Шаг 2

Узнайте идентификатор процесса (PID) запущенного cron. Это можно сделать с помощью кода ниже (я буду использовать PHP для справки).

Шаг 3

Впервые файл myCronPID.txt будет пустым. Сохраните текущий PID в шаге 2 в этом файле. В следующий раз, получив PID текущего запущенного cron (скажем, 5678), получите PID из файла myCronPID.txt. PID, полученный из файла (скажем, 1234), будет идентификатором процесса экземпляра cron, работавшего ранее. Убедитесь, что PID 1234 все еще находится в состоянии выполнения/запуска. Это легко найти.

В системах Linux есть папка /proc содержащий папки для текущих процессов в системе. Назови папок в этом /proc папки – это идентификаторы процесса. Так скажем, если /proc папка содержит папку 1234, тогда это означает, что процесс PID 1234 находится в запущенном состоянии. Если в нем нет такой папки, это означает, что в данный момент не запущен ни один процесс с PID 1234.

Шаг 4

На этом шаге получите PID из файла myCronPID.txt и проверьте, выполняется ли процесс, используя код, приведенный на шаге 3.

  1. Если isProcessRunning возвращает true, тогда это означает, что предыдущий запущенный экземпляр cron не завершил исполнение. Итак, новый экземпляр, вызвавший функцию isProcessRunning не должно восстанавливаться с его исполнением.
  2. Если isProcessRunning возвращает false, тогда это означает, что предыдущий экземпляр cron завершил свое исполнение. Новый экземпляр, вызвавший функцию isProcessRunning должно возобновить его выполнение и поместить собственный идентификатор процесса в myCronPID.txt

Шаг 5

Объединив все это вместе:

Если вы используете экземпляр cron, просто вызовите указанный выше объект класса с помощью соответствующего конструктора.

$fileName – Это будет имя файла, в котором будет храниться PID файла cron.

$rootDir — Это будет корневой каталог вашего текущего проекта.

После вызова используйте методы Util в своем коде Cron, как показано ниже:

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

Подведению

Исследовав все это и написав вышеприведенный код, я понял, что все время не реализовал ничего, кроме семафоров. Мой профессор ОС сегодня был бы горд.

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

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

PS: Надеюсь, вам понравится моя статья, поправьте меня, если я где ошибаюсь.

Добавить комментарий

Ваш адрес email не будет опубликован.