Виртуализация на базе специализированного устройства
Данные, связанные с виртуализацией, размещаются в специальном устройстве (иногда его называют виртуализатором), которое включается между хостами и подсистемами хранения.
Различают 2 типа:
Виртуализация in-band
Управляется специальным устройством, виртуализатором, через который также проходит поток данных.
1. У нас сервер приложение, которое хочет обратиться к системе хранения данных и запрасить данные у виртуализатора
2. Виртуализатор интерпретирует этот запрос и физически находит необходимые данные.
3. Далее происходит обмен сообщениями
Виртуализация out-of-band
Виртуализатор стоит в стороне от потока данных. Обрабатывает и передаёт информацию только, где находятся необходимые для сервера файлы.
1. Сервер делает запрос
2. Виртуализатор подготавливает информацию и отправляет системе хранения данных.
3. Система хранения определяет физическое положение, отдаёт их Виртуализатору
4. Виртуализатор отвечает серверу, где и как достать данные
Данные, связанные с виртуализацией, размещаются в специальном устройстве (иногда его называют виртуализатором), которое включается между хостами и подсистемами хранения.
Различают 2 типа:
Виртуализация in-band
Управляется специальным устройством, виртуализатором, через который также проходит поток данных.
1. У нас сервер приложение, которое хочет обратиться к системе хранения данных и запрасить данные у виртуализатора
2. Виртуализатор интерпретирует этот запрос и физически находит необходимые данные.
3. Далее происходит обмен сообщениями
Виртуализация out-of-band
Виртуализатор стоит в стороне от потока данных. Обрабатывает и передаёт информацию только, где находятся необходимые для сервера файлы.
1. Сервер делает запрос
2. Виртуализатор подготавливает информацию и отправляет системе хранения данных.
3. Система хранения определяет физическое положение, отдаёт их Виртуализатору
4. Виртуализатор отвечает серверу, где и как достать данные
Уровни кэша
Кэш центрального процессора разделён на несколько уровней. В универсальном процессоре в настоящее время число уровней может достигать трёх:
Первый уровень (L1) – самый быстрый, самый маленький по объему, входит в состав функциональных блоков ЦП. Обычно L1 разделён на два кэша — кэш команд и кэш данных. У каждого ядра процессора свой участок памяти
Второй уровень (L2) – больше, чем L1, раньше реализовывался в виде отдельной микросхемы. Сегодня же L2 также является частью ядра ЦП. Как и L1, L2 является памятью раздельного пользования
Третий уровень (L3) – самый большой, но самый медленный из-за того, приходится проходить все шины. Реализован в виде отдельной микросхемы. Также память L3 – общая для всех ядер. Используется для того, чтобы мы могли синхронизировать данные которые находятся на втором уровне между различными ядрами
Кэш центрального процессора разделён на несколько уровней. В универсальном процессоре в настоящее время число уровней может достигать трёх:
Первый уровень (L1) – самый быстрый, самый маленький по объему, входит в состав функциональных блоков ЦП. Обычно L1 разделён на два кэша — кэш команд и кэш данных. У каждого ядра процессора свой участок памяти
Второй уровень (L2) – больше, чем L1, раньше реализовывался в виде отдельной микросхемы. Сегодня же L2 также является частью ядра ЦП. Как и L1, L2 является памятью раздельного пользования
Третий уровень (L3) – самый большой, но самый медленный из-за того, приходится проходить все шины. Реализован в виде отдельной микросхемы. Также память L3 – общая для всех ядер. Используется для того, чтобы мы могли синхронизировать данные которые находятся на втором уровне между различными ядрами
Интерфейсы доступа к кэшу
Кольцевая шина
Является связующим компонентов процессора: ядра, кэш, системный агент (он же северный мост) и графическое ядро. Состоит из четырех организованных колец: шина данных, шина запросов, шина мониторинга и шина подтверждения. Каждое кольцо способно передавать 32 байта данных за один такт.
Mesh (сетка)
Сетчатая шина. В ней сохранены достоинства и устранены недостатки кольцевой шины. Сегодня она применяется в серверных решениях Intel
Infinity Fabric
Система передачи и контроля данных. Состоит из двух конвейеров, один для управляющих сигналов, другой для транспортировки данных. С помощью данной шины связываются несколько чиплетов (чиплет/чипсет – маленький комплекс ядер и кэшей L1, L2 и L3), ОЗУ и интерфейсы ввода/вывода
Кольцевая шина
Является связующим компонентов процессора: ядра, кэш, системный агент (он же северный мост) и графическое ядро. Состоит из четырех организованных колец: шина данных, шина запросов, шина мониторинга и шина подтверждения. Каждое кольцо способно передавать 32 байта данных за один такт.
Mesh (сетка)
Сетчатая шина. В ней сохранены достоинства и устранены недостатки кольцевой шины. Сегодня она применяется в серверных решениях Intel
Infinity Fabric
Система передачи и контроля данных. Состоит из двух конвейеров, один для управляющих сигналов, другой для транспортировки данных. С помощью данной шины связываются несколько чиплетов (чиплет/чипсет – маленький комплекс ядер и кэшей L1, L2 и L3), ОЗУ и интерфейсы ввода/вывода
NOR Flash Memory
Память NOR, названная так в честь особой разметки данных Not OR – логическое Не-ИЛИ, является высокоскоростной памятью Flash.
Память NOR предоставляет возможность высокоскоростного, случайного доступа к информации, и обладает способностью записывать и считывать данные в определенном месте без необходимости обращаться к памяти последовательно.
В отличие от NAND памяти, память NOR позволяет обращаться к данным размером до одного байта.
Технология NOR выигрывает в ситуациях, когда данные случайным образом записываются или читаются. Поэтому NOR чаще всего встраивают в сотовые телефоны (для хранения операционной системы) и планшеты, а также используется в компьютерах для хранения BIOS.
Память NOR, названная так в честь особой разметки данных Not OR – логическое Не-ИЛИ, является высокоскоростной памятью Flash.
Память NOR предоставляет возможность высокоскоростного, случайного доступа к информации, и обладает способностью записывать и считывать данные в определенном месте без необходимости обращаться к памяти последовательно.
В отличие от NAND памяти, память NOR позволяет обращаться к данным размером до одного байта.
Технология NOR выигрывает в ситуациях, когда данные случайным образом записываются или читаются. Поэтому NOR чаще всего встраивают в сотовые телефоны (для хранения операционной системы) и планшеты, а также используется в компьютерах для хранения BIOS.
Файловая виртуализация
В средах NAS каждое устройство представляется для пользователя в виде отдельного накопителя. Первоначально это было достаточно разумным решением. Но с ростом компаний неизбежно приходит время, когда емкости одного NAS становится недостаточно и файлы располагаются уже на нескольких NAS.
Многие предприятия используют для этого распределенные файловые системы, работающие на нескольких NAS-устройствах. Существуют две реализации схемы:
Пространство глобальных имен: в данном случае глобальная, или распределенная, файловая система устанавливается "поверх" нативных файловых систем NAS-устройств и предоставляет возможность монтировать их как единое устройство.
Замещающая файловая система: вместо агрегирования файловых систем отдельных NAS-устройств в единое устройство, глобальная файловая система подменяет нативные файловые системы.
В средах NAS каждое устройство представляется для пользователя в виде отдельного накопителя. Первоначально это было достаточно разумным решением. Но с ростом компаний неизбежно приходит время, когда емкости одного NAS становится недостаточно и файлы располагаются уже на нескольких NAS.
Многие предприятия используют для этого распределенные файловые системы, работающие на нескольких NAS-устройствах. Существуют две реализации схемы:
Пространство глобальных имен: в данном случае глобальная, или распределенная, файловая система устанавливается "поверх" нативных файловых систем NAS-устройств и предоставляет возможность монтировать их как единое устройство.
Замещающая файловая система: вместо агрегирования файловых систем отдельных NAS-устройств в единое устройство, глобальная файловая система подменяет нативные файловые системы.
NAND Flash Memory
NAND память была изобретена после NOR, и также названа в честь особой разметки данных Not AND – логическое Не-И.
NAND память записывает и считывает данные с высокой скоростью, в режиме последовательного чтения, упорядочивая данные в небольшие блоки (страницы).
Память NAND может считывать и записывать информацию постранично, однако не может обращаться к конкретному байту, как NOR.
NAND обычно используют в твердотельных накопителях (SSD), аудио и видео проигрывателях, телевизионных приставках, цифровых камеры, мобильных телефонах (для хранения пользовательской информации) и других устройствах, в которых данные, как правило, записываются последовательно.
NAND память была изобретена после NOR, и также названа в честь особой разметки данных Not AND – логическое Не-И.
NAND память записывает и считывает данные с высокой скоростью, в режиме последовательного чтения, упорядочивая данные в небольшие блоки (страницы).
Память NAND может считывать и записывать информацию постранично, однако не может обращаться к конкретному байту, как NOR.
NAND обычно используют в твердотельных накопителях (SSD), аудио и видео проигрывателях, телевизионных приставках, цифровых камеры, мобильных телефонах (для хранения пользовательской информации) и других устройствах, в которых данные, как правило, записываются последовательно.
В чём уникальность языка программирования LISP
1. Условные конструкции
If/then/else впервые появились именно в языке Lisp.
2. Функции
В этом языке функции находятся на том же уровне, что и строки или числа.
3. Рекурсия
Несмотря на то, что она была известна гораздо раньше появления Lisp, впервые она была реализована именно в нём.
4. Переосмысление переменных
Все переменные представляют собой указатели.
5. Сборка мусора
Механизм эффективного автоматического контроля памяти, который стирает из неё ненужные объекты, впервые появился именно в Lisp-е.
6. Вся программа построена на основе выражений
Стандартная Lisp-программа представляет собой деревья выражений, которые могут возвращать конкретные значения.
1. Условные конструкции
If/then/else впервые появились именно в языке Lisp.
2. Функции
В этом языке функции находятся на том же уровне, что и строки или числа.
3. Рекурсия
Несмотря на то, что она была известна гораздо раньше появления Lisp, впервые она была реализована именно в нём.
4. Переосмысление переменных
Все переменные представляют собой указатели.
5. Сборка мусора
Механизм эффективного автоматического контроля памяти, который стирает из неё ненужные объекты, впервые появился именно в Lisp-е.
6. Вся программа построена на основе выражений
Стандартная Lisp-программа представляет собой деревья выражений, которые могут возвращать конкретные значения.
Кодирование
Представление данных в каком-то виде, с которым удобно работать человеку или компьютеру.
Кодирование нужно для того, чтобы все, кто хочет, могли получать, передавать и работать с данными так, как им хочется. Благодаря кодированию мы можем обмениваться данными между собой — мы просто кодируем их в понятном для всех виде.
Для примера возьмём букву «б». Её можно произнести как звук — это значит, что мы закодировали эту букву в виде звуковой волны. Также эту букву можно написать прописью или в печатном виде. Всё это примеры кодирования буквы «б», удобные для человека.
В компьютере буква «б» кодируется по-разному, в зависимости от выбранной кодировки внутри ОС.
Кодирование — это то, как удобнее воспринимать информацию тем, кто ей пользуется.
Представление данных в каком-то виде, с которым удобно работать человеку или компьютеру.
Кодирование нужно для того, чтобы все, кто хочет, могли получать, передавать и работать с данными так, как им хочется. Благодаря кодированию мы можем обмениваться данными между собой — мы просто кодируем их в понятном для всех виде.
Для примера возьмём букву «б». Её можно произнести как звук — это значит, что мы закодировали эту букву в виде звуковой волны. Также эту букву можно написать прописью или в печатном виде. Всё это примеры кодирования буквы «б», удобные для человека.
В компьютере буква «б» кодируется по-разному, в зависимости от выбранной кодировки внутри ОС.
Кодирование — это то, как удобнее воспринимать информацию тем, кто ей пользуется.
Разница между шифрованием и кодированием
Если кодирование нужно, чтобы сделать информацию понятной для всех, то шифрование работает наоборот — прячет данные от всех, у кого нет ключа расшифровки.
Задача шифрования — превратить данные, которые могут прочитать все, в данные, которые может прочитать только тот, у кого есть специальное знание (ключ безопасности, сертификат, пароль или расшифровочная матрица). Если пароля нет, то данные внешне представляют из себя полную бессмыслицу.
Шифрование используют:
⁃ госорганы, чтобы защитить персональные данные граждан;
⁃ банки, чтобы хранить информацию о клиентах и о переводах денег;
⁃ мессенджеры, чтобы защитить переписку;
⁃ сайты;
⁃ мобильные приложения;
⁃ и всё остальное, что связано с безопасностью или тайнами.
Если кодирование нужно, чтобы сделать информацию понятной для всех, то шифрование работает наоборот — прячет данные от всех, у кого нет ключа расшифровки.
Задача шифрования — превратить данные, которые могут прочитать все, в данные, которые может прочитать только тот, у кого есть специальное знание (ключ безопасности, сертификат, пароль или расшифровочная матрица). Если пароля нет, то данные внешне представляют из себя полную бессмыслицу.
Шифрование используют:
⁃ госорганы, чтобы защитить персональные данные граждан;
⁃ банки, чтобы хранить информацию о клиентах и о переводах денег;
⁃ мессенджеры, чтобы защитить переписку;
⁃ сайты;
⁃ мобильные приложения;
⁃ и всё остальное, что связано с безопасностью или тайнами.
Что такое low-code?
Лоу-код — это почти такая же зерокодовая платформа для программирования, но где можно в любой момент зайти в код и дописать что-то своё.
При этом лоу-код необязательно будет таким же лёгким, как и конструктор. Слово low означает, что его нужно будет написать не очень много, но сам код может быть на любом языке.
Кратко:
⁃ Это приложения на базе zero-code, в которых можно что-то дописать вручную.
⁃ Это нужно, чтобы расширить возможности конструкторов zero-code.
⁃ Дописанный код при этом необязательно будет простым. Он бывает вполне взрослым и сложным.
⁃ Если вы можете написать low-code, вероятно, вы сможете написать всё приложение с нуля.
Лоу-код — это почти такая же зерокодовая платформа для программирования, но где можно в любой момент зайти в код и дописать что-то своё.
При этом лоу-код необязательно будет таким же лёгким, как и конструктор. Слово low означает, что его нужно будет написать не очень много, но сам код может быть на любом языке.
Кратко:
⁃ Это приложения на базе zero-code, в которых можно что-то дописать вручную.
⁃ Это нужно, чтобы расширить возможности конструкторов zero-code.
⁃ Дописанный код при этом необязательно будет простым. Он бывает вполне взрослым и сложным.
⁃ Если вы можете написать low-code, вероятно, вы сможете написать всё приложение с нуля.
Зачем нужны указатели?
Указатели нужны для того, чтобы можно было напрямую работать с оперативной памятью.
Указатели позволяют экономить выделение памяти: когда в функцию вместо переменной передаётся указатель, компьютер не создаёт её локальную копию, а обращается к ней напрямую.
Второе применение указателей — динамическое управление памятью. Если нам нужно выделить в памяти некоторую область для хранения своих данных, но стандартные переменные нам не подходят, мы можем использовать указатель.
В этом случае мы помещаем в него стартовый адрес ячейки и говорим, сколько байтов после него нужно использовать и что в них положить.
Указатели нужны для того, чтобы можно было напрямую работать с оперативной памятью.
Указатели позволяют экономить выделение памяти: когда в функцию вместо переменной передаётся указатель, компьютер не создаёт её локальную копию, а обращается к ней напрямую.
Второе применение указателей — динамическое управление памятью. Если нам нужно выделить в памяти некоторую область для хранения своих данных, но стандартные переменные нам не подходят, мы можем использовать указатель.
В этом случае мы помещаем в него стартовый адрес ячейки и говорим, сколько байтов после него нужно использовать и что в них положить.
Address space layout randomization
ASLR(рандомизация размещения адресного пространства) — технология, применяемая в ОС, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур данных(образов исполняемого файла, подгружаемых библиотек, кучи и стека).
Технология ASLR создана для усложнения эксплуатации нескольких типов уязвимостей.
Например, если при помощи переполнения буфера или другим методом атакующий получит возможность передать управление по произвольному адресу, ему нужно будет угадать, по какому именно адресу расположен стек, куча или другие структуры данных, в которые можно поместить шелл-код.
Если не удастся угадать правильный адрес, приложение скорее всего аварийно завершится, тем самым лишив атакующего возможности повторной атаки и привлекая внимание системного администратора.
ASLR(рандомизация размещения адресного пространства) — технология, применяемая в ОС, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур данных(образов исполняемого файла, подгружаемых библиотек, кучи и стека).
Технология ASLR создана для усложнения эксплуатации нескольких типов уязвимостей.
Например, если при помощи переполнения буфера или другим методом атакующий получит возможность передать управление по произвольному адресу, ему нужно будет угадать, по какому именно адресу расположен стек, куча или другие структуры данных, в которые можно поместить шелл-код.
Если не удастся угадать правильный адрес, приложение скорее всего аварийно завершится, тем самым лишив атакующего возможности повторной атаки и привлекая внимание системного администратора.
Страничная память
Способ организации виртуальной памяти, при котором единицей отображения виртуальных адресов на физические является регион постоянного размера (страница).
Типичный размер страницы — 4096 байт (для некоторых архитектур — до 128 КБ)
Поддержка такого режима присутствует в большинстве 32-битных и 64-битных процессоров.
Такой режим является классическим для почти всех современных ОС, в том числе Windows и семейства UNIX.
Широкое использование такого режима началось с процессора VAX и ОС VMS с конца 70-х годов (по некоторым сведениям, первая реализация). В семействе x86 поддержка появилась с поколения 386, оно же первое 32-битное поколение.
Способ организации виртуальной памяти, при котором единицей отображения виртуальных адресов на физические является регион постоянного размера (страница).
Типичный размер страницы — 4096 байт (для некоторых архитектур — до 128 КБ)
Поддержка такого режима присутствует в большинстве 32-битных и 64-битных процессоров.
Такой режим является классическим для почти всех современных ОС, в том числе Windows и семейства UNIX.
Широкое использование такого режима началось с процессора VAX и ОС VMS с конца 70-х годов (по некоторым сведениям, первая реализация). В семействе x86 поддержка появилась с поколения 386, оно же первое 32-битное поколение.
NX bit (No-eXecute bit)
Технология, используемая в ЦП для разделения областей памяти, чтобы хранить инструкции процессора или данные. NX bit используется в обычных процессорах с архитектурой фон Неймана из соображений безопасности.
ОC с поддержкой NX bit может помечать определенные области памяти как неисполняемые. Затем процессор откажется выполнять любой код, находящийся в этих областях памяти.
Общий метод, известный как защита исполняемого пространства, также называемый Write XOR Execute, используется для предотвращения захвата компьютеров определенными типами вредоносного программного обеспечения путем вставки их кода в область хранения данных другой программы и запуска собственного кода из этого раздела (класс таких атак известен как атака переполнения буфера).
Технология, используемая в ЦП для разделения областей памяти, чтобы хранить инструкции процессора или данные. NX bit используется в обычных процессорах с архитектурой фон Неймана из соображений безопасности.
ОC с поддержкой NX bit может помечать определенные области памяти как неисполняемые. Затем процессор откажется выполнять любой код, находящийся в этих областях памяти.
Общий метод, известный как защита исполняемого пространства, также называемый Write XOR Execute, используется для предотвращения захвата компьютеров определенными типами вредоносного программного обеспечения путем вставки их кода в область хранения данных другой программы и запуска собственного кода из этого раздела (класс таких атак известен как атака переполнения буфера).
Задачи, которые решает страничная память
⁃ Поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса
⁃ Поддержка изоляции области ядра от кода пользовательского режима
⁃ Поддержка памяти «только для чтения» и неисполняемой памяти
⁃ Поддержка отгрузки давно не используемых страниц в область подкачки на диске
⁃ Поддержка отображённых в память файлов, в том числе загрузочных модулей
⁃ Поддержка разделяемой между процессами памяти, в том числе с копированием-по-записи для экономии физических страниц
⁃ Поддержка системного вызова fork() в ОС семейства UNIX
⁃ Уменьшение внешней фрагментации – использование блоков фиксированного размера в виртуальной и физической памяти, все запросы на выделение памяти будут кратны, не будет оставаться некратных зон.
⁃ Поддержка изоляции процессов и защиты памяти путём создания своего собственного виртуального адресного пространства для каждого процесса
⁃ Поддержка изоляции области ядра от кода пользовательского режима
⁃ Поддержка памяти «только для чтения» и неисполняемой памяти
⁃ Поддержка отгрузки давно не используемых страниц в область подкачки на диске
⁃ Поддержка отображённых в память файлов, в том числе загрузочных модулей
⁃ Поддержка разделяемой между процессами памяти, в том числе с копированием-по-записи для экономии физических страниц
⁃ Поддержка системного вызова fork() в ОС семейства UNIX
⁃ Уменьшение внешней фрагментации – использование блоков фиксированного размера в виртуальной и физической памяти, все запросы на выделение памяти будут кратны, не будет оставаться некратных зон.
Защита памяти
Способ управления правами доступа к отдельным регионам памяти.
Используется большинством многозадачных ОС. Основной целью защиты памяти является запрет доступа процессу к той памяти, которая не выделена для этого процесса.
Такие запреты повышают надёжность работы как программ, так и ОС, так как ошибка в одной программе не может повлиять непосредственно на память других приложений.
Методы защиты памяти:
⁃ Сегментирование памяти
⁃ Страничная память
⁃ Механизм ключей защиты
⁃ Адресация основанная на Capability
Способ управления правами доступа к отдельным регионам памяти.
Используется большинством многозадачных ОС. Основной целью защиты памяти является запрет доступа процессу к той памяти, которая не выделена для этого процесса.
Такие запреты повышают надёжность работы как программ, так и ОС, так как ошибка в одной программе не может повлиять непосредственно на память других приложений.
Методы защиты памяти:
⁃ Сегментирование памяти
⁃ Страничная память
⁃ Механизм ключей защиты
⁃ Адресация основанная на Capability
Как работает автоматический сборщик мусора
Автоматический сборщик сам ходит по программе во время исполнения и аккуратно подчищает память, как только находит мусор.
Вроде все хорошо, но он тоже работает неидеально:
⁃ он удаляет только те переменные, в которых он уверен стопроцентно. Если есть один шанс, что переменная может когда-нибудь понадобиться, — её оставляют в памяти.
⁃ это отдельная программа, которая работает вместе с основной. И ей тоже нужны ресурсы и процессорное время. Это замедляет работу основной программы.
⁃ если рабочей памяти очень мало, то сборщик будет работать постоянно. Но ему тоже нужна своя память для работы. И может оказаться так, что без сборщика программа будет работать эффективнее.
Автоматический сборщик сам ходит по программе во время исполнения и аккуратно подчищает память, как только находит мусор.
Вроде все хорошо, но он тоже работает неидеально:
⁃ он удаляет только те переменные, в которых он уверен стопроцентно. Если есть один шанс, что переменная может когда-нибудь понадобиться, — её оставляют в памяти.
⁃ это отдельная программа, которая работает вместе с основной. И ей тоже нужны ресурсы и процессорное время. Это замедляет работу основной программы.
⁃ если рабочей памяти очень мало, то сборщик будет работать постоянно. Но ему тоже нужна своя память для работы. И может оказаться так, что без сборщика программа будет работать эффективнее.
Область видимости переменных
Каждая переменная имеет определенную область видимости. Область видимости представляет участок программы, в рамках которого можно использовать переменную.
Переменные бывают:
Глобальными: определены в файле программы вне любой из функций и могут использоваться любой функцией.
Локальными или автоматическими: определяются внутри блока кода (например, внутри функции) и существуют только в рамках этого блока. При входе в блок для этих переменных выделяется память, а после завершения работы этого блока, выделенная память освобождается, а объекты удаляются.
Кроме глобальных и автоматических есть особый тип переменных - статические переменные.
Они определяются на уровне функций с помощью ключевого слово и инициализируются только один раз, а при последующих вызовах функции используется старое значение статической переменной.
Каждая переменная имеет определенную область видимости. Область видимости представляет участок программы, в рамках которого можно использовать переменную.
Переменные бывают:
Глобальными: определены в файле программы вне любой из функций и могут использоваться любой функцией.
Локальными или автоматическими: определяются внутри блока кода (например, внутри функции) и существуют только в рамках этого блока. При входе в блок для этих переменных выделяется память, а после завершения работы этого блока, выделенная память освобождается, а объекты удаляются.
Кроме глобальных и автоматических есть особый тип переменных - статические переменные.
Они определяются на уровне функций с помощью ключевого слово и инициализируются только один раз, а при последующих вызовах функции используется старое значение статической переменной.
Что такое замыкание?
Замыкание в программировании — одна функция возвращает как результат своей работы не переменную, а другую функцию. При этом хитрость в том, что внутренняя функция имеет доступ к переменным из внешней функции и может с ними работать в любой момент.
Чаще всего это используют, чтобы сделать переменную, которая на самом деле работает как функция.
На замыканиях строится около половины алгоритмов в функциональном программировании.
А ещё на них можно построить много разного:
⁃ изолировать логику выполнения фрагментов кода, если это не позволяют сделать встроенные возможности языка
⁃ лучше структурировать код, особенно при организации функций, которые отличаются только несколькими элементами;
⁃ реализовать инкапсуляцию в тех языках, где её нет.
Замыкание в программировании — одна функция возвращает как результат своей работы не переменную, а другую функцию. При этом хитрость в том, что внутренняя функция имеет доступ к переменным из внешней функции и может с ними работать в любой момент.
Чаще всего это используют, чтобы сделать переменную, которая на самом деле работает как функция.
На замыканиях строится около половины алгоритмов в функциональном программировании.
А ещё на них можно построить много разного:
⁃ изолировать логику выполнения фрагментов кода, если это не позволяют сделать встроенные возможности языка
⁃ лучше структурировать код, особенно при организации функций, которые отличаются только несколькими элементами;
⁃ реализовать инкапсуляцию в тех языках, где её нет.
Глобальная переменная
Это такая переменная, областью видимости которой является вся программа, если только она не перекрыта.
Механизмы взаимодействия с глобальными переменными называют механизмами доступа к глобальному окружению или состоянию. Глобальные переменные могут использоваться для взаимодействия между процедурами и функциями как альтернатива передачи аргументов и возвращения значений.
Глобальные переменные широко используются для передачи данных между секциями кода, которые не участвуют в отношениях вызовов, такие как параллельные нити исполнения или обработчики сигналов.
Без надлежащей блокировки (например, с помощью мьютекса), код, использующий глобальные переменные, не будет потокобезопасным, за исключением переменных, доступных только для чтения в защищённой области памяти.
Это такая переменная, областью видимости которой является вся программа, если только она не перекрыта.
Механизмы взаимодействия с глобальными переменными называют механизмами доступа к глобальному окружению или состоянию. Глобальные переменные могут использоваться для взаимодействия между процедурами и функциями как альтернатива передачи аргументов и возвращения значений.
Глобальные переменные широко используются для передачи данных между секциями кода, которые не участвуют в отношениях вызовов, такие как параллельные нити исполнения или обработчики сигналов.
Без надлежащей блокировки (например, с помощью мьютекса), код, использующий глобальные переменные, не будет потокобезопасным, за исключением переменных, доступных только для чтения в защищённой области памяти.
Недостатки использования глобальных переменных
Используя глобальные переменные, нужно быть очень внимательным!
Глобальная переменная может быть изменена в любой точке программы (если она не находится в защищённой памяти или объявлена как переменная только для чтения), что может повлиять на работу других частей программы.
По этой причине глобальные переменные имеют неограниченный потенциал для создания взаимных зависимостей, что приводит к усложнению программы.
Глобальные переменные также затрудняют интеграцию модулей, поскольку код, написанный ранее, может содержать глобальные переменные с теми же именами, что и во встраиваемом модуле.
Используя глобальные переменные, нужно быть очень внимательным!
Глобальная переменная может быть изменена в любой точке программы (если она не находится в защищённой памяти или объявлена как переменная только для чтения), что может повлиять на работу других частей программы.
По этой причине глобальные переменные имеют неограниченный потенциал для создания взаимных зависимостей, что приводит к усложнению программы.
Глобальные переменные также затрудняют интеграцию модулей, поскольку код, написанный ранее, может содержать глобальные переменные с теми же именами, что и во встраиваемом модуле.