Обновить
17
-1.6
Andrew Ka@comerc

#кодеротбога

Отправить сообщение

А вы готовите BDD?

filepath.Walk(".", visit) применяет такое же решение:

func visit(p string, info os.FileInfo, err error) error {

if err != nil { return err }

fmt.Println(" ", p, info.IsDir())

return nil

}

В мамбе такое было 15 лет назад.

Вы отказались от Nakama в Balancy?

очепятка на картинке с красными и синими квадратиками. в правом верхнем углу должен быть "Event Storming" а не "Event Sourcing", см. оригинал: https://threedots.tech/post/software-dark-ages/system-thinking-solved.jpg

Я узнал, что автор 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) в операционной системе - это интерфейс, предоставляемый операционной системой для взаимодействия прикладных программ с ядром операционной системы. Они позволяют приложениям выполнять привилегированные операции, такие как чтение/запись файлов, создание/закрытие процессов, управление сетевыми соединениями, выделение памяти и многое другое.

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

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

  • openreadwriteclose для работы с файлами и сокетами.

  • forkexecexit для создания и управления процессами.

  • socketbindlistenaccept для работы с сетевыми соединениями.

  • mallocfree для выделения и освобождения памяти.

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

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

Комплексный обед из трёх блюд. Продукт, Поляна, Последователи. Респект!

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность