- •Расшифруйте понятия “протокол”, “интерфейс”. В чем разница между ними? какие основные виды интерфейсов существуют у компьютерных программ согласно стандарта posix? опишите их.
- •Что такое ядро ос? какие особенности его работы по сравнению с другими программами? какие архитектуры ос по реализации ядра бывают? в чем их преимущества и недостатки?
- •Что такое виртуальная машина? для каких целей она может служить? какие типа виртуальных машин бывают? приведите примеры виртуальных машин и их ключевые характеристики.
- •Какие принципиальные отличия языка ассемблера от высокоуровневых языков программирования? что такое байткод? в чем разнца между языком ассемблера и байткодом?
- •Приведите примеры форматов исполняемых файлов и кратко охарактеризуйте их. Подробно формат elf.
- •Перечислите этапы загрузки компьютера от включения питания до активизации gui или cli ос. Охарактеризуйте роль каждого из них.
- •Что такое процесс ос? чем он отличается от программы? что такое нить? какие есть подходы к созданию многонитевых (многопоточных программ)? что такой фибр, в чем его отличие от нити?
- •Опишите жизненный цикл процесса. Назовите требования к алгоритмам планирования процессов.
- •Перечислите основные алгоритмы планирования процессов. Сформулируйте и охарактеризуйте алгоритм “очередь” (fifo). Приведите простой пример. В каких системах он может применяться на практике?
- •Назовите и кратко опишите существующие способы синхронизации многопоточных приложений.
- •Что такое критическая область процесса? что такое тупик? какие виды тупиков бывают? назовите принципы разработки многопоточных программ, которые позволят избежать для них попадания в тупики.
- •Что представляет из себя примитив синхронизации “семафор”? опишите его интерфейс (набор операций) и приведите простой пример использования.
- •Что представляет из себя примитив синхронизации “монитор”? опишите его интерфейс (набор операций) и приведите простой пример использования.
- •Что такое оптимистическое и пессимистическое блокирование? в каких случаях какое предпочтительнее? какие еще виды блокирования вы знаете?
- •Что такое программная транзакционная память (stm)? какие качества имеют программы, которые ее используют?
- •Что такое конвейер (pipe)? что такое именованный конвейер? охарактеризуйте их. Как эти объекты можно использовать для взаимодействия программ (приведите несколько примеров)?
- •Что такое фрагментация? какие виды фрагментации бывают? какие виды фрагментации проявляются в каждой из 3 основных схем размещения файлов?
- •Нарисуйте обобщенную структуру программы в памяти. Каким образом на нее может повлиять использование сегментной модели виртуальной памяти?
- •Опишите страничную и сегментную организацию виртуальной памяти. В чем преимущества и недостатки каждой из них?
- •Какая главная проблема эффективной реализации систем виртуальной памяти? назовите несколько способов ее решения?
- •Сформулируйте алгоритм выбора кандидата на удаление из кэша “часы”. Опишите его работу на простом примере. В чем его преимущества и недостатки?
- •31. Алгоритм lru
- •32. Алгоритм «второй шанс»
- •33. Алгоритм старения (aging) – программная реализация lru.
- •34. Копированием при записи (copy-on-write) и изменением на месте (in-place modification)
- •35. Способы учета свободного места на диске
- •36. Непрерывный метод
- •37. Метод распределения блоков в виде связного списка
- •39. Журналируемая файловая система
- •40. Перечислите и кратко охарактеризуйте принципы, на которых должны строится безопасные системы.
- •41. Охарактеризуйте подходы к учету прав доступа на основе списков контроля доступа (acl) и способностей (capabilities). В чем преимущества и недостатки каждого из них?
- •42. В чем основные проблемы реализации системы безопасности на основе способностей (capabilities)? в каких случаях они проявляются? какие пути их решения существуют?
- •43. Опишите socket api ос. В чем его особенности, сильные и слабые стороны?
- •44. Опишите технологию удаленного вызова процедур (rpc). Сравните 2 подхода к передаче данных в ней. Какие уровни интернет-стека участвуют в организации распределенного взаимодействия в ней?
-
Какие принципиальные отличия языка ассемблера от высокоуровневых языков программирования? что такое байткод? в чем разнца между языком ассемблера и байткодом?
Язы́к ассе́мблера (в отечественных источниках, также автокод) — язык программирования низкого уровня, мнемонические команды которого (за редким исключением) соответствуют инструкциям процессора вычислительной системы. Трансляция программы в исполняемый машинный код производится ассемблером (от англ. assembler - сборщик) - программой-транслятором, которая и дала языку ассемблера его название.
Команды языка ассемблера один к одному соответствуют командам процессора, фактически, они представляют собой более удобную для человека символьную форму записи (мнемокод) команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько команд процессора.[1]
Кроме того, язык ассемблера позволяет использовать символические метки вместо адресов ячеек памяти, которые при ассемблировании заменяются на автоматически рассчитываемые абсолютные или относительные адреса, а также так называемые директивы (команды, не переводящиеся в процессорные инструкции, а выполняемые самим ассемблером).
Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макроопределения с параметрами.
Каждая модель (или семейство) процессоров имеет свой набор команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы — Intel-синтаксис и AT&T-синтаксис.
Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Forth, Lisp, Эль-76); фактически, в них он является языком ассемблера.
Основное отличие ассемблера от языков высокого уровня—
Байт-код или байтко́д (англ. byte-code), иногда также используется термин псевдоко́д — машинно-независимый код низкого уровня, генерируемый транслятором и исполняемый интерпретатором. Большинство инструкций байт-кода эквивалентны одной или нескольким командам ассемблера. Трансляция в байт-код занимает промежуточное положение между компиляцией в машинный код и интерпретацией.
Основное отличие байткода от ассемблера: байткод платформенно независим, код на ассемблере пишется под конкретную архитектуру.
-
Приведите примеры форматов исполняемых файлов и кратко охарактеризуйте их. Подробно формат elf.
.СOM
Расширение файла .COM (англ. command) использовалось в некоторых компьютерных системах в различных целях.
В системах DOS и в 8-битной CP/M, файл COM — простой тип исполняемого файла, размер которого не может превышать 64 Кбайт-256 байт (65280 = 216 − 28 байт). COM-файлы для DOS можно выполнять также на эмуляторах, например в среде Windows.
Следует отметить, что тип исполняемого файла DOS (COM или EXE) распознаётся при запуске автоматически, независимо от расширения.
.EXE (сокр. англ. executable — исполнимый) — расширение исполнимого файла, применяемое в системах DOS, Microsoft Windows, Symbian, OS/2, и в некоторых других. Кроме объектного кода, может содержать различные метаданные (значок, цифровую подпись[1]).
a.out (от англ. assembler output) — формат запускаемых файлов в некоторых (старых) версиях UNIX.
Формат исполняемого файла a.out преимущественно используется в Linux. Раcширенная версия этого формата a.outb используется группой BSD-совместимых операционных систем (NetBSD, FreeBSD и OpenBSD). Компилятор NASM может генерировать файлы обоих форматов, если указать ключ -f aout для Linux или -f aoutb для BSD.
Компилятор GCC по умолчанию выдаёт файл a.out, если не используется опция -o[1].
ELF (англ. Executable and Linkable Format — формат исполняемых и компонуемых файлов) — формат файлов, используемый во многих UNIX-подобных операционных системах, например, в GNU/Linux и Solaris, а также после некоторой модификации ПО — в некоторых мобильных телефонах компаний Siemens, Sony Ericsson, Motorola (платформа P2K) и во многих цифровых фотовидеокамерах (Olympus, Rekam и проч.).
Каждый файл формата ELF имеет специальный заголовок, в котором, в частности, указан адрес точки входа (стартовый адрес) программы.
Поля этого заголовка использует загрузчик (ELF interpreter) для загрузки программы в оперативную память перед исполнением.
Файлы ELF имеют два типа разбиений. Программный заголовок (program header) соответствует сегментам, которые будут использованы при исполнении. Заголовок секций (section header) перечисляет секции исполняемого файла.
Каждый ELF файл состоит из одного заголовка ELF, за которым следуют данные. Файлы могут включать в себя
Таблицу Program Header, описывающую ноль или более сегментов
Таблицу Section Header, описывающую ноль или более секций
Данные, упомянутые в записях названных таблиц
Сегменты содержат данные, необходимые для исполнения файла, а секции содержат информацию для линковки и обработку relocatin. Каждый байт в файле может относится к не более чем к одной секции.
MZ — стандартный формат 16-битных исполняемых файлов с расширением .EXE для DOS. Файлы .EXE и .DLL для Windows начинаются с заглушки в формате MZ, которая при попытке запустить файл в DOS выводит сообщение This program cannot be run in DOS mode. («Эту программу невозможно запустить в режиме DOS»).
В отличие от .COM, файлы .EXE для DOS включает метаданные, могут иметь размер больше 64 Кбайт, могут использовать несколько сегментов и могут использовать любой 16-битный адрес (то есть не только 0x100, как .COM) как точку входа в программу. В начале настоящего .EXE-файла всегда находятся два байта 0x4D 0x5A (символы ASCII M и Z). Если при попытке запуска файла с расширением .EXE такие байты не обнаруживаются, то файл интерпретируется как .COM. Эта сигнатура — инициалы Марка Збиковски (Mark Zbikowski) — одного из создателей операционной системы MS-DOS[1].
New Executable — «Новый исполняемый» — формат EXE-файлов, используемый в старых версиях Windows, таких, как Windows 3.1.
Для совместимости со старыми DOS-программами, оставлен MZ-заголовок, поля которого указывают на параметры запуска STUB. STUB — тело DOS-программы, выполняемой в случае запуска из командной строки MS-DOS (не Windows). В Windows-программах не делает ничего особого. Обычно выводит сообщение «This program requires Misrosoft Windows» или «This program cannot be run in DOS mode».
По адресу 0x003C располагается адрес заголовка NE.
Portable Executable — (PE, произносится как [по́тэбл экзэкью́тэбл] — переносимый исполняемый) — формат исполняемых файлов, объектного кода и динамических библиотек, используемый в 32- и 64-битных версиях операционной системы Microsoft Windows. Формат PE представляет собой структуру данных, содержащую всю информацию, необходимую PE загрузчику для проецирования файла в память.
-
ИЗ КАКИХ ЭТАПОВ СОСТОИТ СОЗДАНИЕ ИСПОЛНЯЕМОЙ ПРОГРАММЫ ИЗ ИСХОДНОГО КОДА? ОПИШИТЕ ИХ СУТЬ. ДЛЯ ЯЗЫКОВ C++, JAVA И PYTHON ПЕРЕЧИСЛИТЕ ЭТАПЫ СОЗДАНИЯ ПРОГРАММЫ, КОТОРЫЕ ИМЕЮТ МЕСТО В РЕАЛЬНОСТИ И УКАЖИТЕ, В КАКОЕ ВРЕМЯ ОНИ ПРОИСХОДЯТ. ДЛЯ КАКИХ СРЕД ИСПОЛНЕНИЯ МОЖЕТ СОЗДАВАТЬСЯ ПРОГРАММА?
Четыре этапа компиляции С++
Чтобы понять, как происходит компиляция (для решения возможных проблем), вы должны знать о её четырёх этапах. Задание заключается в постепенном преобразовании текстового файла, написанного на понятном для квалифицированного человека языке (т.е.на языке C), в язык, понятный для машины (или, в некоторых случаях, для чрезвычайно квалифицированного человека). gcc одну за другой выполняет четыре программы, каждая из которых делает один этап:
cpp: Первый этап заключается в замене директив (препроцессоры) чистыми инструкциями C. Обычно это означает вставку заголовка (#include) или определение макрокоманд (#define). В конце этого этапа генерируется чистый код C.
cc1: Этот этап заключается в преобразовании кода C в код языка ассемблера. Сгенерированный код зависит от архитектуры, для которой он предназначен.
as: Этот этап заключается в генерации объектного кода (или бинарного кода) из кода на языке ассемблера. В конце этого этапа генерируется файл с расширением .o.
ld: На последнем этапе (компоновке) устанавливаются связи между всеми объектными файлами (.o) и их библиотеками и результатеполучается исполняемый файл.
Для Java и Python свойственна интерпретация(динамическая): т.е. сначала генерируется промежуточный код(байткод), а затем во время исполнения байт-код транслируется в машинные коды
По мере увеличения ресурсов компьютеров и расширения гетерогенных сетей (в том числе Интернета), связывающих компьютеры разных типов и архитектур, выделился новый вид интерпретации, при котором исходный (или промежуточный) код компилируется в машинный код непосредственно во время исполнения, «на лету». Уже скомпилированные участки кода кэшируются, чтобы при повторном обращении к ним они сразу получали управление, без перекомпиляции. Этот подход получил название динамической компиляции.
Достоинством динамической компиляции является то, что скорость интерпретации программ становится сравнимой со скоростью исполнения программ в обычных компилируемых языках, при этом сама программа хранится и распространяется в единственном виде, независимом от целевых платформ. Недостатком является бо́льшая сложность реализации и бо́льшие требования к ресурсам, чем в случае простых компиляторов или чистых интерпретаторов.
Этот метод хорошо подходит для веб-приложений. Соответственно, динамическая компиляция появилась и поддерживается в той или иной мере в реализациях Java, Microsoft .NET, Perl, Python.