Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Классическая игра в аркадном стиле для любителей ретро-игр. Защитите космический корабль с Печенькой (и не только) на борту, проходя уровни.

Космический арканоид

Арканоид, Аркады, Веселая

Играть

Топ прошлой недели

  • AirinSolo AirinSolo 10 постов
  • Animalrescueed Animalrescueed 46 постов
  • mmaassyyaa21 mmaassyyaa21 3 поста
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
5
NetIntel
NetIntel
Лига программистов

Что происходит, когда запускается код?⁠⁠

7 часов назад

ТГК: NetIntelRU

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

Три пути выполнения

Что происходит, когда запускается код?

Если код компилируемый (например, написан на C++ или Go), то компилятор берет ваш исходный код (.cpp, .rs) и превращает его в так называемый объектный файл (.o или .obj). Это уже почти машинный код, но в нем могут быть "пробелы", например, вызов функции printf, код которой находится в другой библиотеке.

В работу вступает линковка (линкер/компоновщик/сборщик). Его задача взять один или несколько объектных файлов и склеить их в единый, работоспособный исполняемый файл (.exe или ELF). Он находит все недостающие функции (в других объектных файлах или в системных библиотеках), подставляет их реальные адреса на место "пробелов" и создает итоговый файл, готовый к загрузке в память.

Если код интерпретируемый (Python, JavaScript), то ситуация иная. Здесь нет классической компиляции и линковки перед запуском. Файл, который вы запускаете, это исходный текст. В память загружается сама программа-интерпретатор, а уже она получает путь к вашему скрипту. То есть, процесс создается для интерпретатора, а он уже, в свою очередь, будет читать и выполнять ваш код построчно в реальном времени.

Существует и гибридный подход (JIT-компиляция в Java или C#), когда исходный код сначала компилируется в промежуточный байт-код CIL (промежуточный код между высокоуровневым исходным кодом, который пишут разработчики, и машинным кодом, исполняемым процессором), а специальная среда выполнения (виртуальная машина) компилирует его в машинный код уже в процессе работы программы, совмещая гибкость интерпретации и скорость компиляции.

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

Подготовка среды

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

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

ОС отрезает в оперативной памяти (RAM) приватный участок и называется он "виртуальное адресное пространство". Это мощная абстракция, которая дает каждому процессу иллюзию, что у него в распоряжении есть вся память компьютера целиком, начиная с адреса 0 и заканчивая очень большим числом (например, 2^64 в 64-битных системах).

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

Интересный момент не по теме: Если ОС так тщательно изолирует процессы, как тогда программа-вирус может украсть данные, зашифровать файлы или встроиться в систему? Ответ прост: вирус должен получить разрешение от пользователя или ОС на выход из своей "песочницы". Вирус, запущенный от имени обычного пользователя (без прав админа), не может повредить систему, но он может свободно работать с файлами текущего пользователя. Также вирус может использовать уязвимости и внедриться в другие процессы.

Каждому новому процессу ОС присваивает уникальный номер - Process ID. Так она может отличать твою запущенную косынку от десятков других процессов.

Теперь, когда процесс есть в памяти, специальный компонент ОС, "загрузчик", открывает твой исполняемый файл (.exe или файл в формате ELF) и раскладывает его части по заранее размеченным зонам в памяти.

Управление

Планировщик задач

Загрузчик разместил код в памяти, ОС передала управление процессору. Программа ожила и начала выполнять свои инструкции, но она не одна. На компьютере одновременно работают десятки других процессов. Как ОС управляет этим?

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

Если у тебя четырёхъядерный процессор с Hyper-Threading, он может одновременно выполнять до восьми потоков (по одному на каждое логическое ядро). Однако в системе обычно работают десятки или даже сотни процессов и потоков, что гораздо больше, чем ядер.

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

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

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

Системные вызовы

Ваша программа не может делать все, что захочет. Она не может напрямую читать с диска, писать в сеть или выводить что-то на экран. Это было бы небезопасно и привело бы к полному хаосу. Вместо этого она просит ОС.

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

Когда программе нужно выполнить привилегированную операцию (например, открыть файл, выделить память или отправить данные по сети), она инициирует системный вызов. Для этого используется специальная инструкция процессора (например, syscall или svc), которая вызывает программное прерывание. Это прерывание приостанавливает выполнение программы и передаёт управление ядру ОС.

Ядро проверяет запрос, выполняет необходимые действия (например, чтение файла или выделение памяти), а затем возвращает результат программе и снова передаёт ей управление. Если операция требует ожидания, например, данные ещё не загружены с диска, ядро может временно блокировать программу, чтобы не тратить ресурсы процессора на ожидание.

Управление памятью и файлами

Во время работы программы её потребности в ресурсах могут меняться. ОС постоянно отслеживает это. Если программе требуется выделение или освобождение памяти на уровне ОС (например, при увеличении кучи или создании нового сегмента памяти), она делает системный вызов.

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

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

Исполнение

Исполнение это процесс, при котором процессор выполняет инструкции программы, преобразованные в машинный код.

Выборка (Fetch)

Процессор имеет специальный регистр - счётчик команд (Program Counter, PC или Instruction Pointer, IP), в котором хранится адрес следующей инструкции, которую нужно выполнить. Этот адрес виртуальный, и он преобразуется в физический с помощью MMU (Memory Management Unit).

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

Конвейеризация это технология, при которой процессор разбивает выполнение инструкций на эти этапы и выполняет их параллельно для разных инструкций.

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

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

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

Декодирование (Decode)

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

Устройство управления анализирует opcode и генерирует сигналы для активации нужных компонентов процессора. Например, для инструкции сложения (ADD EAX, EBX) оно отправит сигнал в арифметико-логическое устройство (АЛУ), чтобы выполнить операцию, и в регистры, чтобы сохранить результат.

На этом этапе процессор также извлекает операнды из регистров или памяти. Например, если инструкция требует сложить два числа, процессор загрузит их из указанных регистров в АЛУ.

Пример: Рассмотрим инструкцию MOV EAX, [EBX] (переместить данные из ячейки памяти, адрес которой хранится в EBX, в регистр EAX). На этапе декодирования процессор:

  1. Определяет, что это инструкция перемещения данных (MOV).

  2. Извлекает адрес из регистра EBX.

  3. Подготавливает АЛУ и регистры для передачи данных из памяти в EAX.

В современных процессорах декодирование может быть многоступенчатым и включать микропрограммы для сложных инструкций. Если процессор встречает недопустимую инструкцию, он генерирует исключение, и управление передаётся операционной системе.

Выполнение (Execute)

Где процессор берет числа для операций и куда кладет результат? Для этого у него есть своя сверхбыстрая внутренняя память - регистры.

Давайте посмотрим на этот процесс на простом примере. Возьмем строчку кода: c = a + 5;

После того как процессор декодировал инструкцию, соответствующую этой строке, он переходит к выполнению. Процессор загружает значение переменной a из оперативной памяти в один из своих регистров. Затем он загружает константу 5 в другой регистр (например, в RBX).

Он отдает команду своему АЛУ, чтобы сложить то, что лежит в RAX, с тем, что лежит в RBX. АЛУ выполняет сложение, и результат (например, 23) помещается обратно в регистр RAX. Наконец, процессор сохраняет значение из регистра RAX обратно в оперативную память, по адресу, где находится переменная c.

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

Завершение работы и уборка

Завершение работы

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

Когда процессор получает прерывание, текущее состояние программы сохраняется в стек. Процессор передает управление специальной функции в ядре ОС - обработчику прерываний. Это заранее подготовленный код для конкретного устройства.

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

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

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

Для системного вызова ОС выполняет запрошенную операцию и возвращает управление программе, как мы описывали ранее.

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

Уборка

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

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

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

Вся физическая оперативная память (RAM) и место в файле подкачки, которые были заняты процессом, помечаются как свободные. Теперь они могут быть выделены другим процессам.

Его уникальный номер (PID) теперь свободен и может быть выдан новому процессу. Планировщик задач убирает этот процесс из своих очередей на выполнение.

Сборщик мусора (Garbage Collector, GC) это не механизм операционной системы, а компонент среды выполнения конкретного языка программирования. Если уборка, которую делает ОС, это снос целого процесса, то сборщик мусора это уборка внутри процесса, пока он живёт.

Если понравилась статья - рекомендую подписаться на телеграм‑канал NetIntel. Там вы сможете найти множество полезных материалов по IT и разработке!

Показать полностью 1
[моё] Программа IT Программирование Сисадмин Операционная система Программист Linux Windows Linux и Windows Информационная безопасность Тестирование Длиннопост
14
3
itstorytelling
itstorytelling
Информатика • Алексей Гладков

28.11 — Международный день системного инженера [вехи_истории]⁠⁠

2 дня назад
🗓 28.11 — Международный день системного инженера [вехи_истории]

🗓 28.11 — Международный день системного инженера [вехи_истории]

Системные инженеры - объединяют оборудование, сети, ПО и безопасность в работающие платформы — от дата‑центров до корпоративных сетей и высоконагруженных сервисов.

☝️ Важность: от них зависят стабильность сервисов, скорость, масштабируемость и безопасность бизнеса.

🎆 Всех системных инженеров - с Праздником! Пусть падений будет 0!

=====================================
👇👇Наш канал на других площадках👇👇
YouTube | VkVideo | Telegram | Pikabu
=====================================

Показать полностью 1
[моё] Информатика Информатика Алексей Гладков Вехи истории Технологии История IT Компьютер Сети Инженер Компьютерное железо Сисадмин
0
user9530829
user9530829
Офисные будни

Техник Пётр заставил начальницу называть его на Вы, но спустя некоторое время почему-то уволился... Как считаешь, какова причина?⁠⁠

11 дней назад

Мой знакомый Пётр, когда ему ещё был 21 год, устроился на большое предприятие техником по компьютерам: по сути, сисадмин с функциями подай-принеси (только с уклоном в IT).

И вот в первый же рабочий день у него с начальницей (девушкой лет 25) произошёл такой диалог:

- Здравствуй, Пётр. Меня зовут Ольга Владимировна, я - твой начальник.

- Здравствуй, Ольга. Приятно с тобой познакомиться.

- У нас принято к начальству обращаться на Вы. Пожалуйста, соблюдай субординацию, - ответила Ольга.

- Нет, вот тут ты неправа! Согласно Уставу нашей организации, пункт 25.2, все работники и администраторы общаются исключительно на ВЫ. Могу показать.., - нашёлся Петя.

- Аа, так значит! Отлично! Тогда, Пётр... как Вас по отчеству, скажите, пожалуйста?

- Евгеньевич, - с достоинством ответил мой друг.

- Тогда, Пётр Евгеньевич, с сегодняшнего дня Вы будете работать ИСКЛЮЧИТЕЛЬНО по Уставу. Сейчас я позвоню другим руководителям, чтобы они приняли Ваше желание, - она набрала нескольким и говорила только одно: "Пётр Евгеньевич, новый техник, выбрал работать исключительно по Уставу".

- Отлично! Я уставов ваших не боюсь! - гордо веселился Пётр.

Но уже спустя неделю он писал заявление по собственному желанию. А мне при встрече сказал: "Да, я хотел работать там, но если бы не написал по собственному, меня бы уволили по статье. Это были ужасные дни".

Вопрос: каким образом его вынудили писать по собственному?

Показать полностью
[моё] Работа IT Сисадмин Офис Начальство Субординация Устав Бюрократия Увольнение Карьера Юмор Ирония Жизненно Текст
20
108
user9794249
user9794249
IT-юмор

Ответ RA85149 в «Ностальгия»⁠⁠2

17 дней назад

К сожалению в современных реалиях в вакансиях или на собеседованиях порой несут такую дичь, что уже сразу не хочется идти на такую работу, приведу пару примеров из личного опыта:

1) Вакансия админа 150к зарплата плюс квартальные премии, все по ТК, 5/2, 9-18, все хорошо, должен работать единственным админом в офисе на 100 человек микрот/виртуализация/1С/Битрикс и т.п. (при отладке работы за 2-3 месяца потом только расходники меняешь на практике) в реальности требуется перенести 2 зарубежных кластера с обновлением виртуализации (там старенькая VmWare), не останавливая их работу на другие зарубежные ресурсы (причем виртуализацию покупать не хотят т.е. смотрим в сторону XCP-ng/Proxmox), суммарный объем данных около 30 Тб, срок 3 месяца, базово нет ничего кроме текущего зарубежного поставщика. Интересно почему предыдущий админ оттуда сбежал?

2) Вакансия админа 150к зарплата плюс квартальные премии, все по ТК, 5/2, 9-18, все хорошо, снова единственный админ в офисе. В описании ничего интересного окромя волшебного слова kubernetes, спрашиваю а зачем оно вам в компании из 80 человек у которых рабочий софт это эксель и 1С (даже виртуализацией не пахнет), в ответ - а мы хотим сервисы там организовать и это принято в стратегии развития...

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

Показать полностью
Вакансии IT Сисадмин Тяжелый труд Юмор Ответ на пост Текст
24
902
RA85149
RA85149
IT-юмор

Ответ на пост «Ностальгия»⁠⁠2

17 дней назад

Я не админ, но читаю вакансию и прям вижу, как там всё устроено.

>> ЗП 250к

По факту: оклад в целых 110к, остальное будет премиями (которые никто не регламентирует) и доп. работами в виде наставничества, "внерабочей деятельности" и с учётом оплаты сверхурочных и т.д.

Ах да, всё это до вычета налогов. Индексация? "У нас плохие экономические показатели, имеем право не повышать!".

Когда ты станешь неугоден - тебе начнут платить голый оклад. А дальше думай как знаешь.

>> Работа с 9 до 18

По факту: с 8 до 18 и далее или с 9 до 19 и далее. Плюс выход на работу по выходным.

У нас же бесконечная, нескончаемая "сдача проекта" или "приезд руководства", "завершение этапа разработки" и т.д.

>> Готовность "если что" реагировать 24/4

По факту: "если что" становится постоянным (см. п.2). Будут дёргать по работе по выходным, в отпуске, рано утром и поздно ночью. Уезжая в командировку по одному проекту, будешь брать с собой ещё и материалы по другим проектам. И так из года в год.

Вакансии IT Сисадмин Тяжелый труд Юмор Ответ на пост Текст
153
5784
sayTTplz
IT-юмор

Ностальгия⁠⁠2

17 дней назад

Вакансия мечты за 250к

HH

HH

По требованию нужен одмин с прямыми руками, ничего такого - микротик, AD, виртуализация и стандартные протоколы.

Как всегда налили требований вагон, но ничего непосильного.

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

PS Чувак, если ты тут, расскажи чё как)

UPD:

Там щас онлайн 106 человек вакансию смотрят, хорош ддосить)

Показать полностью 1
[моё] Вакансии IT Сисадмин Тяжелый труд Юмор Скриншот
1291
6137
poltora.mudaka
poltora.mudaka
Типичный Сисадмин

Простой квест⁠⁠

19 дней назад
Простой квест
Показать полностью 1
Пиво Админ Сисадмин Скриншот Повтор Алкоюмор
306
1
user11011313

Товарищи, помогите настроить Kyocera m2540dn на беспроводную печать⁠⁠

23 дня назад

Индикаторов wi fi и wi fi direct нет на панели

Принтер Сисадмин Текст
14
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии