Программистика
关闭频道
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
显示更多5 759
订阅者
-924 小时
-367 天
-9130 天
帖子存档
5 759
Да, что-то второй день посты не делал, обидно, но как-то увлëкся обалденной книгой: "Компьютерная графика. Рейтрейсинг и растеризация". Всем советую, может какие-то знания из неë подчеркну и напишу какой-то интересный пост из тех знаний, что получу из этой книги.
Так же обожаю книги Стивена Кинга, может конечно, это мейнстрим, но они мне очень нравятся, самая любимая это "Доктор Сон", это продолжение книги "Сияние", но при этом еë можно прочесть даже без знания первой части, потому что там есть приложения, которые рассказывают о прошлом главного героя, но, конечно, Я бы не назвал Дэна Торранса основным лицом книги, конечно, ему уделено много времени, но все-таки главный герой это девочка-подросток(если еë можно так назвать, потому что всю книгу она растëт, и она всë ещë ребёнок. Ладно на этом закончу, хотя Я много могу говорить об этом прекрасном произведении искусства. Короче, всем советую к прочтению
5 759
Виртуальная память
Операционные системы управляют распределением ограниченных аппаратных ресурсов между конкурирующими программами. Память является
управляемым ресурсом. Операционные системы используют MMU для предоставления виртуальной памяти пользовательским программам.
MMU может связывать виртуальные адреса программы с физической памятью. Но виртуальная память полезна не только для этого. Механизм отказа страницы позволяет программам думать, что у них может быть столько памяти, сколько им понадобится, даже если это превышает ее физический
объем. Что произойдет, если запрошенная память больше доступного объема? ОС перемещает содержимое страниц памяти, которые в настоящее время не нужны, в более крупное, но более медленное запоминающее устройство, чаще всего на диск. Когда программа пытается получить доступ к выгруженной памяти, ОС делает все, что ей нужно, чтобы освободить место, а затем копирует запрошенную страницу обратно. Этот процесс известен как подкачка по требованию. На схеме Виртуальная память показана система виртуальной памяти с одной выгруженной страницей.
При подкачке сильно страдает производительность системы, но это все же лучше, чем невозможность запустить программу из-за нехватки памяти. Системы виртуальной памяти используют ряд уловок, чтобы минимизировать снижение производительности. Одна из них — это алгоритм удаления наиболее давно использованных элементов (least recently used, LRU), отслеживающий доступ к страницам. Самые востребованные страницы хранятся в физической памяти, а наименее часто используемые выгружаются.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Относительная адресация
Что нужно для одновременного запуска нескольких программ?
Для начала нам понадобится программа-диспетчер, которая знает, как переключаться между программами. Мы будем называть ее операционной системой или ядром операционной системы. Чтобы отличать ОС и программы, которые она контролирует, назовем ОС системной программой, а все остальное — пользовательскими программами, или процессами. Простая ОС работает примерно так, как показано на схеме Простая операционная система
Здесь ОС использует таймер, чтобы указать, когда нужно переключаться между пользовательскими программами. Этот метод планирования называется квантованием времени, потому что он дает каждой программе отрезок времени для выполнения. Состояние или контекст пользовательской программы относится к содержимому регистров и любой памяти, которую программа использует, включая стек.
Это работает, но довольно медленно. На загрузку программы нужно время. Мы бы ускорили работу, если бы программы можно было загружать в память,
насколько позволяет пространство, и хранить их там, как показано на схеме Несколько программ в памяти. В этом примере пользовательские программы загружаются в память одна за другой. Но подождите, как это может работать? А всё довольно просто: наш компьютер-образец использовал абсолютную адресацию, это означает, что адреса в инструкциях относятся к определенным ячейкам памяти. Запустить программу, ожидающую адрес 1000, по другому адресу, например 2000, не получится.
Некоторые компьютеры решают эту проблему, добавляя индексный регистр — регистр, содержимое которого добавляется к адресам для формирования действительных адресов. Если пользовательская программа ожидает запуска по адресу 1000, ОС может передать в индексный регистр адрес 2000, прежде чем запускать ее по адресу 3000.
Еще один способ решить проблему — использование относительной адресации. Вместо того чтобы располагать адреса в инструкциях относительно 0 (начало памяти в большинстве устройств), можно помещать их относительно адресов их инструкций. В случае с относительной адресацией мы используем адрес +99, поскольку инструкция находится по адресу 1, а адрес 100 находится на расстоянии 99. Аналогично последняя инструкция — это ответвление к адресу 4, который станет ответвлением
с адресом −8 в относительной адресации. Подобные вещи кажутся кошмарными в двоичном формате, но современные языковые инструменты делают всю
арифметику за нас. Относительная адресация позволяет перемещать программу в любое место в памяти.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Процедуры, подпрограммы и функции
Многие инженеры страдают странной разновидностью лени. Если они не хотят совершать некое действие, они вложат всю свою энергию в создание того, что выполнит задачу за них, даже если для этого потребуется больше работы, чем для самого дела. Программисты хотят избежать повторного написания одного и того же фрагмента кода. На это есть веские причины, помимо лени. Например, код без повторов занимает меньше места, и, если в коде есть ошибка, ее нужно исправить только один раз.
Функция (или процедура, или подпрограмма) является основой повторного использования кода. Для вас все эти термины означают одно и то же; это просто
региональные языковые различия. Мы будем использовать понятие «функция», потому что оно больше всего похоже на то, что вы, возможно, изучали на уроках математики.
Конструкции в большинстве языков программирования похожи. Например:
def number(x):
return x*2
Этот код создает функцию number, которая принимает единственный параметр с именем x и возвращает его значение, умноженное на 2. На клавиатуре нет символа умножения (×), поэтому во многих языках программирования вместо умножения используется *.
Теперь напишем фрагмент программы, как в следующем примере:
print(number(5))
Приятная особенность функции заключается в том, что мы можем выполнять, или вызывать, функцию number несколько раз без необходимости писать ее снова. Мы можем вычислитьnumber(4) + number(6), не повторяя код возведения числа в куб. Это простой пример, но подумайте, насколько удобна эта возможность для более сложных фрагментов кода.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica5 759
Архитектура компьютера
За прошедшие годы компьютеры стали работать быстрее благодаря множеству усовершенствований. При этом они стали потреблять меньше энергии, а программировать на них стало проще. Эти улучшения привели к значительному усложнению архитектуры.
Архитектура компьютера означает расположение различных компонентов в компьютере, а не то, есть ли у него дорические или ионические колонны либо
индивидуальный оттенок бежевого, как тот, который создал американский предприниматель Стив Джобс (1955–2011) для оригинального компьютера Macintosh. За прошедшие годы было испробовано множество различных архитектур. Что-то сработало, а что-то нет.
Основные архитектурные элементы
Две наиболее распространенные архитектуры — это архитектура фон Неймана(названная в честь гениального венгеро-американского ученого Джона фон Неймана, 1903–1957) и гарвардская (названная в честь компьютера Harvard Mark I, который, конечно же, был машиной с гарвардской архитектурой). Мы уже видели все их части по отдельности; на схеме Архитектуры фон Неймана и гарвардская показано, как они организованы.
Обратите внимание, что единственное различие между ними — это способ организации памяти. При прочих равных архитектура фон Неймана немного медленнее, потому что она не может получать доступ к инструкциям и данным одновременно, поскольку использует только одну шину памяти. Гарвардская
архитектура не имеет такого ограничения, но требует дополнительного аппаратного обеспечения для второй шины памяти.
Ядра процессора
Обе архитектуры на схеме Архитектуры фон Неймана и гарвардская имеют один ЦП, который представляет собой комбинацию АЛУ, регистров и исполнительного устройства. Многопроцессорные системы с несколькими процессорами появились в 1980-х годах как способ получить более высокую производительность, чем можно было бы достичь с помощью одного процессора. Однако, как оказалось, это не так просто. Разделение одной программы так, чтобы ее можно было распараллелить для использования нескольких процессоров, — в целом до сих пор не решенная задача, хотя некоторые варианты решений иногда работают хорошо, например для определенных типов сложной математики. Тем не менее распараллеливание полезно, если запускается более одной программы одновременно. Оно весьма пригодилось на заре создания графических рабочих станций, поскольку
система X Window была настолько ресурсоемкой, что для ее запуска требовался отдельный процессор.
Уменьшение геометрических размеров процессоров снижает затраты. Микросхемы изготавливаются на кремниевых пластинах, а уменьшение размеров схем означает, что на одной пластине помещается больше микросхем. Раньше более высокая производительность достигалась за счет быстродействия процессора, что означало увеличение тактовой частоты. Но более быстрые машины требовали большей мощности, что в сочетании с меньшими геометрическими размерами давало больше тепла на единицу площади. Процессоры достигли предела мощности около 2000 года — удельную мощность невозможно было увеличить без превышения температуры плавления.
В некотором роде спасение было найдено в меньших геометрических размерах. Изменилось определение ЦП; то, что мы раньше называли ЦП, теперь называется ядром процессора. Многоядерные процессоры стали обычным явлением. Существуют даже системы с несколькими многоядерными процессорами, в основном в центрах обработки данных.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Закон де Моргана
В дополнение к посту про булеву алгебру, сегодня я вам расскажу о законе де Моргана.
В XIX веке британский математик Огастес де Морган добавил закон, применимый только к булевой алгебре, названный законом де Моргана. Этот закон гласит, что операция a И b эквивалентна операции НЕ (НЕ a ИЛИ НЕ b), как показано на схеме прикреплённой ниже: Таблица истинности закона де Моргана.
Обратите внимание, что результаты a И b во втором столбце идентичны результатам, перечисленным в последнем столбце НЕ (НЕ a ИЛИ НЕ b). Это означает, что при достаточном количестве операций НЕ можно заменить операции И операциями ИЛИ (и наоборот). Это полезно, потому что компьютеры работают с настоящими входными данными, которые они не могут контролировать. Хотя было бы неплохо, если бы входные данные всегда были представлены в виде холодно или дождь, но они часто приходят в виде НЕ холодно и НЕ дождь. Подобно двойному отрицанию в естественных языках, закон де Моргана — это инструмент, который позволяет оперировать положениями отрицательной логики в дополнение к положительной логике. На схеме, которая будет тоже прикреплена ниже: Положительная и отрицательная логика, показано решение задачи «надеть ли пальто» как для положительной, так и для отрицательной логики.
С левой стороны (положительная логика) можно принять решение, используя единственную операцию ИЛИ. С правой стороны (отрицательная логика) закон де Моргана позволяет принимать решение, используя единственную операцию И. Если бы закона де Моргана не существовало, пришлось бы реализовать случай отрицательной логики как НЕ не-холодно ИЛИ НЕ не-дождь. Хотя и это сработает, каждая операция влечет за собой затраты в стоимости и производительности, поэтому сокращение операций минимизирует затраты. Оборудование, которое выполняет операцию НЕ, стоит реальных денег, и, как вы узнаете из следующей главы, каскадные операции замедляют работу.
Закон де Моргана говорит, что наш пример эквивалентен варианту «холодно и дождь», что намного проще.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Использование символов для представления чисел
UTF-8 использует числа для представления чисел, представляющих числа, состоящие из битов, представляющих символы. Но и это еще не все! Сейчас
я собираюсь применять символы для обозначения некоторых из этих чисел. На заре межкомпьютерных коммуникаций люди хотели передавать между компьютерами нечто большее, чем просто текст; нужно было отправлять двоичные данные. Но сделать это было непросто, потому что раньше
многие значения ASCII были зарезервированы для управляющих символов и не обрабатывались последовательно между системами. Также некоторые системы поддерживали передачу только 7-битных символов.
Кодировка Quoted-Printable
Кодировка Quoted-Printable, также известная как QP-кодировка, — это механизм, позволяющий передавать 8-битные данные по пути, который поддерживает только 7-битные данные. Она был создана для вложений электронной почты. Эта кодировка позволяет представить любое 8-битное байтовое значение тремя символами: символом =, за которым следует пара шестнадцатеричных чисел, по одному для каждого полубайта. Конечно, при этом знак = получает особое значение и поэтому должен быть представлен с использованием =3D, его значения находится в таблице ASCII, которая будет представлена ниже. В кодировке Quoted-Printable есть несколько дополнительных правил. Символы табуляции и пробела должны быть представлены как =09 и =20 соответственно, если они расположены в конце строки. Длина закодированных строк не может превышать 76 символов. Знак = в конце строки — это мягкий разрыв строки, который удаляется при декодировании данных получателем.
Кодировка Base64
Хотя кодировка Quoted-Printable работает, она не очень эффективна, поскольку для представления единственного байта требуются три символа. Более эффективна кодировка Base64, и она действительно имела большое значение, когда обмен данными между компьютерами занимал гораздо больше времени, чем сегодня. Кодировка Base64 упаковывает 3 байта данных в 4 символа. 24 бита данных в трех байтах разделены на четыре 6-битных блока, каждому из которых назначается печатный символ, как показано в таблице Base 64, которая будет тоже представлена ниже. Эта кодировка преобразует каждый набор из трех байтов в четыре символа. Но при этом не гарантируется, что длина данных будет кратна трем байтам. Проблема решается с помощью символов заполнения; символ = будет добавлен в конец строки, если строка занимает только 2 байта, либо же будут добавлены символы ==, если строка займет всего 1 байт.Кодировка Base64 до сих пор часто используется для вложений электронной почты.
Кодировка URL
В одном из предыдущих разделов вы видели, что кодировка Quoted-Printable наделила особой силой символ = и что эта же кодировка включала механизм для
представления обычного символа =. Практически идентичная схема используется в URL-адресах веб-страниц. Если вы когда-нибудь рассматривали URL-адрес веб-страницы, вы могли заметить такие последовательности символов, как %26 и %2F. Они существуют потому, что определенные символы имеют особое значение в контексте URL-адреса. Но иногда нам нужно использовать эти символы как литералы — другими словами, без специальных значений. Как мы уже видели, символы представлены в виде последовательности 8-битных блоков. Каждый фрагмент может быть представлен двумя шестнадцатеричными символами, как показано на схеме, которая тоже будет представлена ниже. Кодировка URL, также известная как процентная кодировка, заменяет символ на знак %, за которым следует шестнадцатеричное представление этого символа. Например, косая черта (/) имеет особое значение в URL-адресах. Она имеет код 47 в ASCII, что равно 2F в шестнадцатеричном формате. Если нужно использовать / в URL-адресе, не учитывая его особое значение, мы заменяем его на %2F.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Графические процессоры
Сегодня я вам расскажу вкратце, как компьютер представляет графику и с помощью чего он это делает.
Графика — это раскраска картины по номерам в масштабе. Нет ничего необыч ного в том, чтобы нарисовать 8 миллионов цветных пятен и раскрашивать их 60 раз в секунду, если вам нужно получить качественное видео. Однако для этого необходимо около полумиллиарда обращений к памяти в секунду.
Работа с графикой — это специализированная задача, которая не требует всех функций универсального процессора. Ее легко можно распараллелить: рисова ние нескольких точек за раз может улучшить производительность.
Графические процессоры имеют две особенности. Во-первых, они включают большое количество простых процессоров. Во-вторых, у них гораздо более широкие шины памяти, чем у обычных процессоров, что означает, что они полу чают доступ к памяти намного быстрее.
Со временем графические процессоры приобрели более универсальные функ ции. Были продуманы варианты стандартных языков программирования для
работы с графическими процессорами — теперь они используются для опре деленных классов приложений, которым доступны все преимущества своей
архитектуры.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Булева алгебра
Подобно тому как алгебра, булева алгебра — это набор правил для работы с числами, она, изобретенная в XIX веке английским математиком Джорджем Булем, представляет собой набор правил, которые используются для работы с битами. Как и в случае с обычной алгеброй, в булевой алгебре применяются правила ассоциативности, коммутативности и дистрибутивности.
Существуют три основные логические операции НЕ, И и ИЛИ, а также одна составная операция — исключающее ИЛИ:
НЕ (NOT) — эта операция означает «противоположность». Например, если бит ложный, НЕ этот бит будет истинным. Если бит истинен, НЕ этот бит будет ложным.
И (AND) — в этой операции задействовано 2 бита или более. В 2-битной операции результат будет истинным, только если И первый, И второй бит истинны. Если задействовано более 2 бит, результат будет истинным только в том случае, если все биты истинны.
ИЛИ (OR) — эта операция также включает 2 бита или более. В 2-битной операции результат будет истинным, если первый ИЛИ второй бит истинен; в противном случае результат будет ложным. Если бит больше, чем 2, результат будет истинным, если какой-либо из битов истинен.
Исключающее ИЛИ (XOR) — Результат операции «исключающее ИЛИ» будет истинным, если первый и второй биты имеют разные значения.
Ниже прикреплю таблицы истинности всех этих операций.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
5 759
Библиотеки, исполняемые файлы и динамически компонуемые библиотеки
Когда файл компилируется, полученный машинный код помещается в объектный файл (с расширением .obj в Windows или .o в операционных системах на основе UNIX). Машинный код в объектном файле:
перемещаемый — это означает, что адреса памяти, в которых находится код, еще не определены;
несвязанный — это означает, что любые внешние ссылки на функции и глобальные данные, которые определены вне единицы компиляции, еще не были связаны. Объектные файлы могут быть собраны в группы, называемые библиотеками.
Библиотека — это просто архив, очень похожий на файл ZIP или TAR, содержащий ноль или более объектных файлов. Библиотеки существуют просто для удобства, позволяя собирать большое количество объектных файлов в один простой в использовании файл.
Объектные файлы и библиотеки связываются (линкуются) в исполняемый файл компоновщиком. Исполняемый файл содержит полностью разрешенный машинный код, который может быть загружен и запущен операционной системой. Работа компоновщика заключается в следующем:
рассчитать окончательные относительные адреса всего машинного кода, который будет отображаться в памяти при запуске программы;
убедиться, что все внешние ссылки на функции и глобальные данные, определенные в каждой единице компиляции (объектном файле), правильно разрешены. Важно помнить, что машинный код в исполняемом файле все еще можно перемещать, а это означает, что адреса всех инструкций и данных в файле по-прежнему относятся к относительному, а не к абсолютному базовому адресу. Окончательный
абсолютный базовый адрес программы неизвестен до тех пор, пока она не будет загружена в память непосредственно перед запуском.
Динамически подключаемая библиотека (dynamic link library, DLL) — это особая библиотека, которая представляет собой гибрид между обычной статической
библиотекой и исполняемым файлом. DLL действует как библиотека, поскольку
содержит функции, которые могут быть вызваны любым количеством различных
исполняемых файлов. В то же время DLL действует и как исполняемый файл, потому что она может загружаться операционной системой независимо и содержит
код запуска и завершения работы, работающий так же, как функция main() в исполняемом файле C++.
Исполняемые файлы, использующие DLL, содержат частично связанный машинный код. Большинство ссылок на функции и данные полностью разрешены
в окончательном исполняемом файле, но любые ссылки на внешние функции или данные, которые существуют в DLL, остаются несвязанными. Когда исполняемый файл запускается, операционная система разрешает адреса всех несвязанных функций, находя соответствующие библиотеки DLL, загружая их в память, если они еще не загружены, и исправляя необходимые адреса в памяти. Динамически
подключаемые библиотеки — очень полезная функция операционной системы,
поскольку отдельные библиотеки DLL могут быть обновлены без изменения исполняемых файлов, которые их используют.
Спасибо за внимание, ставьте реакции, если понравился пост🔥
@programistica
