Серия «Программирование»

5

Про системные потоки в Linux

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

Про системные потоки в Linux

Один из стандартов для работы с системными потоками в Linux - это POSIX Threads (Pthreads), который определяет набор функций и типов данных для создания, управления и синхронизации потоков. Pthreads поддерживается большинством современных компиляторов C и C++ в Linux. Для использования Pthreads необходимо подключить заголовочный файл <pthread.h> и добавить флаг -lpthread при компиляции.

Для мониторинга системных потоков в Linux можно использовать различные инструменты, такие как top, htop, ps, pstree и другие. Эти инструменты позволяют просматривать информацию о процессах и потоках, такую как идентификаторы, приоритеты, состояния, использование ресурсов и т.д.

Несколько интересных фактов:

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

  • Системные потоки в Linux поддерживают модель N:1, 1:1 и M:N2. Это означает, что можно создавать многоуровневые потоки, которые сочетают в себе преимущества пользовательских и ядерных потоков. Модель N:1 означает, что несколько пользовательских потоков могут быть отображены на один ядерный поток. Модель 1:1 означает, что каждый пользовательский поток соответствует одному ядерному потоку. Модель M:N означает, что M пользовательских потоков могут быть отображены на N ядерных потоков.

  • Системные потоки в Linux могут иметь разные приоритеты и политики планирования. Приоритет - это число от 1 до 99, которое определяет, как часто поток должен получать процессорное время. Политика планирования - это алгоритм, который определяет, какой поток должен быть выбран для выполнения. Существуют три основные политики планирования для системных потоков в Linux: SCHED_OTHER, SCHED_FIFO и SCHED_RR. SCHED_OTHER - это стандартная политика для обычных процессов. SCHED_FIFO - это политика для реального времени, которая дает потоку высшего приоритета выполняться до тех пор, пока он не завершится или не заблокируется. SCHED_RR - это политика для реального времени, которая дает потоку высшего приоритета выполняться на определенный квант времени, а затем переключается на следующий поток с таким же приоритетом.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью 1

Интересные факты про дистрибутивы Linux

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

Интересные факты про дистрибутивы Linux
  • Linux можно найти на более чем 87% систем и на ~500 лучших в мире суперкомпьютеров. Большинство смартфонов и смартчасов работает на Android, модифицированном Linux, ваш рутер, скорее всего, тоже работает на Linux. Ядро Linux написано на языке C.

  • Ubuntu - это один из самых популярных дистрибутивов Linux, основанный на Debian. Он предлагает простоту использования, активное сообщество, большой выбор программного обеспечения и широкую распространённость дистрибутива. Ubuntu стала базой для целого ряда специализированных дистрибутивов от Canonical, таких как Lubuntu, Xubuntu, Kubuntu и Edubuntu.

  • Debian - это один из старейших и самых влиятельных дистрибутивов Linux, который был основан в 1993 году. Он славится своей легковесностью, стабильностью и безопасностью. Debian является основой для многих других дистрибутивов, таких как Ubuntu, Mint, Kali и Raspbian.

  • Arch Linux - это дистрибутив Linux для продвинутых пользователей, который предлагает полную свободу настройки и контроля над системой. Он следует принципу KISS (Keep It Simple, Stupid) и использует собственный менеджер пакетов pacman. Arch Linux имеет регулярные обновления и поддерживает последние технологии.

  • Kali Linux - это дистрибутив Linux для работы с безопасностью и тестированием проникновения. Он включает в себя более 600 инструментов для различных задач, таких как сканирование сети, анализ уязвимостей, взлом паролей и скрытность. Kali Linux основан на Debian и использует рабочий стол GNOME.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью 1

Канализация Golang(Каналы)

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

Канализация Golang(Каналы)

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

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

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

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

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

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью 1
269

Интересные факты про файловую систему Linux

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

Интересные факты про файловую систему Linux
  • Структура директорий. В Linux все файлы и каталоги расположены внутри одной корневой директории, обозначаемой символом /. В Windows же существуют разные логические диски, обозначаемые буквами, например C:, D: и т.д.

  • Чувствительность к регистру. В Linux имена файлов и каталогов различаются по регистру букв, то есть file.txt и File.txt - это два разных файла. В Windows же регистр букв не имеет значения, то есть file.txt и File.txt - это один и тот же файл.

  • Обратные слеши против прямых слешей. В Linux для разделения каталогов в пути к файлу используется прямой слеш /, например /home/user/Documents/file.txt. В Windows же используется обратный слеш \, например C:\Users\User\Documents\file.txt.

  • Нет букв дисков - всё находится в /. В Linux для доступа к содержимому других устройств хранения данных, таких как разделы жесткого диска, флешки, CD-ROM и т.д., используется операция монтирования, которая присоединяет устройство к определенному месту в дереве каталогов, называемому точкой монтирования. Например, раздел жесткого диска может быть примонтирован к каталогу /media/data, а флешка - к каталогу /media/usb. В Windows же каждому устройству хранения данных присваивается своя буква диска, например D:, E: и т.д.

  • Всё - файлы. В Linux почти все сущности в системе представлены в виде файлов, включая устройства, процессы, потоки и т.д. Это позволяет работать с ними с помощью стандартных команд и инструментов для работы с файлами. Например, для получения информации о процессоре можно прочитать содержимое файла /proc/cpuinfo, а для записи данных на звуковое устройство можно использовать команду cat file.wav > /dev/audio.

  • Вы можете удалять или изменять открытые файлы. В Linux вы можете удалить или переименовать файл, даже если он используется какой-то программой. Это не повлияет на работу программы, так как она продолжит использовать старый файл до тех пор, пока не закроет его. В Windows же вы не сможете удалить или переименовать файл, если он открыт какой-то программой.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью

Как реализован RAII в разных языках

RAII (Resource Acquisition Is Initialization) — это техника программирования, которая связывает жизненный цикл ресурса, который должен быть получен перед использованием (выделенная память, поток выполнения, открытый сокет, открытый файл, заблокированный мьютекс и т. д.), с продолжительностью жизни объекта. RAII гарантирует, что ресурс доступен для любой функции, которая может получить доступ к объекту, и что все ресурсы освобождаются, когда заканчивается срок действия их управляющего объекта, в обратном порядке приобретения.

Как реализован RAII в разных языках

RAII является одной из основных концепций языка C++, которая позволяет эффективно управлять ресурсами с помощью конструкторов и деструкторов классов. В C++ RAII часто реализуется с помощью умных указателей, таких как std::unique_ptr или boost::shared_ptr, которые автоматически освобождают ресурс при выходе из области видимости.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

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

  • В Java RAII не поддерживается на уровне языка, так как нет деструкторов и нет гарантии вызова метода finalize. Вместо этого используется конструкция try-with-resources, которая позволяет автоматически закрывать ресурсы, реализующие интерфейс AutoCloseable.

  • В Python RAII также не поддерживается на уровне языка, но есть возможность использовать менеджеры контекста с помощью оператора with. Менеджер контекста — это объект, который имеет методы enter и exit, которые вызываются при входе и выходе из блока with соответственно.

  • В Rust RAII поддерживается на уровне языка и является ключевой частью системы безопасности памяти. В Rust все переменные имеют владельца (owner), который отвечает за освобождение ресурса при выходе из области видимости. Также есть возможность передавать владение (ownership) или заимствовать (borrow) переменные с помощью ссылок.

Показать полностью 1

Интересные факты про массивы в C++

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

Интересные факты про массивы в C++
  • Массивы в C++ имеют фиксированный размер, который должен быть известен на этапе компиляции. Это означает, что нельзя динамически изменять размер массива или присваивать один массив другому. Для работы с динамическими массивами нужно использовать указатели и операторы new и delete, либо стандартные контейнеры, такие как std::vector или std::array.

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

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

  • Массивы в C++ поддерживают различные способы инициализации, которые позволяют задавать значения элементов при объявлении массива. Для этого можно использовать фигурные скобки и перечислить значения через запятую6. Например, int numbers5 = {1, 2, 3, 4, 5} - это одномерный массив из пяти целых чисел. Если количество значений меньше размера массива, то оставшиеся элементы будут заполнены нулями. Если количество значений больше размера массива, то компилятор выдаст ошибку. Также можно опустить размер массива и позволить компилятору вывести его из количества значений. Например, int numbers[] = {1, 2, 3} - это эквивалентно int numbers[3] = {1, 2, 3}.

Интересные факты и фичи языков программирования у нас в канале, заходи :)

Показать полностью
Отличная работа, все прочитано!