что такое компьютерная система
计算机系统(A computer system)Он состоит из аппаратного и программного обеспечения, которые работают вместе для запуска программ. Различные системы могут иметь разные реализации, но основные концепции одинаковы и распространены.
Различными системами являются Microsoft Windows, Apple Mac OS X, Linux и т. д.
Все компьютерные системы имеют схожие программно-аппаратные компоненты, выполняющие схожие функции.
что ты хочешь
Во-первых, позвольте задать вам вопрос, каким программистом вы хотите быть?
Это хороший проект с открытым исходным кодом, который я недавно искал, и его путьGitHub.com/Keithnull/T…
это
Я также загрузил все книги на китайском/английском языке, связанные с этим, и официальный аккаунт ответит计算机基础, вы можете получить. (на фото фон Нейман)
Я всегда хотел быть первым инженером, и даже если я никогда им не стану, я все ближе и ближе к этому.
Вернуться к теме
Да, я хочу быть电源程序员
простая программа
На этот раз я действительно берусь за дело, вот очень простая программа на C (неважно, зовут меня Java Builder или как, могут ли Java Builders не изучать C? Хотя работа — Java, C — отец. )
#include <stdio.h>
int main(){
pritnf("hello, world\n");
return 0;
}
Это программа Hello,world, написанная на C, и хотя это очень простая программа, каждая часть системы должна работать вместе, чтобы функционировать.
Жизненный цикл этой программы заключается в том, что программист создает программу, запускает программу в системе, печатает простое сообщение и завершает работу.
Программисты сначала создают этот код в текстовом виде, также известном как源文件или源程序, затем сохраните какhello.cфайл, исходная программа на самом деле состоит из нулей и единиц (также известных как比特, то есть бит). 8 бит сгруппированы вместе, называемые字节. Каждый байт, в свою очередь, представляет текстовый символ, который обычно представляетсяASCIIкод, следующееhello.cASCII-код программы
Программа hello.c хранится в файле в порядке байтов, и каждый байт соответствует целочисленному значению, то есть 8 бит представляют собой целое число. Например, первый символ 35, откуда берется это 35? На самом деле это сравнительная таблица кодов ASCII (поскольку кодов ASCII очень много, вы можете перейти кascii.911cha.com/?year=%23Запрос на официальный сайт, здесь лишь несколько выбранных для ознакомления)
Каждая строка начинается с невидимого\nдо конца его значение ASCII равно 10.
Примечание: такой файл, как hello.c, состоящий только из символов ASCII, называется текстовым файлом. Все остальные файлы называются двоичными.
Представление hello.c иллюстрирует основную идею: вся информация в системе, включая файлы на диске, программы в памяти, данные, хранящиеся в памяти, и данные, передаваемые по сети, представлена строкой битов. Единственный способ различать разные объекты данных — это контекст, в котором мы читаем объекты, например, в разных контекстах одна и та же последовательность байтов может представлять целое число, число с плавающей запятой, строку или машинную инструкцию.
почему С
Вот новость, почему мы хотим изучать язык C? Нужно ли знать язык C, чтобы изучать Java? Здесь нужно поговорить об истории языка Си.
Язык C возник в Bell Labs. Американский национальный институт стандартов ANSI обнародовал стандарт ANSI C в 1981 году, а позже был стандартизирован C. Эти стандарты определяют язык C и ряд библиотек функций, так называемые
C 语言标准库, тогда каковы характеристики языка Си?
- Язык C тесно связан с операционной системой Unix. C был разработан как язык программирования для систем UNIX с самого начала, большая часть ядра UNIX (операционная система и основные части) и инструменты, динамические библиотеки написаны на C. UNIX стала самой популярной операционной системой в 1970-х и 1980-х годах, а C стал самым популярным языком программирования.
- C — очень маленький и простой язык. А простота языка C делает его более переносимым.
- Язык Си предназначен для практических целей.
Выше мы упоминали о различных преимуществах языка C, но не все программисты могут освоить и использовать язык C. Указатели в языке C часто вызывают у многих программистов головную боль. В языке C также отсутствует хорошая поддержка абстракций, таких как классы, объектов, но и C++, и Java решают эти проблемы.
Программы переводятся в разные формы другими программами
Что делает программирование на C языком высокого уровня, так это его способность читать и понимать мысли людей. Однако для того, чтобы иметь возможность работать в системеhello.cпрограммы, каждый оператор C должен быть преобразован другой программой в серию инструкций машинного языка низкого уровня. Эти инструкции упакованы как可执行对象程序, хранящийся в двоичном файле на диске. Объектные программы также называются исполняемыми объектными файлами.
В системах UNIX преобразование исходных файлов в объектные файлы выполняется с помощью编译器завершенный.
gcc -o hello hello.c
Драйвер компилятора gcc читает из исходных файловhello.c, и перевести его в исполняемый файлhello. Этот процесс перевода может быть представлен следующим рисунком
Это полный процесс выполнения программы hello world, который включает в себя несколько основных компонентов:Препроцессор, компилятор, ассемблер, компоновщик, давайте разберем их один за другим.
-
预处理阶段(Preprocessing phase), препроцессор начнет с#символ, измените исходную программу C.#include <stdio.h>Команда сообщит препроцессору, что нужно читать заголовочные файлы системы.stdio.hи вставьте его в программу как текст. А потом получил еще одну программу Chello.i, эта процедура обычно начинается с.iна конец. - После
编译阶段(Compilation phase), компилятор преобразует текстовый файлhello.iперевести в текстhello.s, который включает в себя汇编语言程序(assembly-language program). Эта функция содержит определение основной функции следующим образом.
main:
subq $8, %rsp
movl $.LCO, %edi
call puts
movl &0, %eax
addq $8, %rsp
ret
2-7 в приведенном выше определении описывают инструкцию языка низкого уровня. Язык ассемблера очень полезен, поскольку он может предоставлять собственный набор стандартных языков вывода для разных языков высокого уровня.
- После компиляции
汇编阶段(Assembly phase), этот шаг,汇编器 asпреобразует hello.s в машинные инструкции и упаковывает эти инструкции в可重定位的二进制程序(relocatable object program)в файле hello.c. Содержащиеся в нем 17 байт — это кодировка инструкций функции main, и если мы откроем hello.c в текстовом редакторе, то увидим кучу тарабарщины. - Последний из них
链接阶段(Linking phase), наша программа hello вызоветprintfфункция, которая является частью стандартной библиотеки C, предоставляемой компилятором C. Функция printf находится в файле с именемprintf.oфайл, это отдельный предварительно скомпилированный объектный файл, и этот файл должен быть связан с нашим hello.o,连接器(ld)обработает эту операцию слияния. В результате файл приветствия, который является исполняемым объектным файлом (или исполняемым файлом), готов к загрузке в память и выполнению системой.
Вы должны понимать, что делает система сборки
Для простой приветственной программы, приведенной выше, мы можем положиться на编译系统(compilation system)предоставить правильный и действительный машинный код. Однако для программистов, о которых мы говорили выше, есть несколько основных особенностей компилятора, которые необходимо знать.
-
优化程序性能(Optimizing program performance), современный компилятор — эффективный инструмент для создания хорошего кода. Вам как программисту не нужно понимать, что происходит внутри компилятора, чтобы писать качественный код. Однако для того, чтобы писать эффективные программы на C, нам необходимо понимать базовый машинный код и процесс, с помощью которого компилятор преобразует различные операторы C в машинный код. -
理解链接时出现的错误(Understanding link-time errors), по нашему опыту, некоторые очень сложные ошибки в основном возникают на этапе связывания, особенно когда вы хотите создавать большие программные проекты. -
避免安全漏洞(Avoiding security holes), в последние годы,缓冲区溢出(buffer overflow vulnerabilities)Это виновник сетевых и интернет-сервисов, поэтому нам необходимо избежать этой проблемы.
Процессор читает и интерпретирует инструкции в памяти
Теперь наша исходная программа hello.c была интерпретирована как исполняемая объектная программа hello, которая хранится на диске. Если мы хотим запустить эту программу в операционной системе UNIX, нам нужно ввести приложение оболочки
cxuan $ ./hello
hello, world
cxuan $
Вот объяснение того, что такое оболочка.Оболочка на самом деле является интерпретатором команд, который выводит символ, ждет, пока пользователь введет команду, а затем выполняет команду. Если первое слово командной строки не является встроенной командой оболочки, то оболочка предполагает, что это исполняемый файл, загружает и запускает исполняемый файл.
Аппаратный состав системы
Чтобы понять, что происходит при запуске программы hello, нам нужно сначала иметь представление об аппаратном обеспечении системы. Ниже представлена модель системного продукта Intel, поясним ее
-
总线(Buses): По всей системе проходят наборы электрических каналов, называемых шинами, по которым байты информации передаются между компонентами. Обычно шина предназначена для передачи блоков байтов фиксированной длины, т.е.字(word). Количество байтов в слове (длина слова) — это базовый системный параметр, который варьируется от системы к системе. Сегодня большинство слов имеют размер 4 байта (32 бита) или 8 байтов (64 бита).
-
I/O 设备(I/O Devices): Устройства ввода/вывода являются связующим звеном между системой и внешним миром. На приведенной выше диаграмме представлены четыре типа устройств ввода-вывода: клавиатура и мышь для пользовательского ввода, дисплей для пользовательского вывода и дисковый накопитель для долговременного хранения данных и программ. С самого начала исполняемые программы хранятся на диске.Каждое устройство ввода-вывода, подключенное к шине ввода-вывода, называется
控制器(controller)или适配器(Adapter). Основное различие между контроллерами и адаптерами заключается в способе их упаковки. Контроллер — это набор микросхем на самом устройстве ввода-вывода или на основной печатной плате системы (часто называемой материнской платой). Адаптер — это карта, которая вставляется в слот материнской платы. Независимо от формы организации их конечной целью является обмен информацией друг с другом. -
主存(Main Memory), основная память临时存储设备, вместо постоянного хранилища используется диск永久性存储устройство из. Основная память содержит как программу, так и данные, обрабатываемые потоком выполнения процессора. С физической точки зрения, основная память состоит из рядаDRAM(dynamic random access memory)Коллекция динамического случайного хранилища. Логически говоря, память представляет собой линейный массив байтов с уникальным номером адреса, начинающимся с 0. Вообще говоря, каждая машинная инструкция, составляющая программу, состоит из разного количества байтов, и размер элемента данных, соответствующего программной переменной C, зависит от типа. Например, на машине Linux x86-64 данные типа short требуют 2 байта, int и float — 4 байта, а long и double — 8 байт. -
处理器(Processor),CPU(central processing unit)Или просто процессор, механизм, который интерпретирует (и выполняет) инструкции, хранящиеся в основной памяти. Ядром процессора является запоминающее устройство (или регистр) размером со слово, называемое程序计数器(PC). В любой момент ПК указывает на инструкцию машинного языка в оперативной памяти (т. е. на адрес, содержащий эту инструкцию).С момента включения системы до ее выключения процессор непрерывно выполняет инструкцию, на которую указывает программный счетчик, а затем обновляет программный счетчик, чтобы он указывал на следующую инструкцию. Процессор работает в соответствии с моделью инструкций, определяемой его архитектурой набора инструкций. В этой модели инструкции выполняются в строгом порядке, и выполнение инструкции включает в себя выполнение ряда шагов. Процессор считывает инструкцию из памяти, на которую указывает программный счетчик, интерпретирует биты в инструкции, выполняет некоторую простую операцию, указанную инструкцией, а затем обновляет программный счетчик, чтобы он указывал на следующую инструкцию. Инструкции могут быть непрерывными или прерывистыми (например, инструкция jmp не будет считываться последовательно)
Вот несколько шагов, которые ЦП может выполнить простую операцию
-
加载(Load): Копировать байт или слово из основной памяти в память, перезаписывая предыдущее содержимое регистра -
存储(Store): Копировать байт или слово из регистра в место в основной памяти, перезаписывая предыдущее содержимое этого места. -
操作(Operate): Скопируйте содержимое двух регистров вALU(Arithmetic logic unit). Выполняет арифметическую операцию над двумя словами и сохраняет результат в регистре, перезаписывая предыдущее содержимое регистра.
Арифметико-логическое устройство (АЛУ) представляет собой комбинированную цифровую электронную схему, которая выполняет арифметические и побитовые операции над цифровыми двоичными числами.
-
跳转(jump): Извлечь слово из инструкции и скопировать слово в程序计数器(PC), перезаписать исходное значение
Анализ выполнения программы hello
Ранее мы кратко представили состав и работу аппаратной части компьютера Теперь мы формально представим, что происходит при запуске программы-примера Мы опишем это с точки зрения макросов и не будем вдаваться во все технические подробности.
Первоначально программа-оболочка выполняет свои инструкции и ждет, пока пользователь введет команду. когда мы печатаем на клавиатуре./helloДля этих нескольких символов программа оболочки считывает символы в регистр один за другим, а затем помещает их в память, как показано на следующем рисунке.
когда мы нажимаем на клавиатуру回车键, программа оболочки знает, что мы закончили вводить команду. Затем оболочка загружает исполняемый файл приветствия, выполняя ряд инструкций, которые копируют код и данные объектного файла с диска в оперативную память.
использоватьDMA(Direct Memory Access)Технология может напрямую копировать данные с диска в память следующим образом.
Как только код и данные приветствия в объектном файле загружаются в оперативную память, процессор начинает выполнять инструкции машинного языка в основной программе программы приветствия. Эти инструкции будутhello,world\nБайты в строке копируются из основной памяти в файл регистров, из регистров в устройство отображения и, наконец, отображаются на экране. Следующее
Кэш это ключ
Выше мы представили процесс выполнения приветственной программы Система тратит много времени на перемещение информации из одного места в другое. Машинные инструкции для программы hello изначально хранятся в磁盘начальство. Когда программа загрузится, они拷贝в основную память. Когда ЦП начинает работать, инструкции копируются из памяти в ЦП. Точно так же строковые данныеhello,world \nТакже изначально на диск, копируется в память и потом выводится на устройство отображения. С точки зрения программиста, такое копирование в основном является накладным, что снижает эффективность программы. Поэтому при проектировании системы главная задача — сделать так, чтобы программа работала все быстрее и быстрее.
По законам физики большие устройства хранения данных работают медленнее, чем устройства хранения меньшего размера. Из-за повышения эффективности обработки регистров и памяти разработчики систем приняли более мелкие и быстрые устройства хранения для этой разницы, называемой高速缓存存储器(cache memory, 简称为 cache 高速缓存), как временный плацдарм для хранения информации, которая может понадобиться в ближайшем будущем. Как показано ниже
На рисунке мы отметили расположение тайника, который находится в тайникеL1Емкость кэша может достигать десятков тысяч байт, а скорость доступа почти такая же, как при доступе к регистровому файлу. большая емкостьL2Кэш связан с процессором по специальной шине, и хотя кэш L2 в 5 раз медленнее, чем кэш L1, он все же в 5-10 раз быстрее памяти. L1 и L2 используют静态随机访问存储器(SRAM)реализуется аппаратными технологиями. Последние, более мощные системы имеют даже три уровня кэш-памяти: L1, L2 и L3. Система может получить большой объем памяти, и в то же время скорость доступа выше, потому что использование кеша局部性принцип.
Принцип локальности: в cs ссылочная локальность, также известная как принцип локальности, — это механизм, с помощью которого процессоры имеют тенденцию неоднократно обращаться к одному и тому же набору памяти в течение короткого периода времени.
Сохраняя часто используемые данные в кеше, большинство операций с памятью можно выполнять непосредственно в кеше.
иерархия устройств хранения
Выше мы упомянули кэши L1, L2, L3 и память, все они используются для целей хранения, и иерархия между ними нарисована для вас ниже
Основная идея памяти заключается в том, что память верхнего слоя выступает в роли кэша памяти нижнего слоя. Таким образом, регистровый файл — это кеш L1, L1 — кеш L2, L2 — кеш L3, L3 — кеш основной памяти, который, в свою очередь, является кешем диска. Вот краткое введение в иерархию устройств памяти, а подробности будут представлены позже.
Как операционная система управляет оборудованием
Возвращаясь к нашей программе hello, когда оболочка загружает и запускает программу hello, а программа hello выводит свои собственные сообщения, ни оболочка, ни программа hello не имеют прямого доступа к клавиатуре, дисплею, диску или основной памяти. они полагаются на操作系统(operating System)сделать работу. Операционная система — это своего рода программное обеспечение, мы можем думать об операционной системе как о программном слое между приложением и оборудованием, все операции, которые необходимо выполнять непосредственно на оборудовании, будут проходить через операционную систему.
Операционная система выполняет две основные функции:
- Операционная система защищает аппаратное обеспечение от неправомерного использования неконтролируемыми программами.
- Предоставляет простой и согласованный механизм для приложений, чтобы управлять низкоуровневыми аппаратными устройствами..
Так как же операционная система реализует работу оборудования? не более чем черезПроцессы, виртуальная память, файлыдля достижения этих двух функций.
Файл — это абстрактное представление устройств ввода-вывода, виртуальная память — это абстрактное представление основной памяти и дисковых устройств ввода-вывода, а процесс — это абстрактное представление процессоров, основной памяти и устройств ввода-вывода. Давайте обсудим по очереди
процесс
进程Основная концепция операционных систем, процесс — это абстракция работающей программы. Все остальное в операционной системе вращается вокруг процессов. Они поддерживают даже с одним процессором(伪)并发работать. Они абстрагируют один ЦП на ЦП нескольких виртуальных машин. Мы можем абстрагироваться от процесса как модели процесса.
В модели процесса процесс является экземпляром исполняемой программы, и процесс также включает в себя текущее значение счетчика программы, регистры и переменные. Концептуально каждый процесс имеет свой собственный виртуальный ЦП, но на самом деле ЦП переключается между процессами.
Как показано на рисунке выше, это многопроцессорная программа с 4 программами, и счетчик программ меняется по-разному, так как процессы постоянно переключаются.
На приведенной выше диаграмме эти 4 программы разделены на 4 процесса с собственным потоком управления (т. е. каждый со своим счетчиком программ), и каждая программа работает независимо. Конечно, на самом деле существует только один физический счетчик программ, и логический счетчик программ каждой программы загружается в физический счетчик программ, когда она хочет работать. Когда программа завершит работу, ее физический счетчик программ станет реальным счетчиком программ, а затем поместит его обратно в логический счетчик процесса.
На изображении ниже мы видим, что после достаточно долгого наблюдения все процессы запущены,Но на самом деле в любой момент времени работает только один процесс..
Поэтому, когда мы говорим, что ЦП действительно может запускать только один процесс за раз, даже с двумя ядрами (или ЦП),Каждое ядро может одновременно запускать только один поток..
Поскольку ЦП быстро переключается между процессами, время выполнения каждого процесса в ЦП неопределенно. И когда тот же процесс снова запускается в ЦП, время его выполнения внутри ЦП часто не фиксируется.
Как показано на рисунке ниже, переход от одного процесса к другому осуществляется операционной системой内核(kernel)удалось. Ядро — это код операционной системы.常驻часть. Когда приложению требуется, чтобы операционная система сделала что-то, например, прочитала или записала файл, оно выполняет специальный系统调用инструкция.
Примечание. Ядро не является отдельным процессом. Скорее это набор кода и структур данных, используемых системой для управления всеми процессами.
Мы подробно опишем эти процессы позже
нить
В традиционных операционных системах каждый процесс имеет адресное пространство и поток управления. Фактически, это определение большинства процессов. Однако во многих случаях обычно несколько потоков управления выполняются в одном и том же адресном пространстве, как если бы эти потоки были отдельными процессами. Если быть точным, это фактически обсуждение модели процесса и модели потока, Чтобы ответить на этот вопрос, вам может потребоваться ответить на него в три шага.
- Возможность совместного использования одного и того же адресного пространства и всех доступных данных между несколькими потоками, чего нет у процессов
- Потоки лучше, чем процессы
更轻量级, так как потоки легче, их легче создавать и легче отменять, чем процессы. Во многих системах создание потока выполняется в 10-100 раз быстрее, чем создание процесса. - Третьей причиной может быть обсуждение производительности.Если несколько потоков интенсивно используют ЦП, то повышения производительности добиться невозможно, но если имеется много вычислений и много операций ввода-вывода, наличие нескольких потоков.Эти действия могут перекрываться. друг друга, что ускорит выполнение приложения
Процесс имеет поток выполнения, обычно обозначаемый аббревиатурой线程(thread). Потоки имеют программные счетчики, которые отслеживают, какая инструкция должна выполняться следующей.寄存器, который используется для сохранения переменных, используемых в данный момент потоком; поток также имеет стек для записи пути выполнения программы. Хотя поток должен выполняться в процессе, процесс и поток — это две совершенно разные концепции, и их можно обрабатывать отдельно. Процессы используются для объединения ресурсов, а потоки — это объекты, которые планируют выполнение на ЦП.
Потоки добавляют контент в модель процесса, то есть внутри одного процесса они допускают большую независимость друг от друга и не мешают друг другу. Параллельное выполнение нескольких потоков внутри процесса аналогично запуску нескольких процессов на одном компьютере. В нескольких потоках каждый поток использует одно и то же адресное пространство и другие ресурсы. Среди нескольких процессов процессы совместно используют физическую память, диски, принтеры и другие ресурсы. Поскольку поток содержит некоторые свойства процесса, поток вызывается轻量的进程(lightweight processes).多线程(multithreading)Этот термин также используется для описания нескольких потоков в одном и том же процессе.
Ниже мы видим три традиционных процесса, каждый со своим адресным пространством и одним потоком управления. Каждый поток работает в другом адресном пространстве
На рисунке ниже мы видим, что есть процесс с тремя потоками. Каждый поток работает в одном и том же адресном пространстве.
Виртуальная память
Основная идея виртуальной памяти заключается в том, что каждая программа имеет свое адресное пространство, которое разделено на несколько页面(page)блокировать. каждая страница连续диапазон адресов. Эти страницы сопоставляются с физической памятью, но не все страницы должны находиться в памяти для запуска программы. Когда программа обращается к части адресного пространства в физической памяти, оборудование немедленно выполняет необходимое отображение. Когда программа ссылается на часть адресного пространства, которая не находится в физической памяти, операционная система несет ответственность за загрузку недостающей части в физическую память и повторное выполнение неудачной инструкции.
В некотором смысле виртуальный адрес — это обзор базового и индексного регистров. 8088 имеет отдельные базовые регистры (но не индексные регистры) для размещения текста и данных.
Используя виртуальную память, все адресное пространство может быть отображено в физической памяти небольшими единицами, а не только перемещением для текстовых областей и областей данных. Ниже мы обсудим, как реализована виртуальная память.
Виртуальная память хорошо подходит для использования в мультипрограммных системах, где фрагменты многих программ хранятся в памяти одновременно, и пока одна программа ждет, пока часть ее будет прочитана в память, ЦП может быть передан другой процесс.
документ
文件(Files)это логическая единица информации, созданная процессом. Диск может содержать тысячи или даже миллионы файлов, каждый из которых независим от других. Это механизм абстракции, который позволяет хранить информацию и читать ее позже.
Телекоммуникации
Современные системы не стоят сами по себе, поэтому часто подключаются к другим системам через сети. Из автономной системы сеть можно рассматривать какI/Oоборудования, как показано на рисунке ниже
Когда система копирует строку байтов из основной памяти в сетевой адаптер, данные передаются по сети на другой компьютер, а не на локальный диск. Точно так же система может считывать данные, отправленные другими системами, и копировать данные в свою основную память.
С появлением Интернета ситуация, когда данные копируются с одного хоста на другой, стала одним из наиболее важных применений. Например, такие приложения, как электронная почта, обмен мгновенными сообщениями, FTP и telnet, представляют собой сетевые функции для копирования информации.
Полный текст готов.
Ссылка на статью:
En. Wikipedia.org/wiki/local i…
En. Wikipedia.org/wiki/AR IT-пользователь…
«Понимание компьютерных систем», третье издание