All streams
Search
Write a publication
Pull to refresh
24
0
Andrew Ka @comerc

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

Send message

Я узнал, что автор 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, предоставляемые стандартной библиотекой.

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

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

Чтобы стать богатым-знаменитым, нужно построить свою Церковь. Слова приписывают Рону Хаббарду, но вроде бы он этого не говорил. Униформа есть. Кадеты Глубины - служители. Правильной дорогой идёте, товарищи!

Картинка про архитектуру, где сердце - Hasura. Голосую всеми четырьмя лапами! С 2018-ого года бегаю с Хасурой, и пытаюсь везде её применить. R&D с открытым кодом: маркет-плейс на Flutter (на паузе, 850 серий лайв-кода), клон Трелло на React (продолжаю 276 дней). Вам надо бы ещё воткнуть Temporal.io (через Hasura Events - Microservice API) + Kafka (через Hasura Events - Event queue).

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


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

Почему хак? Красота! Язык фактически принуждает тебя к этому решению.

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

panic нельзя игнорировать без того, что бы программа не упала.

В чём разница errors.Is() и errors.As()

package main

import "errors"

type MyError struct {
  message string
}

func (e MyError) Error() string {
  return e.message
}

func main() {
  err := MyError{"My custom error"}
  println(errors.Is(err, MyError{"My custom error"})) // true
  println(errors.As(err, &MyError{})) // true
}

Внедрили свой OverflowAI

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

Information

Rating
Does not participate
Registered
Activity