Как выполняется программа на компьютере

Обновлено: 07.07.2024

Данный рассказ я хочу посвятить основам главной программы на компьютере многих пользователей, а именно, операционной системе (ОС) Виндовс. Сейчас продают систему 8.1, а история насчитывает уже очень много самых разных версий. В наше время старые версии ОС уже можно посмотреть в браузере Гугл Хром, и даже немного в них поработать (смотри [1]). Но еще до появления Виндовс на самых первых персональных компьютерах устанавливалась система ДОС. Она не была многозадачной и не была графической. В то время графика очень медленно выполнялась и была примитивной, поэтому для ускорения системы использовался текст, а точнее текстовые команды ДОС, которые являлись частным случаем специального языка программирования автоматической работы на компьютере.

И этот командный способ использования операционной системы до сих пор существует во всех версиях ОС Виндовс. Для выполнения команд даже самые последние версии имеют консольное окно, очень напоминающее окно ДОС, в котором эти команды можно вводить. А выставляет это окно и исполняет команды специальная программа windows\system32\cmd.exe. Ее можно запускать непосредственно по адресу, по иконке, а можно и в Проводнике (файловом менеджере системы Виндовс) по кнопке "Открыть командную строку" в меню "Файл". Но это не удобно, потому что командную строку надо записывать руками. Есть более удобный способ, который работает во всех системах Виндовс и работал в ДОС. А именно, в системе Виндовс принято, что все файлы с расширением bat, например, "run.bat" автоматически выполняются программой windows\system32\cmd.exe, которая открывает это самое консольное окно и интерпретирует каждую строку файла как команду, которая автоматически записывается в командную строку консоли.

Этот вариант намного удобнее, потому, что файл с расширением bat можно предварительно отредактировать в любом текстовом редакторе, и файл сохраняется на винчестере, его можно копировать и многократно исполнять. В системе Юникс (Линукс) любой файл можно объявить как командный, а в системе Виндовс такое объявление происходит путем записи расширения bat. В этом смысле слова bat-файл и командный файл синонимы. Как я уже сказал, командный язык был разработан еще в ДОС, и он почти без изменений используется во всех системах Виндовс, хотя от системы к системе могут появляться новые команды. Однако старые продолжают работать.

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

В этой статье я начну постепенно рассказывать про некоторые команды ОС Виндовс. За каждой такой командой стоит специальная программа, которая выполняет ту или иную работу. Но есть и внутренние команды языка, которые указывают интерпретатору, то есть программе cmd.exe, как ей надо понимать и как выполнять команды. Такие команды разумно выучить даже раньше названий самих программ, чтобы лучше понимать написанный код. Вот с них и начнем. Работать можно где угодно, в любой папке компьютера или на рабочем столе, который тоже является специальной папкой.

Итак, сделайте следующее. Поставьте курсор мыши на рабочий стол в любом месте и кликните правую кнопку мыши. В появившемся меню выберите строку "Создать" и далее "Текстовый документ". На рабочем столе появится иконка с длинным названием и с расширением txt. Названия всех иконок можно редактировать. Для этого кликните мышкой на названии, откроется маленький редактор и перепишите все название на "run.bat" и нажмите клавишу [Enter]. Появится предупреждение, что изменение типа файла повлечет за собой изменение запускающей программы. Игнорируйте, потому что именно это нам и надо.

Итак, у вас появилась иконка нового файла с названием "run.bat". Но файл еще пустой. Теперь ставим курсор на иконку и снова нажимаем правую кнопку мыши. В меню выбираем строку "Изменить", она вторая сверху. Открывается текстовый редактор Notepad (Блокнот) c пустым окном. Набираем в нем две строки

и спасаем набранный текст в файле. Вот мы и получили первый командный файл, который фактически тоже является программой. Сразу объясню, что означает набранный текст. Команда "help" просто дает описание, точнее инструкцию как пользоваться командой, которая является ее аргументом. То есть командой "cmd" в нашем случае. Командные строки имеют такую структуру, что первое слово -- это всегда команда, которая выполняется, а другие слова после него, набранные через пробел, являются ее аргументами. Их может быть много и они могут быть разными, зависит от того, как написана программа. Вторая команда "pause" останавливает выполнение всех других команд и дает подсказку нажать любую клавишу. В ДОС было необходимо нажать только клавишу [Enter], сейчас можно любую. Но клавиша [Enter] все равно главнее всех других, ее и нажимайте.

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

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

Многие команды ОС Виндовс запускают программы, которые не только получают входные параметры из командной строки, но и просят ввести какие-то значения с клавиатуры как ответ на вопрос программы, а результаты печатают в консольное окно строку за строкой. Если данных для ввода мало, а результат записывается коротко, то и достаточно. А если нет? Тогда получается очень неудобно. Возникает проблема, которую надо решать. Решение вот такое. После всех обязательных параметров можно указать имена файлов, одно имя для файла, в котором набраны все данные, которые будут запрашиваться, и второе имя для файла, в который будет напечатан результат работы. В этом случае программа будет работать полностью автоматически. При этом перед входным именем файла надо ставить знак < (меньше), а перед выходным > (больше). На самом деле эти знаки означают стрелки, показывающие откуда и куда идет информация.

Запишите в файл "run.bat" следующий текст

help > out.txt
pause

И дважды кликните на его иконке. На этот раз в консольном окне ничего не появится, зато на вашем рабочем столе появится иконка нового файла с именем "out.txt". Этот файл создала программа help, запущенная из командного файла "run.bat". Можно посмотреть его содержание в любом текстовом редакторе, например, в Notepad. И тут нас ждет первый сюрприз. Русские буквы текста нечитабельны. В чем дело? А дело в том, что Виндовс уже давно показывает русские буквы в так называемой виндовс-кодировке, а программа help продолжает показывать русские буквы в старой, то есть в дос-кодировке. Чтобы прочитать такой файл вам необходимо воспользоваться редактором, который умеет показывать текст во всех пяти кодировках русских символов, которые сейчас существуют.

Одной из таких программ является мой собственный редактор vkNotepad.jar, который можно скачать по ссылке [2]. Раньше было много самодельных программ перекодировщиков, поскольку это очень простая операция. Чтобы узнать как решить проблему сегодня я сделал запрос в интернете. Вот одно из решений. В Блокноте (Notepad) нужно выбрать шрифт "Terminal" и как раз он показывает русский текст в дос-кодировке. Есть и другие решения, но этих достаточно. Интересно почитать текст, который напечатала программа. Она сообщила, что надо набрать на командной строке имя команды, а дальше дала список некоторых команд, которые существуют в операционной системе. И это уже неплохо.

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

Это не всегда удобно. Удобно делать наоборот, то есть записывать bat-файл в тут же папку, где находится программа. В этом случае никаких проблем не будет. Но можно указывать не только файлы с расширением exe, а и файлы с другим расширением, например, txt, что еще более удобно. Что происходит в этом случае? А вот что. Операционная система помнит таблицу, в которой написано какую программу надо запускать с каким расширением файла. И она просто выполнит эту программу, хотя сама программа явно в команде не указана.

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

c:\"Program Files (x86)"\Adobe\"Reader 11.0"\Reader\AcroRd32.exe anyfile.pdf
pause

Правда при этом система требует разрешения, но его можно дать один раз на всю работу и дальше все будет автоматически. Что здесь важно? Сам bat-файл и pdf-файл находятся в одной папке, например, на рабочем столе, а вот для программы надо указать ее полный путь. Есть очень много способов узнать полный путь программы. Он, обычно, даже запрашивается при установке программы, или сообщается в ее свойствах. Важно, что таким способом можно уже запускать любой файл с любой программой, конечно при условии, что программа способна работать с файлом, то есть его формат записи правильный для этой программы.

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

Адоб ридер -- не единственная программа, которую можно запускать таким способом. Другими важными программами являются текстовые редакторы, браузеры, видео-проигрыватели и многие другие программы. Важно, что многие программы, которые впервые появились в системе Юникс, очень удобно запускаются именно таким способом. Часто они вообще не имеют графической среды общения с пользователем. Я рассказал только самый минимум. Есть еще очень много всего интересного, но не все сразу.

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

Выполнение программ на компьютере

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

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

На смену языкам Ассемблера были разработаны языки программирования высокого уровня (ЯПВУ). Они машинно-независимы.

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

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

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

Трансляторы делятся на компиляторы и интерпретаторы.

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

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

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

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

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




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

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

image

Меня зовут Андрей Артемьев, я работаю в Microsoft над ядром ОС Windows 10, ранее я работал над Windows 10x (WCOS), XBox, Windows Phone и Microsoft Edge. Я хочу популярно в образовательных целях рассказать о том как работает компьютер на примере клавиатурного ввода и Windows 10. Данный цикл статей рассчитан в первую очередь на студентов технических специальностей. Мы рассмотрим какой путь проходит информация о нажатой клавише от клавиатуры до отображения в Notepad.exe. В виду обширности и междисциплинарности темы в статьях могут быть неточности, о которых сообщайте в комментариях. Какая-то информация может быть устаревшей в виду скорости с которой развивается Windows.

Насколько глубоко мы погрузимся в тему?

Давайте для начала в общих чертах поговорим об уровнях на которых можно рассматривать компьютер. Каждый уровень основывается на предыдущем. Начнём с самого верха.

Уровень операционной системы. ОС можно рассматривать как:

  • Менеджер ресурсов — память, жёсткие диски, принтеры, экран, клавиатура ограниченные ресурсы которые совместно используются запущенными на компьютере программами.
  • Виртуальная машина — файл это наглядный пример виртуального объекта. Он представляет абстракцию данных на диске, API для работы с ним и так же добавляет концепцию прав доступа. Вместо файла могла быть концепция контейнера данных и совершенно другого API. Таких виртуальных объектов в ОС много.
  • Платформа — ОС предоставляет программные модели и примитивы для построения программ. К примеру Windows Drivers Framework позволяет быстро разрабатывать драйвера, окна в Windows используются для построения сложных пользовательских интерфейсов. Dll — предоставляет модель расширения функционала программы через плагины, а так же механизм для реализации читалки экрана через ловушки клавиатуры (см. LowLevelKeyboard hook).

image

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

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

image

Материнскую плату можно рассматривать как колонию микросхем которые общаются между собой через шины и через них циркулируют данные от подключенных устройств к процессору и обратно. Чип-сет — это своего рода нервная система компьютера. Все чипы на материнской плате были изначально созданы чтобы работать друг с другом. Некоторые из них могут иметь особые функции, к примеру таймер или хранение настроек BIOS. Пожалуй самый важный из них тот что имеет встроенную программу (прошивку, BIOS, UEFI) которая начинает выполняться как только появляется электричество. Она находит жёсткий диск с загрузчиком Windows и передаёт тому управление который в свою очередь запускает исполняемый файл ОС, который можно назвать Windows10.exe, на самом деле NtOsKrnl.exe. BIOS знает что искать благодаря соглашению между производителями железа и операционных систем.

Вокруг материнской платы можно собрать мобильный телефон, игровую приставку, серверную станцию или умное устройство. На картинке ниже распространённые форм-факторы материнских плат.

image

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

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

image

Архитектура процессора это по сути документ который описывает какой функциональностью он должен обладать для того чтобы соответствовать к примеру архитектуре x86, x64 или ARM применяемой на мобильных устройствах. В этом документе описано какие должны поддерживаться команды, назначения регистров и логика работы. Создатели процессоров Intel, AMD, Эльбрус могут реализовывать эту функциональность как угодно и добавлять к ней новые возможности в виде команд, регистров, флагов, прерываний и если ОС знает о них то может использовать. В терминах ООП архитектура ЦПУ — это интерфейс, а микроархитектура — его реализация.

Логические схемы. Цветные прямоугольники с блок-схемы CPU состоят из логических схем, которые производят свои операции на последовательностях нулей и единиц. Процессор видит все данные и команды в виде битов (0 и 1), по формуле любое десятичное число можно представить в виде последовательности 0 и 1, а вот что значит конкретное число зависит от контекста. Это может быть код, цифра, буква. Арифметическое и логическое устройство (ALU) умеет производить сложение двух чисел через побитовые операции. Побитовые алгоритмы сложения, вычитания, умножения и деления давно известны, разработчикам логической схемы их только надо эффективно реализовать.

image

image


Уровень радиоэлементов. Физически аналоговые схемы полагаются на радиоэлементы, которые собственно и эксплуатируют законы физики. Преимущественно это полупроводники, т.е. в определённых условиях они могут проводить электричество, а могут и нет. Диод проводит ток только в одном направлении, если его выпаять, развернуть на 180 и впаять обратно, то ток через него проходить не будет. Транзистор пропускает ток только если есть напряжение на управляющей ножке. Человечество научилось делать транзисторы микроскопическими и потому их можно размещать на маленькой плате миллионами. На картинках ниже полупроводниковые радиоэлементы и обычный транзистор рядом с нано транзистором под электронным микроскопом.

image

Уровень законов физики. И наконец самый нижний уровень — это уровень законов физики которые заключены в полупроводниковые радиоэлементы.

image

Мы будем много говорить про уровень ОС и чуть меньше про архитектуру компьютера, микроархитектуру, аналоговые схемы и радиоэлементы. К последней части у вас должно быть понимание как это всё работает вместе.

Основы Операционной Системы

Когда мы проходили в универе программирование на ассемблере у многих студентов был ступор от таких умных слов как “режимы ядра и пользователя”, под которыми на самом деле скрывается хорошо всем известная ролевая система аутентификации, на всех сайтах есть как минимум “Админ” имеющий доступ ко всем страницам и “Пользователь” имеющий ограниченный доступ. Точно так же роль “Ядро” имеет доступ ко всем возможностям CPU, а роль “Пользователь” может вызывать не все команды процессора и не со всеми аргументами. Поверх этой ролевой модели по принципу клиент-серверной архитектуры построена операционная система, где сервер это ядро, которое и реализовывает функционал ОС, а клиент — это пользовательские программы. В мире Web клиент и сервер разделены физически — это два разных компьютера общающихся по сети. В ОС клиент и сервер живут на одной машине и на одном железе. У сервера есть некий API который позволяет клиентам изменять его состояние, к примеру Twitter API позволяет создавать посты, логиниться и загружать ленту твитов в мобильный клиент. У Windows есть Win API, только более громоздкий в виду более широкого круга задач, на сегодняшний день у винды примерно 330 000 API плюс API для UWP apps. Если концепции Твитера более менее всем понятны — пост, пользователь, фид — то концепции ОС могут потребовать некоторого углубления в её внутренности. Поэтому API Windows могут быть трудно понятными без понимания внутреннего устройства ОС.

На самом деле под ядром понимают три разные вещи. Ядро как весь код ОС. Ядро как подсистема которая отвечает за механизмы ОС, такие как планировщик потоков, переключение контекста, обработка прерываний, свап виртуальный памяти на физическую (Kernel) и ядро подсистемы для поддержки других ОС — CSRSS.exe (Windows), PSXSS.exe (POSIX), OS2SS.exe (OS/2) или WSL (Windows SubSystem for Linux). В данном контексте понимается первый смысл — весь код ОС.

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

  • Executive — здесь логика работы ОС. В этом слое проверяется что могут и не могут делать процессы. Здесь хранится инфа о родительском процессе, параметры старта процесса (Process Environment Block), привязанный аккаунт пользователя, имя exe файла процесса.
  • Kernel — здесь реализованы механизмы ОС, такие как планировщик потоков. Здесь хранится сколько времени процесс проводит в режиме пользователя и ядра, к каким процессорам привязаны его потоки, базовый приоритет потоков процесса.
  • Windowing subsystem — инфа о GDI объектах которые используются для рисования в окне. Это такие примитивы как кисти, pen и пр.
  • DirectX — всё что имеет отношение к DirectX: шейдеры, поверхности, DX-объекты, счётчики производительности GPU, настройки памяти графической памяти.
  • Подсистема Windows которая представлена процессом CSRSS.exe (Client Server Runtime SubSystem). Windows ранее поддерживал ОС POSIX (процесс PSXSS.exe) и OS/2 (OS2SS.exe). В те времена возникла идея сделать и Windows такой же подсистемой, но эта было медленно и поэтому скоро часть CSRSS.exe перенесли в win32k.sys, который сейчас разбит на несколько файлов — win32k.sys, win32kbase.sys и win32kfull.sys. Здесь хранится информация о Process Group Data, Shutdown level, Session Data и пр.

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

Более подробно о разделении на клиент-сервер

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

Производители оборудования сотрудничают с разработчиками ОС, поэтому в процессоре есть механизмы созданные с учётом потребностей создателей операционных систем. Во всех современных процессорах реализован механизм ролей пользователя, где под пользователем понимается исполняемый в данный момент код. В веб приложениях роль залогиненого пользователя хранится в какой-то переменной и помимо понятного названия Admin или User имеет Id этой роли который чаще и используется при авторизации, потому как сравнивать числа быстрее и проще чем строки. В процессоре роль текущего пользователя хранится в поле которое называется “кольцо безопасности” (Security Ring), а не “CurrentUser.Role.Id”. В большинстве процессоров это поле принимает четыре значения от 0 до 3. Windows использует 0 для роли которая называется “Режим Ядра”, потому как это самый привилегированный режим и самое большое значение для роли “Режим Пользователя”, потому как это самая ограниченная роль. Остальные роли не используются потому как различие между 0 и 1, 2 и 3 незначительное. Эти роли ограничивают страницы памяти которые могут быть адресованы, нельзя вызывать некоторые инструкции или же нельзя их вызывать с определёнными аргументами. Так же есть ограничения на использование технологии I/O Ports для обмена данными с устройствами такими как клавиатура, но она уже лет 10 не используется. Переключение в режим ядра происходит через команду syscall, которая по индексу находит в массиве указателей на APIs Windows функцию которую надо вызвать. Указатель на этот массив сохраняется в специальном регистре процессора во время загрузки ОС.

image

Прерывания могут генерироваться не только процессором но и внешними устройствами (клавиатура, мышь) или программным кодом. Планировщик потоков устанавливает таймер который с интервалами равными одному кванту (по умолчанию около 15мс, в Windows Server больше) генерирует прерывание чтобы по внутреннему алгоритму назначить другой поток на исполнение. Пошаговое исполнение программы в Visual Studio так же полагается на механизм прерываний — у процессора устанавливается флаг, который после каждой команды вызывает прерывание которое обрабатывает Windows Debugging Engine и уведомляет через API Visual Studio.

Разделение памятью реализовано благодаря виртуальной памяти. Ранее я говорил что ОС это менеджер ресурсов и виртуальная машина. Даже если у вас 1Гб RAM 32х битный Windows будет работать так как если бы у вас было 4Гб оперативки, т.е. реально у вас 1Гб, а виртуально 4Гб. Современные компьютеры основаны на теоретической модели машины Тьюринга или же архитектуре фон Неймана (с некоторыми изменениями). Согласно этим моделям память в компьютере это лента состоящая из ячеек размером один байт. Эти ячейки сгруппированы в страницы как правило по 4096 байт (4Кб), потому как:

image
image

64 битный адрес позволяет адресовать 16 экзабайт, это 18,446,744,073,709,551,616 ячеек памяти. Современные процессоры пока что не поддерживают так много RAM и поэтому используют только младшие 48 бит адреса, остальные 16 заполняются старшим разрядом. Поэтому Win x64 попросту не использует часть адресов, которые помечены на рисунке выше чёрным. Но это не значит, что 64х битный Windows “видит” 256 Tb оперативки. Максимум 8TB виртуальной памяти на архитектуре IA64 и 7TB на x64. Предел физической памяти поддерживаемой Windows 10 — 2TB, потому как с большим количеством Винда не тестировалась. Объём поддерживаемой RAM в Windows 10 определяется во многом редакцией ОС, чем дороже тем больше.

Почему ячейки памяти пронумерованы шестнадцатиричными (HEX) числами, а не десятичными или двоичными? Адрес ячейки это не просто порядковый номер, в нём закодировано три числа по которым эту ячейку можно отобразить на физическую память. Первые два это индексы по которым находится конкретная страница виртуальной памяти, а третье число — смещение от начала страницы. CPU и ОС здесь работают в связке — ОС предоставляет структуру данных по которой CPU находит страницу виртуальной памяти и копирует её в физическую. По HEX номеру можно сразу увидеть как выровнен в памяти адрес. Формат двоичного числа слишком громоздкий, 32 бита (или 64) трудны для восприятия. Десятичный формат — показывает слишком мало информации, тогда как HEX удобный компромисс между десятичной и двоичной системами, средами людей и машин.

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

Из чего состоит Windows?

Абстракция или же разбиение на компоненты есть во всех сферах программирования и интуитивно понятно что Windows тоже делится на какие-то компоненты. Под компонентом понимается какая-то единица функциональности — ООП класс, файл, dll, папка. Компоненты на диаграмме ниже могут быть как индивидуальными *.sys, *.dll файлами, так и просто набором API сгруппированным логически через добавление префикса к имени функции, старая часть системы написана на C, а он не поддерживает классы. Новые части пишутся нередко на C++. В укрупнённом виде Винда выглядит так:

image

Давайте быстренько пробежимся по её компонентам снизу вверх:

  • Hyper-V Hypervisor — слой виртуализации благодаря которому в Windows можно создать виртуальную машину. Иногда говорят, что Hyper-V это минус первый уровень привилегий, однако реализован он в одном уровне привилегий и адресном пространстве что и ядро ОС, за счёт использования слоёной архитектуры ОС ничего не знает о нём.
  • HAL.dll — Hardware Abtraction Layer — изначально задумывался как абстракция над железом — чипсет, материнская плата, процессор — для того чтобы можно было перенести Windows на новую платформу реализовав новый HAL.dll, который будет выбран и скопирован во время установки. По сути это драйвер к устройствам материнской платы, к примеру таймерам, контроллеру прерываний. Сейчас его роль снижена, потому как многие драйвера материнки и чип-сета реализованы в ACPI.sys.

Данный рассказ я хочу посвятить основам главной программы на компьютере многих пользователей, а именно, операционной системе (ОС) Виндовс. Сейчас продают систему 8.1, а история насчитывает уже очень много самых разных версий. В наше время старые версии ОС уже можно посмотреть в браузере Гугл Хром, и даже немного в них поработать (смотри [1]). Но еще до появления Виндовс на самых первых персональных компьютерах устанавливалась система ДОС. Она не была многозадачной и не была графической. В то время графика очень медленно выполнялась и была примитивной, поэтому для ускорения системы использовался текст, а точнее текстовые команды ДОС, которые являлись частным случаем специального языка программирования автоматической работы на компьютере.

И этот командный способ использования операционной системы до сих пор существует во всех версиях ОС Виндовс. Для выполнения команд даже самые последние версии имеют консольное окно, очень напоминающее окно ДОС, в котором эти команды можно вводить. А выставляет это окно и исполняет команды специальная программа windows\system32\cmd.exe. Ее можно запускать непосредственно по адресу, по иконке, а можно и в Проводнике (файловом менеджере системы Виндовс) по кнопке "Открыть командную строку" в меню "Файл". Но это не удобно, потому что командную строку надо записывать руками. Есть более удобный способ, который работает во всех системах Виндовс и работал в ДОС. А именно, в системе Виндовс принято, что все файлы с расширением bat, например, "run.bat" автоматически выполняются программой windows\system32\cmd.exe, которая открывает это самое консольное окно и интерпретирует каждую строку файла как команду, которая автоматически записывается в командную строку консоли.

Этот вариант намного удобнее, потому, что файл с расширением bat можно предварительно отредактировать в любом текстовом редакторе, и файл сохраняется на винчестере, его можно копировать и многократно исполнять. В системе Юникс (Линукс) любой файл можно объявить как командный, а в системе Виндовс такое объявление происходит путем записи расширения bat. В этом смысле слова bat-файл и командный файл синонимы. Как я уже сказал, командный язык был разработан еще в ДОС, и он почти без изменений используется во всех системах Виндовс, хотя от системы к системе могут появляться новые команды. Однако старые продолжают работать.

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

В этой статье я начну постепенно рассказывать про некоторые команды ОС Виндовс. За каждой такой командой стоит специальная программа, которая выполняет ту или иную работу. Но есть и внутренние команды языка, которые указывают интерпретатору, то есть программе cmd.exe, как ей надо понимать и как выполнять команды. Такие команды разумно выучить даже раньше названий самих программ, чтобы лучше понимать написанный код. Вот с них и начнем. Работать можно где угодно, в любой папке компьютера или на рабочем столе, который тоже является специальной папкой.

Итак, сделайте следующее. Поставьте курсор мыши на рабочий стол в любом месте и кликните правую кнопку мыши. В появившемся меню выберите строку "Создать" и далее "Текстовый документ". На рабочем столе появится иконка с длинным названием и с расширением txt. Названия всех иконок можно редактировать. Для этого кликните мышкой на названии, откроется маленький редактор и перепишите все название на "run.bat" и нажмите клавишу [Enter]. Появится предупреждение, что изменение типа файла повлечет за собой изменение запускающей программы. Игнорируйте, потому что именно это нам и надо.

Итак, у вас появилась иконка нового файла с названием "run.bat". Но файл еще пустой. Теперь ставим курсор на иконку и снова нажимаем правую кнопку мыши. В меню выбираем строку "Изменить", она вторая сверху. Открывается текстовый редактор Notepad (Блокнот) c пустым окном. Набираем в нем две строки

и спасаем набранный текст в файле. Вот мы и получили первый командный файл, который фактически тоже является программой. Сразу объясню, что означает набранный текст. Команда "help" просто дает описание, точнее инструкцию как пользоваться командой, которая является ее аргументом. То есть командой "cmd" в нашем случае. Командные строки имеют такую структуру, что первое слово -- это всегда команда, которая выполняется, а другие слова после него, набранные через пробел, являются ее аргументами. Их может быть много и они могут быть разными, зависит от того, как написана программа. Вторая команда "pause" останавливает выполнение всех других команд и дает подсказку нажать любую клавишу. В ДОС было необходимо нажать только клавишу [Enter], сейчас можно любую. Но клавиша [Enter] все равно главнее всех других, ее и нажимайте.

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

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

Многие команды ОС Виндовс запускают программы, которые не только получают входные параметры из командной строки, но и просят ввести какие-то значения с клавиатуры как ответ на вопрос программы, а результаты печатают в консольное окно строку за строкой. Если данных для ввода мало, а результат записывается коротко, то и достаточно. А если нет? Тогда получается очень неудобно. Возникает проблема, которую надо решать. Решение вот такое. После всех обязательных параметров можно указать имена файлов, одно имя для файла, в котором набраны все данные, которые будут запрашиваться, и второе имя для файла, в который будет напечатан результат работы. В этом случае программа будет работать полностью автоматически. При этом перед входным именем файла надо ставить знак < (меньше), а перед выходным > (больше). На самом деле эти знаки означают стрелки, показывающие откуда и куда идет информация.

Запишите в файл "run.bat" следующий текст

help > out.txt
pause

И дважды кликните на его иконке. На этот раз в консольном окне ничего не появится, зато на вашем рабочем столе появится иконка нового файла с именем "out.txt". Этот файл создала программа help, запущенная из командного файла "run.bat". Можно посмотреть его содержание в любом текстовом редакторе, например, в Notepad. И тут нас ждет первый сюрприз. Русские буквы текста нечитабельны. В чем дело? А дело в том, что Виндовс уже давно показывает русские буквы в так называемой виндовс-кодировке, а программа help продолжает показывать русские буквы в старой, то есть в дос-кодировке. Чтобы прочитать такой файл вам необходимо воспользоваться редактором, который умеет показывать текст во всех пяти кодировках русских символов, которые сейчас существуют.

Одной из таких программ является мой собственный редактор vkNotepad.jar, который можно скачать по ссылке [2]. Раньше было много самодельных программ перекодировщиков, поскольку это очень простая операция. Чтобы узнать как решить проблему сегодня я сделал запрос в интернете. Вот одно из решений. В Блокноте (Notepad) нужно выбрать шрифт "Terminal" и как раз он показывает русский текст в дос-кодировке. Есть и другие решения, но этих достаточно. Интересно почитать текст, который напечатала программа. Она сообщила, что надо набрать на командной строке имя команды, а дальше дала список некоторых команд, которые существуют в операционной системе. И это уже неплохо.

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

Это не всегда удобно. Удобно делать наоборот, то есть записывать bat-файл в тут же папку, где находится программа. В этом случае никаких проблем не будет. Но можно указывать не только файлы с расширением exe, а и файлы с другим расширением, например, txt, что еще более удобно. Что происходит в этом случае? А вот что. Операционная система помнит таблицу, в которой написано какую программу надо запускать с каким расширением файла. И она просто выполнит эту программу, хотя сама программа явно в команде не указана.

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

c:\"Program Files (x86)"\Adobe\"Reader 11.0"\Reader\AcroRd32.exe anyfile.pdf
pause

Правда при этом система требует разрешения, но его можно дать один раз на всю работу и дальше все будет автоматически. Что здесь важно? Сам bat-файл и pdf-файл находятся в одной папке, например, на рабочем столе, а вот для программы надо указать ее полный путь. Есть очень много способов узнать полный путь программы. Он, обычно, даже запрашивается при установке программы, или сообщается в ее свойствах. Важно, что таким способом можно уже запускать любой файл с любой программой, конечно при условии, что программа способна работать с файлом, то есть его формат записи правильный для этой программы.

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

Адоб ридер -- не единственная программа, которую можно запускать таким способом. Другими важными программами являются текстовые редакторы, браузеры, видео-проигрыватели и многие другие программы. Важно, что многие программы, которые впервые появились в системе Юникс, очень удобно запускаются именно таким способом. Часто они вообще не имеют графической среды общения с пользователем. Я рассказал только самый минимум. Есть еще очень много всего интересного, но не все сразу.

Читайте также: