Вот я и трахался полдня, разруливая конкурентность и параллелизм, т.к. DeepL тоже переводит concurrency, как параллелизм.
Это вполне устоявшийся термин. Можно погуглить, ну или спросить у ChatGPT:
Concurrency (конкурентность) в программировании обозначает выполнение нескольких задач одновременно. В языке Go (Golang) конкурентность достигается с помощью горутин (goroutines) - легковесных потоков выполнения. Горутины позволяют выполнять разные задачи параллельно, без необходимости явного управления потоками.
В GoLang локальная очередь горутин ограничена фиксированным размером, который по умолчанию равен 256 горутинам. Это означает, что каждый процессор (P) в Go имеет локальную очередь, в которой могут храниться до 256 горутин. Когда горутина готова к выполнению, она помещается в локальную очередь соответствующего процессора.
В контексте языка программирования Go, термин "M" обычно означает "machine" или "OS thread". "M" представляет собой логическую сущность, которая связывается с операционной системой и представляет собой поток выполнения, управляемый операционной системой. Каждая горутина (goroutine) в Go привязана к определенному "M" для выполнения своей работы.
Таким образом, "M" можно перевести как "machine" или "OS thread" на английском языке.
В языке Go, термины "P", "M" и "G" относятся к компонентам, используемым во время выполнения горутин (goroutines) и планирования параллельной работы.
P (процессор) - это горутина-планировщик, который отвечает за управление выполнением горутин. Он выполняет распределение горутин на доступные ядра процессора и управляет переключением между горутинами во время выполнения.
M (логический процессор) - это логический поток выполнения, который привязывается к физическому процессору. Каждый P может быть связан с одним M, и M отвечает за выполнение набора горутин, называемых G-планировщиком.
G (горутина) - это легковесный поток выполнения в Go. Горутины позволяют выполнять параллельные операции и обеспечивают удобные механизмы синхронизации и обмена данными.
Вместе, P, M и G обеспечивают механизм планирования и выполнения горутин в Go, позволяя эффективно использовать доступные ядра процессора для выполнения параллельных задач.
Когерентность кэша (cache coherence) и инвалидация кэша (cache invalidation) - это два связанных, но различных понятия в контексте кэшей.
Когерентность кэша относится к состоянию, в котором копии одних и тех же данных в разных кэшах согласованы между собой. Когда несколько ядер или процессоров имеют свои локальные кэши, возникает проблема согласованности данных. Когерентность кэша гарантирует, что все копии одной и той же ячейки памяти в разных кэшах ядер или процессоров содержат последнее актуальное значение.
Инвалидация кэша, с другой стороны, относится к процессу, при котором копия данных в кэше помечается как недействительная или устаревшая. Когда процессор или ядро выполняет запись в память, оно инвалидирует (invalidates) соответствующую копию данных в кэше других процессоров или ядер. Это гарантирует, что данные будут обновлены и согласованы во всех кэшах.
Таким образом, инвалидация кэша является одним из механизмов, используемых для обеспечения когерентности кэша. При записи данных в память, кэш ядра или процессора, выполняющего запись, инвалидирует соответствующие копии данных в кэше других ядер или процессоров, чтобы гарантировать, что все копии данных будут обновлены и будут согласованы.
В целом, когерентность кэша и инвалидация кэша являются ключевыми понятиями, связанными с механизмами работы кэшей в многоядерных системах, и они взаимосвязаны, но не являются синонимами.
Ожидание аппаратного обеспечения (hardware waiting) - это ситуация, когда программа приостанавливает своё выполнение, ожидая завершения операций, связанных с аппаратным обеспечением, такими как чтение/запись данных на диск, передача данных через сеть, получение сигналов от устройств ввода-вывода и т.д.
Когда программа выполняет операции, связанные с аппаратным обеспечением, она может столкнуться с ситуацией, когда она должна ждать завершения операции, чтобы перейти к следующей. Например, при чтении данных с диска программа должна ожидать, пока диск завершит чтение и передаст данные обратно в память.
Ожидание аппаратного обеспечения может быть вызвано различными причинами, включая задержки связанные с физическими ограничениями аппаратуры (например, время доступа к диску или сетевой задержки), ожидание получения данных от других устройств или ожидание наступления определенных событий.
Во время ожидания аппаратного обеспечения, процессор может использовать этот период для выполнения других задач или переключиться на выполнение других потоков/горутин. Это позволяет улучшить эффективность использования процессора и избежать простоя при выполнении операций, требующих ожидания.
Однако, если ожидание аппаратного обеспечения становится слишком длительным, это может сказаться на производительности программы. Поэтому, важно эффективно управлять ожиданием аппаратного обеспечения, например, путем использования асинхронных операций, многопоточности или использования буферизации данных, чтобы минимизировать время ожидания и максимизировать производительность программы.
Системные вызовы (system calls) в операционной системе - это интерфейс, предоставляемый операционной системой для взаимодействия прикладных программ с ядром операционной системы. Они позволяют приложениям выполнять привилегированные операции, такие как чтение/запись файлов, создание/закрытие процессов, управление сетевыми соединениями, выделение памяти и многое другое.
Когда приложение выполняет системный вызов, оно передает управление операционной системе, которая обрабатывает запрос и выполняет требуемую операцию от имени приложения. После завершения операции операционная система возвращает управление обратно приложению, обычно с результатом операции.
Примеры системных вызовов в разных операционных системах могут включать:
open, read, write, close для работы с файлами и сокетами.
fork, exec, exit для создания и управления процессами.
socket, bind, listen, accept для работы с сетевыми соединениями.
malloc, free для выделения и освобождения памяти.
Системные вызовы обычно предоставляются в виде библиотечных функций, доступных для прикладных программ. Например, в языке C системные вызовы могут быть обернуты в функции, такие как open, read, write, предоставляемые стандартной библиотекой.
Системные вызовы являются важной частью операционных систем и позволяют приложениям взаимодействовать с ресурсами и функциональностью операционной системы. Они обеспечивают абстракцию между приложением и аппаратным обеспечением, позволяя приложениям работать в изолированной и безопасной среде.
Чтобы стать богатым-знаменитым, нужно построить свою Церковь. Слова приписывают Рону Хаббарду, но вроде бы он этого не говорил. Униформа есть. Кадеты Глубины - служители. Правильной дорогой идёте, товарищи!
Картинка про архитектуру, где сердце - Hasura. Голосую всеми четырьмя лапами! С 2018-ого года бегаю с Хасурой, и пытаюсь везде её применить. R&D с открытым кодом: маркет-плейс на Flutter (на паузе, 850 серий лайв-кода), клон Трелло на React (продолжаю 276 дней). Вам надо бы ещё воткнуть Temporal.io (через Hasura Events - Microservice API) + Kafka (через Hasura Events - Event queue).
А прошлый инвестор... ирония заключается в том, что мы его просто уволили с проекта. Он сохранит за собой свою долю (Ваня болезненно честен, щепетилен в этом вопросе, и ценит участие даже при потерянном доверии), но думаю, вскоре эту долю просто выкупят. У человека был шанс, но теперь его ждёт только забвение. Даже имя его я не стал упоминать, если вы обратили внимание.
На этом месте возникает вопрос, какая судьба ожидает текущего инвестора? В долине крайне важен трекшн. Пятнышки на халатике.
Голосую всеми четырьмя лапами! Go - это матерный язык в мире языков программирования, где простыми выразительными средствами можно сказать больше, чем на своём родном языке.
https://draft.io/example/event-modeling
Я узнал, что автор Unix Way - Кен Томпсон; так же соавтор C и трудится над Go в Google в свои 80 лет (это почему книжки про C++).
Так и было! Ловил deadlock. Но. Мопед не мой, а самого Роба Пайка.
Вот я и трахался полдня, разруливая конкурентность и параллелизм, т.к. DeepL тоже переводит concurrency, как параллелизм.
Это вполне устоявшийся термин. Можно погуглить, ну или спросить у ChatGPT:
Concurrency (конкурентность) в программировании обозначает выполнение нескольких задач одновременно. В языке Go (Golang) конкурентность достигается с помощью горутин (goroutines) - легковесных потоков выполнения. Горутины позволяют выполнять разные задачи параллельно, без необходимости явного управления потоками.
Пасхалка же.
В GoLang локальная очередь горутин ограничена фиксированным размером, который по умолчанию равен 256 горутинам. Это означает, что каждый процессор (P) в Go имеет локальную очередь, в которой могут храниться до 256 горутин. Когда горутина готова к выполнению, она помещается в локальную очередь соответствующего процессора.
В контексте языка программирования Go, термин "M" обычно означает "machine" или "OS thread". "M" представляет собой логическую сущность, которая связывается с операционной системой и представляет собой поток выполнения, управляемый операционной системой. Каждая горутина (goroutine) в Go привязана к определенному "M" для выполнения своей работы.
Таким образом, "M" можно перевести как "machine" или "OS thread" на английском языке.
В языке Go, термины "P", "M" и "G" относятся к компонентам, используемым во время выполнения горутин (goroutines) и планирования параллельной работы.
P (процессор) - это горутина-планировщик, который отвечает за управление выполнением горутин. Он выполняет распределение горутин на доступные ядра процессора и управляет переключением между горутинами во время выполнения.
M (логический процессор) - это логический поток выполнения, который привязывается к физическому процессору. Каждый P может быть связан с одним M, и M отвечает за выполнение набора горутин, называемых G-планировщиком.
G (горутина) - это легковесный поток выполнения в Go. Горутины позволяют выполнять параллельные операции и обеспечивают удобные механизмы синхронизации и обмена данными.
Вместе, P, M и G обеспечивают механизм планирования и выполнения горутин в Go, позволяя эффективно использовать доступные ядра процессора для выполнения параллельных задач.
Когерентность кэша (cache coherence) и инвалидация кэша (cache invalidation) - это два связанных, но различных понятия в контексте кэшей.
Когерентность кэша относится к состоянию, в котором копии одних и тех же данных в разных кэшах согласованы между собой. Когда несколько ядер или процессоров имеют свои локальные кэши, возникает проблема согласованности данных. Когерентность кэша гарантирует, что все копии одной и той же ячейки памяти в разных кэшах ядер или процессоров содержат последнее актуальное значение.
Инвалидация кэша, с другой стороны, относится к процессу, при котором копия данных в кэше помечается как недействительная или устаревшая. Когда процессор или ядро выполняет запись в память, оно инвалидирует (invalidates) соответствующую копию данных в кэше других процессоров или ядер. Это гарантирует, что данные будут обновлены и согласованы во всех кэшах.
Таким образом, инвалидация кэша является одним из механизмов, используемых для обеспечения когерентности кэша. При записи данных в память, кэш ядра или процессора, выполняющего запись, инвалидирует соответствующие копии данных в кэше других ядер или процессоров, чтобы гарантировать, что все копии данных будут обновлены и будут согласованы.
В целом, когерентность кэша и инвалидация кэша являются ключевыми понятиями, связанными с механизмами работы кэшей в многоядерных системах, и они взаимосвязаны, но не являются синонимами.
Ожидание аппаратного обеспечения (hardware waiting) - это ситуация, когда программа приостанавливает своё выполнение, ожидая завершения операций, связанных с аппаратным обеспечением, такими как чтение/запись данных на диск, передача данных через сеть, получение сигналов от устройств ввода-вывода и т.д.
Когда программа выполняет операции, связанные с аппаратным обеспечением, она может столкнуться с ситуацией, когда она должна ждать завершения операции, чтобы перейти к следующей. Например, при чтении данных с диска программа должна ожидать, пока диск завершит чтение и передаст данные обратно в память.
Ожидание аппаратного обеспечения может быть вызвано различными причинами, включая задержки связанные с физическими ограничениями аппаратуры (например, время доступа к диску или сетевой задержки), ожидание получения данных от других устройств или ожидание наступления определенных событий.
Во время ожидания аппаратного обеспечения, процессор может использовать этот период для выполнения других задач или переключиться на выполнение других потоков/горутин. Это позволяет улучшить эффективность использования процессора и избежать простоя при выполнении операций, требующих ожидания.
Однако, если ожидание аппаратного обеспечения становится слишком длительным, это может сказаться на производительности программы. Поэтому, важно эффективно управлять ожиданием аппаратного обеспечения, например, путем использования асинхронных операций, многопоточности или использования буферизации данных, чтобы минимизировать время ожидания и максимизировать производительность программы.
Системные вызовы (system calls) в операционной системе - это интерфейс, предоставляемый операционной системой для взаимодействия прикладных программ с ядром операционной системы. Они позволяют приложениям выполнять привилегированные операции, такие как чтение/запись файлов, создание/закрытие процессов, управление сетевыми соединениями, выделение памяти и многое другое.
Когда приложение выполняет системный вызов, оно передает управление операционной системе, которая обрабатывает запрос и выполняет требуемую операцию от имени приложения. После завершения операции операционная система возвращает управление обратно приложению, обычно с результатом операции.
Примеры системных вызовов в разных операционных системах могут включать:
open
,read
,write
,close
для работы с файлами и сокетами.fork
,exec
,exit
для создания и управления процессами.socket
,bind
,listen
,accept
для работы с сетевыми соединениями.malloc
,free
для выделения и освобождения памяти.Системные вызовы обычно предоставляются в виде библиотечных функций, доступных для прикладных программ. Например, в языке C системные вызовы могут быть обернуты в функции, такие как
open
,read
,write
, предоставляемые стандартной библиотекой.Системные вызовы являются важной частью операционных систем и позволяют приложениям взаимодействовать с ресурсами и функциональностью операционной системы. Они обеспечивают абстракцию между приложением и аппаратным обеспечением, позволяя приложениям работать в изолированной и безопасной среде.
Комплексный обед из трёх блюд. Продукт, Поляна, Последователи. Респект!
Чтобы стать богатым-знаменитым, нужно построить свою Церковь. Слова приписывают Рону Хаббарду, но вроде бы он этого не говорил. Униформа есть. Кадеты Глубины - служители. Правильной дорогой идёте, товарищи!
Картинка про архитектуру, где сердце - Hasura. Голосую всеми четырьмя лапами! С 2018-ого года бегаю с Хасурой, и пытаюсь везде её применить. R&D с открытым кодом: маркет-плейс на Flutter (на паузе, 850 серий лайв-кода), клон Трелло на React (продолжаю 276 дней). Вам надо бы ещё воткнуть Temporal.io (через Hasura Events - Microservice API) + Kafka (через Hasura Events - Event queue).
На этом месте возникает вопрос, какая судьба ожидает текущего инвестора? В долине крайне важен трекшн. Пятнышки на халатике.
Почему хак? Красота! Язык фактически принуждает тебя к этому решению.
panic
нельзя игнорировать без того, что бы программа не упала.В чём разница
errors.Is()
иerrors.As()
Внедрили свой OverflowAI
Голосую всеми четырьмя лапами! Go - это матерный язык в мире языков программирования, где простыми выразительными средствами можно сказать больше, чем на своём родном языке.