Telegram Web
Когда следует использовать язык ассемблера

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

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

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

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

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

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

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

 2. Легче отлаживать
Многие согласятся, что эта причина очень важна. Рекурсия проста в отладке из-за того, что она не содержит сложных и длинных конструкций.

Минусы:
 3. Занимают много места
Занимают значительный объем памяти во время своего выполнения. При каждом вызове функции в стек будет добавляться новый элемент, который будет занимать место до тех пор, пока функция не завершит работу.
Что такое хеш-таблицы?

Хеш-таблица — это контейнер для хранения пар ключей и их значений. По сути это ассоциативный массив, в котором ключ представлен в виде хеш-функции. Главное свойство hash-таблиц — три операции: вставка, поиск и удаление — в среднем выполняются за время O(1),

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

Выполнение операции в хеш-таблице начинается с вычисления хеш-функции от ключа. 
Именно с ее помощью мы находим индекс, зная который, можно выполнить требующую операцию.
«Битый сектор» или «бэд сектор»

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

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

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

Такие поврежденные механически сектора и называются битыми секторами. В них уже невозможно хранить данные и те данные, которые были в них записаны ранее, с большей долей вероятности восстановить не получится.
О-большое (Big O)

Нотация О-большое описывает скорость работы алгоритма в худшем случае.

Предположим вы используете простой поиск для поиска фамилии телефоном справочнике. Вы знаете, что простой поиск выполняется за время O(n) - то есть в худшем случае вам придется пересмотреть все фамилии в справочнике, но представим, что наша искомая фамилия начинается с «А» и находится в самом начале справочника. Следовательно, мы нашли нужную фамилию с первой попытки. Отработал ли алгоритм за время O(n)? А может, он занял время O(1)?

Простой поиск все равно выполняется за время O(n). Просто в данном случае вы нашли нужное значение моментально — это лучший возможный случай.
Суть кэширования процессора 

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

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

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

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

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

В оперативной памяти каждый набор ячеек (байт) имеет свой адрес, по которому процессор может к нему обращаться.

Из-за того, что каждый байт имеет свой отдельный адрес, такой вид адресации называется — байтовый.

Но существуют компьютеры, у которых размер одной ячейки памяти равняется машинному слову — это максимальное кол-во бит, которыми может оперировать процессор за раз. То есть в 32-х разрядных процессорах размер регистров и размер машинного слова будет равен 32 бита, а в 64-х — 64 бита и тд (такие компьютеры предназначены для научных целей). Из-за того, что процессор обращается не к байту, а к слову, то такая адресация называется словесной адресацией.
Реляционная модель Баз Данных.

Элементы данных представлены в виде таблиц. Является наиболее распространенной моделью.

К преимуществам реляционной модели можно отнести следующие особенности:

- Теоретическая основа. Формально определяет базовые понятия модели, язык описания и операции над отношениями;
- Стандартизация. Стандарты SQL-NN (SQL-89, SQL-92, SQL-99 и т д.), имеющие несколько уровней полноты реализации, позволяют создавать приложения, переносимые между СУБД разных поставщиков;
- Полное разделение доступа к данным от способа их физической организации;
- Универсальность. Информационное моделирование сущностей реального мира в виде набора связанных таблиц является достаточно хорошим подходом в большинстве случаев;
- Простота манипуляции данными с точки зрения конечного пользователя;
SQL — развитый стандартизованный декларативный язык 4-го поколения.

Недостатки:
- В общем случае, более низкое быстродействие по сравнению с сетевыми и иерархическими СУБД или другими подходами, обеспечивающими доступ к данным непосредственно на уровне их физической организации, например, индексированные файлы;
- Неполнота реализации стандартов SQL-NN, а также специфические языковые и процедурные расширения СУБД разных поставщиков, осложняющие переносимость приложений (так называемый vendor lock);
- Необходимость учёта некоторых особенностей модели на концептуальном уровне (ключи — идентификаторы сущностей), отсутствующая, например, в сетевой модели.
Этапы процесса компиляции:

1. Предварительная проверка.
Исходная программа обрабатывается путём подстановки имеющихся макросов и заголовочных файлов.

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

3. Семантический анализ.
Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д. Результат обычно называется «промежуточным представлением/кодом», и может быть дополненным деревом разбора, новым деревом, абстрактным набором команд или чем-то ещё, удобным для дальнейшей обработки.

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

5. Генерация кода.
Внутреннее представление преобразовывается в блоки команд процессора, которые преобразовываются в объектный код.

6. Сборка.
Компоновщик соединяет несколько объектных файлов в исполняемый файл или библиотеку.
Контрольные суммы 

Распространенный способ быстро и эффективно обнаружить повреждение данных в современных системах.

Для вычисления простой контрольной суммы нужно лишь сложить байты блока данных, но, конечно, придумано много более изощренных контрольных сумм, в том числе циклический избыточный код (CRC), контрольная сумма Флетчера и другие [MK09].

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

КС оцениваются по нескольким критериям. Самый важный – сила, или способность к обнаружению ошибок: приводит ли изменение данных к изменению контрольной суммы? Чем сильнее контрольная сумма, тем больше шансов, что изменение данных не останется незамеченным.
Еще один важный критерий – производительность: каковы затраты на вычисление контрольной суммы?

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

Архитектура фон Неймана — широко известный принцип совместного хранения команд и данных в памяти компьютера.

Компьютеры, построенные на этих принципах, относят к типу фоннеймановских:

 ⁃ Принцип двоичности.
Для представления данных и команд используется двоичная система счисления.

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

 ⁃ Принцип однородности памяти.
Как программы (команды), так и данные хранятся в одной и той же памяти. Над командами можно выполнять такие же действия, как и над данными.

 ⁃ Принцип адресуемости памяти.
Структурно основная память состоит из пронумерованных ячеек; процессору в произвольный момент времени доступна любая ячейка.

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

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

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

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

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

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

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

Состоит из двух частей: контроллер (управляет кэш-памятью) и саму кэш-память.

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

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

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

Большинство современных систем включает шесть уровней:
- уровень языка прикладных программистов;
- уровень ассемблера;
- уровень операционной системы;
- уровень архитектуры команд;
- микроархитектурный уровень;
- цифровой логический уровень.

Над этой иерархией языков находится прикладной программист и воплощаемый им алгоритм; под цифровым логическим уровнем - физическая элементная база.

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

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

У PPP есть два подвида — PPPoE (PPP по Ethernet) и PPPoA (PPP через асинхронный способ передачи данных — ATM).

PPP формально относится к межсетевому уровню TCP/IP, но в силу особого принципа работы, иногда выделяются в отдельную категорию. Преимущество PPP в том, что для установки соединения не требуется сетевая инфраструктура, а необходимость маршрутизаторов отпадает. Эти факторы обуславливают специфику использования PPP протоколов.
Низкоуровневое форматирование

Есть несколько этапов форматирования дисков. Самый первый этап – это низкоуровневое форматирование.

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

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

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

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

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

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

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

Если для конкретики рассмотреть архитектуру Intel x86, то это традиционно команда программного прерывания с различным вектором. Сравним, как это делают самые разнородные системы:
В MS-DOS дескриптор прерывания для системного вызова — 21h
Windows — 2Eh 
Linux — 80h 
QNX — 21h
MINIX 3 — 21h
2025/07/14 00:37:46
Back to Top
HTML Embed Code: