Внешняя память компьютера

Автор: Пользователь скрыл имя, 04 Января 2012 в 16:27, курсовая работа

Описание работы

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

Работа содержит 1 файл

Информатика.docx

— 158.29 Кб (Скачать)

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

 

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

 

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

 

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

 

     Символьные  драйверы являются простейшими в  ОС UNIX и предназначаются для обслуживания устройств, которые реально ориентированы  на прием или выдачу произвольных последовательностей байтов (например, простой принтер или устройство ввода с перфоленты). Такие драйверы используют минимальный набор стандартных  функций ядра UNIX, которые главным  образом заключаются в возможности  взять данные из виртуального пространства пользовательского процесса и/или  поместить данные в такое виртуальное  пространство.

 

     Блочные драйверы - более сложные. Они работают с использованием возможностей системной буферизации блочных обменов ядра ОС UNIX. В число функций такого драйвера входит включение соответствующего блока данных в систему буферов ядра ОС UNIX и/или взятие содержимого буферной области в случае необходимости.

 

     Наконец, наиболее сложной организацией отличаются потоковые драйверы. Фактически, такой  драйвер представляет собой конвейер модулей, обеспечивающий многоступенчатую обработку запросов пользователя. Потоковые  драйверы в среде ОС UNIX в основном предназначены для реализации доступа  к сетевым устройствам, которые  должны работать в соответствии с  многоуровневыми сетевыми протоколами.

 

     Подробности по поводу разных способов организации  драйверов в ОС UNIX см. в разделе 3.3.

 

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

 

     Управление  внешними устройствами - это одна из важнейших функций любой операционной системы. Система должна обеспечивать эффективный и удобный доступ к периферийным устройствам, а также  обеспечивать возможность унифицированной  разработки программного обеспечения  для вновь подключаемых внешних  устройств. Рассмотрим, как эта проблема решается в ОС UNIX.

 

     Interactive programming -- это про spreadsheet languages и прочие фокусы, где меняют куски кода в одном месте экрана, чтобы получить (ожиданно!) изменения кода в другом месте экрана, "как в экселе"Основные идеи -- это про эквивалентность времени компиляции времени выполнения, инкрементальность вычислений.

 

     Интерактивность, говорит автор подхода (Perera) дает чувство логики более высоких порядков в программе с логикой первого порядка:

 

     Функциона́льное программи́рование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании).

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

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

     На  практике отличие математической функции  от понятия «функции» в императивном программировании заключается в  том, что императивные функции могут  опираться не только на аргументы, но и на состояние внешних по отношению  к функции переменных, а также  иметь побочные эффекты и менять состояние внешних переменных. Таким  образом, в императивном программировании при вызове одной и той же функции  с одинаковыми параметрами, но на разных этапах выполнения алгоритма, можно  получить разные данные на выходе из-за влияния на функцию состояния  переменных. А в функциональном языке  при вызове функции с одними и  теми же аргументами мы всегда получим  одинаковый результат: выходные данные зависят только от входных. Это позволяет средам выполнения программ на функциональных языках кешировать результаты функций и вызывать их в порядке, не определяемом алгоритмом. (см.ниже Чистые функции)

     λ-исчисления являются основой для функционального  программирования, многие функциональные языки можно рассматривать как  «надстройку» над ними[1].

     Наиболее  известными языками функционального  программирования являются[2]:

     LISP - (Джон МакКарти, 1958) и множество его диалектов, наиболее современные из которых:

     Scheme

     Clojure

     Common Lisp

     F# — функциональный язык для  платформы .NET

     Haskell — чистый функциональный. Назван в честь Хаскелла Карри.

     Erlang — (Joe Armstrong, 1986) функциональный язык с поддержкой процессов.

     APL — предшественник современных  научных вычислительных сред, таких  как MATLAB.

     ML (Робин Милнер, 1979, из ныне используемых диалектов известны Standard ML и Objective CAML).

     Scala

     Miranda (Дэвид Тёрнер, 1985, который впоследствии дал развитие языку Haskell).

     Nemerle — гибридный функционально/императивный язык.

     XQuery

     Ещё не полностью функциональные изначальные  версии и Lisp и APL внесли особый вклад в создание и развитие функционального программирования. Более поздние версии Lisp, такие как Scheme, а также различные варианты APL поддерживали все свойства и концепции функционального языка.[источник не указан 959 дней]

     Как правило, интерес к функциональным языкам программирования, особенно чисто  функциональным, был скорее научный, нежели коммерческий. Однако, такие  примечательные языки как Erlang, OCaml, Haskell, Scheme (после 1986) а также специфические R (статистика), Mathematica (символьная математика), J и K (финансовый анализ), и XSLT (XML) находили применение в индустрии коммерческого программирования. Такие широко распространенные декларативные языки как SQL и Lex/Yacc содержат некоторые элементы функционального программирования, например, они остерегаются использовать переменные. Языки работы с электронными таблицами также можно рассматривать как функциональные, потому что в ячейках электронных таблиц задаётся массив функций, как правило зависящих лишь от других ячеек, а при желании смоделировать переменные приходится прибегать к возможностям императивного языка макросов. Логи́ческое программи́рование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций.

     Самым известным языком логического программирования является Prolog.

     Первым  языком[источник не указан 909 дней] логического программирования был язык Planner, в котором была заложена возможность автоматического вывода результата из данных и заданных правил перебора вариантов (совокупность которых называлась планом). Planner использовался для того, чтобы понизить требования к вычислительным ресурсам (с помощью метода backtracking) и обеспечить возможность вывода фактов, без активного использования стека. Затем был разработан язык Prolog, который не требовал плана перебора вариантов и был, в этом смысле, упрощением языка Planner.

     От  языка Planner также произошли логические языки программирования QA-4, Popler, Conniver и QLISP. Языки программирования Mercury, Visual Prolog, Oz и Fril произошли уже от языка Prolog. На базе языка Planner было разработано также несколько альтернативных языков логического программирования, не основанных на методе поиска с возвратами (backtracking), например, Ether (см. обзор Шапиро [1989]).

     Объе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. В случае языков с прототипированием вместо классов используются объекты-прототипы.

Информация о работе Внешняя память компьютера