
Танненбаум Е. Архітектура компютера [pdf]
.pdf
Вопросы и задания |
513 |
9.Некоторые компьютеры позволяют осуществлять ввод-вывод непосредственно в пользовательское пространство. Например, программа может начать передачу данных с диска в буфер внутри пользовательского процесса. Вызовет ли это какие-либо проблемы, если для реализации виртуальной памяти используется уплотнение? Аргументируйте.
10.Операционные системы, в которых допускаются проецируемые в память файлы, всегда требуют, чтобы файлы были отображены в границах страниц. Например, если у нас есть страницы по 4 К, файл может быть отображен, начиная с виртуального адреса 4096, но не с виртуального адреса 5000. Зачем это нужно?
11.При загрузке сегментного регистра в Pentium II вызывается соответствующий дескриптор, который загружается в невидимую часть сегментного регистра. Как вы думаете, почему разработчики Intel решили это сделать?
12.Программа в компьютере Pentium II обращается к локальному сегменту 10 со смещением 8000. Поле BASE сегмента 10 в локальной таблице дескрипторов содержит число 10000. Какой элемент таблицы страниц использует Pentium II? Каков номер страницы? Каково смещение?
13.Рассмотрите возможные алгоритмы для удаления сегментов в сегментированной памяти без страничной организации.
14.Сравните внутреннюю фрагментацию с внешней фрагментацией. Что можно сделать, чтобы улучшить каждую из них?
15.Супермаркеты часто сталкиваются с проблемой, сходной с замещением страниц в системах с виртуальной памятью. В супермаркетах есть фиксированная площадь пространства на полках, куда требуется помещать все больше и больше различных товаров. Если поступил новый важный продукт, например питание для собак очень высокого качества, какой-либо другой продукт нужно убрать, чтобы освободить место для нового продукта. Мы знаем два алгоритма: LRU и FIFO. Какой из них вы бы предпочли?
16.Почему блоки кэш-памяти всегда намного меньше, чем страницы в виртуальной памяти (бывает даже, что в 100 раз меньше)?
17.Почему многие системы файлов требуют, чтобы файл перед прочтением явным образом открывался с помощью системного вызова open?
18.Сравните применение битового отображения и списка неиспользованных пространств для слежения за свободным пространством на диске. Диск состоит из 800 цилиндров, на каждом из которых расположено 5 дорожек по 32 сектора. Сколько понадобится «дырок», чтобы список «дырок» (список свободной памяти) стал больше, чем битовое отображение? Предполагается, что единичный блок — это сектор и что для «дырки» требуется 32-бит- ный элемент таблицы.
19.Чтобы сделать некоторые прогнозы относительно производительности дис-
ка, нужно иметь модель распределения памяти. Предположим, что диск рас-

5 1 4 Глава 6. Уровень операционной системы
длин данных и неиспользованных пространств одинаковы, п каждого из них вероятность быть i секторов составляет 2''. Каков ожидаемое число «дырок» на диске?
20.На определенной машине программа может создавать столько файл ко ей нужно, и все файлы могут увеличиваться в размерах во вре нения программы, причем операционная система не получает н полнительных данных об их конечном размере. Как вы думаете, х файлы в последовательных секторах? Поясните.
21.Рассмотрим один метод реализации команд для работы с семафо кийраз, когдацентральный процессор собирается совершить кома down над семафором (семафор — это целочисленная переменная сначала он устанавливает приоритет центрального процессора та зом, чтобы блокировать все прерывания. Затем он вызывает из па фор, изменяет его и в соответствии с этим совершает переход. П он снова снимает запрет с прерываний. Будет ли этот метод рабо
а.Существует один центральный процессор, который переключ ду процессами каждые 100 миллисекунд?
б.Два центральных процессора разделяют общую память, в кото ложен семафор?
22.Компания, разрабатывающая операционные системы, получает своих клиентов по поводу последней разработки, которая поддерж рации с семафорами. Клиенты решили, что аморально со сторон сов приостанавливать свою работу (то есть спать на работе). Чтоб своим клиентам, компания решила добавить третью операцию, операция просто проверяет семафор, но не изменяет его и не блок цесс. Таким образом, программы сначала проверяют, можно ли семафором операцию down. Будет ли эта идея работать, если се пользуют три и более процессов? А если два процесса?
23.Составьте таблицу, в которой в виде функции от времени от 0 до 10 секунд показано, какие из трех процессов PI, P2 и РЗ работают, а кированы. Все три процесса выполняют команды up и down над од же семафором. Если два процесса блокированы и совершается к то запускается процесс с меньшим номером, то есть Р1 имеет преи над Р2 и РЗ и т. д. Изначально все три процесса работают, а знач фора равно 1.
При t=100 P1 совершает down. При t=200 PI совершает down. При t=300 PI совершает up.
При t=400 PI совершает down. При t=500 PI совершает down.
При t=600 PI совершает up.

Вопросы и задания
24.В системе бронирования билетов на авиарейсы необходимо быть ув ным в том, что пока один процесс использует файл, никакой другой пр не может использовать этот же файл. В противном случае два разных цесса, которые работают на два разных агентства по продаже билетов, продать последнее оставшееся место двум пассажирам. Разработайте синхронизации с использованием семафоров, чтобы точно знать, что то один процесс в конкретный момент времени может получать доступ к лу (предполагается, что процессы подчиняются правилам).
25.Чтобы сделать возможной реализацию семафоров на компьютере с нес кими процессорами, которые разделяют общую память, разработчики в чают в машину командудля проверки и блокирования. КомандаTSL X п ряет ячейку X. Если содержание равно 0, семафоры устанавливаются н один неделимый цикл памяти, а следующая команда пропускается. содержание ячейки не равно О, TSL работает как пустая операция. Испо TSL, можно написать процедуры lock и unlock со следующими свойст lock{x) проверяет, заперт ли х. Если нет, эта процедура запирает х и во щает управление; unlock отменяет существующую блокировку. Если заперт, процедура просто ждет, пока он не освободится, и только после запирает х и возвращает управление. Если все процессы запирают таб семафоров перед ее использованием, то в определенный момент вре только один процесс может производить операции с переменными и у телями, что предотвращает состояние гонок. Напишите процедуры l unlockнаассемблере.
26.Каково будет значение in и out для кольцевого буфера длиной в 65 сло сле каждой из следующих операций? Изначально значения in и out рав а. 22 слова помещаются в буфер; б. 9 слов удаляются из буфера;
в. 40 слов помещаются в буфер; г. 17 слов удаляются из буфера; д. 12 слов помещаются в буфер; е. 45 слов удаляются из буфера; ж. 8 слов помещаются в буфер;
з. 11 слов удаляются из буфера.
27.Предположим, что одна из версий UNIX использует 2 К блоков на ди хранит 512 адресов диска на каждый блок косвенной адресации (обы косвенной адресации, двойной и тройной). Каков будет максимальный мер файла? Предполагается, что размер указателей файла составляет 64
28.Предположим, что системный вызов UNIX unlink("/usr/ast/bin/game3")
был выполнен в контексте рис. 6.27. Опишите подробно, какие измен

5 1 6 Глава 6. Уровень операционной системы
пожертвовать им для общего блага. Вы выбрали системный вызов рый создает каналы для передачи потоков байтов от одного проц гому. Возможно ли после этого как-то изменить ввод-вывод? Что сказать о конвейерах? Рассмотрите проблемы и возможные реше
30.Комиссия по защите дескрипторов файлов выдвинула протест п темы UNIX, потому что когда эта система возвращает дескрипт она всегда возвращает самый маленький номер, который в данны не используется. Следовательно, едва ли когда-нибудь будут исп сядескрипторы файлов с большими номерами. Комиссия настаив чтобы система возвращала дескриптор с самым маленьким номер которые еще не использовались программой, а не из тех, которые зуются в данный момент. Комиссия утверждает, что эту идею легк вать, это не повлияет на существующие программы и, кроме того гораздо справедливее по отношению к дескрипторам. А что вы д этому поводу?
31.В системе NT можно составить список управления доступом та зом, чтобы один пользователь не имел доступа ни к одному из фа остальные имели полный доступ к ним. Как это можно реализова
32.Опишите два способа программирования работы процессора-прои и процессора-потребителя с использованием общих буферов и с в NT. Подумайте о том, как можно реализовать разделенный буфе из двух случаев.
33.Работу алгоритмов замещения страниц обычно проверяют путем вания. Предположим, что вам нужно написать моделирующую для виртуальной памяти со страничной организацией для маши жащей 64 страницы по 1 Кбайт. Программа должна поддерживат лицу из 64 элементов, один элемент на страницу. Каждый элемен содержит номер физической страницы, который соответствует да туальной странице. Моделирующая программа должна считывать держащий виртуальные адреса в десятичной системе счисления, адресу на строку. Если соответствующая страница находится в па сто записывайте наличие страницы. Если ее нет в памяти, вызо цедуру замещения страниц, чтобы выбрать страницу, которую мо нуть (то есть элемент таблицы, который нужно переписать), и за отсутствие страницы. Никакой передачи страниц не происходит. файл, состоящий из непоследовательных адресов, и проверьте п тельность работы двух алгоритмов: LRU и FIFO. А теперь созд адресов, в котором х процентов адресов находятся на 4 байта выш дыдущие. Проведите тесты для различных значений х и сообщи ченных результатах.
34.Напишите программу для UNIX или NT, которая на входе пол
директории. Программа должна печатать список файлов этой ди


5 1 8 Глава 7. Уровень языка ассемблера
Во время выполнения объектной программы задействовано только тр микроархитектурный уровень, уровень команд и уровень операционной Следовательно, во время работы программы в памяти компьютера мож три программы: пользовательскую объектную программу, операционную и микропрограмму (если она есть). Никаких следов исходной программ ется. Таким образом, число уровней, присутствующих при выполнении мы, может отличаться от числа уровней, присутствующих до трансляции отметить, что хотя мы определяем уровень по командам и языковым конст доступным программистам этого уровня (а не по технологии реализации) рые авторы иногда проводят различие между уровнями, реализованным претаторами, и уровнями, реализованными при трансляции.
Введение в язык ассемблера
Трансляторы можно разделить на две группы в зависимости от отношен входным и выходным языком. Если входной язык является символич презентацией числового машинного языка, то транслятор называется ром, а входной язык называется языком ассемблера. Если входной язык языком высокого уровня (например, Java или С), а выходной язык явля числовым машинным языком, либо символической репрезентацией по то транслятор называется компилятором.
Что такое язык ассемблера?
Язык ассемблера — это язык, в котором каждое высказывание соответст но одной машинной команде. Иными словами, существует взаимно одн соответствие между машинными командами и операторами в программе ассемблера. Если каждая строка в программе на языке ассемблера содерж один оператор и каждое машинное слово содержит ровно одну команду грамма на языке ассемблера в п строк произведет программу на машинн из п слов.
Мы используем язык ассемблера, а не программируем на машинн (в шестнадцатеричной системе счисления), поскольку наязыке ассемблера мировать гораздо проще. Использовать символьные имена и адреса вмес ных и восьмеричных намного удобнее. Многие могут запомнить, что обоз ми для сложения (add), вычитания (subtract), умножения (multiply) и (divide) служат команды ADD, SUB, MUL и DIV, но мало кто может запомнит ствующие числа, которые использует машина. Программисту на языке ас нужно знать только символические названия, поскольку ассемблер тра их в машинные команды.
Это утверждение касается и адресов. Программист на языке ассембле

Введение в язык ассемблера |
5 |
Язык ассемблера имеет несколько особенностей, отличающих его от язык высокого уровня. Во-первых, это взаимно однозначное соответствие между в сказываниями языка ассемблера и машинными командами (об этом мы уже го рили). Во-вторых, программист на языке ассемблера имеет доступ ко всем объ там и командам, присутствующим на целевой машине. У программистов на язык высокого уровня такого доступа нет. Например, если целевая машина содерж бит переполнения, программа на языке ассемблера может проверить его, а п грамма на языкеJava не может. Программа на языке ассемблера может выполн любую команду из набора команд целевой машины, а программа на языке высо го уровня не может. Короче говоря, все, что можно сделать в машинном язы можно сделать и наязыке ассемблера, но многие команды, регистры идругие объ ты недоступны для программиста, пишущего программы на языке высокого ур ня. Языки для системного программирования (например С) часто занимают п межуточное положение. Они обладают синтаксисом языка высокого уровня, при этом с точки зрения возможностей доступа ближе к языку ассемблера.
Наконец, программа на языке ассемблера может работать только на компью рах одного семейства, а программа, написанная на языке высокого уровня, пот циально может работать на разных машинах. Возможность переносить програм ное обеспечение с одной машины на другую очень важна для многих прикладн программ.
Зачем нужен язык ассемблера?
Язык ассемблера довольно труден. Написание программы на языке ассембле занимает гораздо больше времени, чем написание той же программы на языке в сокого уровня. Кроме того, очень много времени занимает отладка.
Но зачем же тогда вообще писать программы на языке ассемблера? Есть причины: производительность и доступ к машине. Во-первых, профессиональн программист языка ассемблера может составить гораздо меньшую по размеру п грамму, которая будет работать гораздо быстрее, чем программа, написанная языке высокого уровня. Для некоторых программ скорость и размер весьма ва ны. Многие встроенные прикладные программы, например программы в кред ных карточках, сотовых телефонах, драйверах устройств, а также процедуры BI попадают в эту категорию.
Во-вторых, некоторым процедурам требуется полный доступ к аппаратно обеспечению, что обычно невозможно сделать на языке высокого уровня. В категорию попадают прерывания и обработчики прерываний в операционных с темах, а также контроллеры устройств во встроенных системах, работающих в жиме реального времени.
Первая причина (достижение высокой производительности) является бо важной, поэтому мы рассмотрим ее подробнее. В большинстве программ ли


Введение в язык ассемблера
Отметим, что если бы написание программы занимало только 1 год, соотнош между смешанным подходом и подходом, при котором используется только я ассемблера, составляло бы 4:1 в пользу смешанного подхода.
Программист, который использует язык высокого уровня, не занят перем нием битов и может так решить задачу, так построить программу, что в ко концов достигнет действительно большого увеличения производительности. А граммисты, пишущие программы на языке ассемблера, обычно стараются так строить команды, чтобы сэкономить несколько циклов, поэтому у них такой с ации возникнуть не может.
Расскажем о двух экспериментах, проведенных во время разработки сист MULTICS. Грехем [49] описал процедуру PL/I, за три месяца переделанную в вую версию, которая была в 26 раз меньше и работала в 50 раз быстрее, чем ис ная. Он описал еще одну процедуру PL/L, которая получилась в 20 раз мен исходной и работала в 40 раз быстрее, чем исходная, после двух месяцев работы. бато [27] описал процедуру PL/I, размер кода которой был сокращен с 50 000 до 1000 слов менее чем за месяц, а контроллер уменьшен с 65 000 до 30 000 с увеличением производительности в 8 раз за 4 месяца. Здесь важно понимать у программистов языков высокого уровня глобальный подход к тому, что делают, поэтому они гораздо быстрее могут разработать лучший алгоритм.
Однако, несмотря на все это, существует по крайней мере 4 веские прич для изучения языка ассемблера. Во-первых, желательно уметь писать програ на языке ассемблера, поскольку успех или неудача большого проекта может з сеть от того, можно ли повысить производительность какой-то важной процед в 2 или 3 раза.
Во-вторых, язык ассемблера может быть единственным возможным выхо из-за недостатка памяти. Кредитные карты, например, содержат центральный цессор, но у них нет мегабайта памяти и жесткого диска. Однако они должны полнять сложные вычисления при наличии ограниченных ресурсов. Процесс встроенные в электроприборы, часто имеют минимальное количество памяти, скольку они должны быть достаточно дешевыми. Различные электронные уст ства, работающие на батарейках, обычно содержат очень маленькую память, этому здесь тоже нужен эффективный код.
В-третьих, компилятор должен либо давать на выходе программу, которая пользуется ассемблером, либо самостоятельно выполнять процесс ассемблир ния. Таким образом, понимание языка ассемблера существенно для понима того, как работает компьютер. И вообще, кто-то ведь должен писать компил и его ассемблер.
Наконец, изучение языка ассемблера дает прекрасное представление о ре ной машине. Для тех, кто изучает архитектуру компьютеров, написание прог мы на языке ассемблера — единственный способ узнать, что собой представ машина на архитектурном уровне.

5 2 2 Глава 7. Уровень языка ассемблера
ще. В таблицах 7.2-7.4 показаны фрагменты программ на языке ассембл Pentium II, Motorola 680x0 и (Ultra)SPARC. Все эти программы выполн числение N=I+J. Во всех трех примерах операторы над пропуском в табл полняют вычисление. Операторы под пропуском — это указания ассембле зервировать память для переменных I, J и N. Последние не являются симво репрезентациями машинных команд.
Таблица 7.2. Вычисление выражения N=l+J в Pentium II
Метка |
Код операции Операнды Комментарии |
||
FORMULA: |
MOV |
EAX.I |
; регистр ЕАХ=1 |
|
ADD |
EAX.J |
; регистр EAX=I+J |
|
MOV |
N.EAX |
; N=l+J |
1 |
DW |
3 |
; резервируем 4 байта и устанавливаем зна |
J |
DW |
4 |
; резервируем 4 байта и устанавливаем зна |
N |
DW |
О |
; резервируем 4 байта и устанавливаем зна |
Таблица 7.3. Вычисление выражения N=l+J в Motorola 680x0
Метка |
Код операции Операнды Комментарии |
||
FORMULA: |
MOVE.L |
I,DO |
; регистр D0=l |
|
ADD.L |
J,D0 |
; регистр D0=l+J |
|
MOVE.L |
D0,N |
; N=l+J |
I |
DC.L |
|
; резервируем 4 байта и устанавливаем зна |
J |
DC.L |
|
; резервируем 4 байта и устанавливаем зна |
N |
DC.L |
|
; резервируем 4 байта и устанавливаем зна |
Таблица 7.4. Вычисление выражения N=l+J в SPARC
Метка |
Код |
Операнды |
Комментарии |
|
операции |
|
|
FORMULA: |
SETHI |
%HI(I),%R1 |
! R1 = старшие биты адреса I |
|
LD |
[%R1+%LO(I)],%R1 |
! R1=l |
|
SETHI |
%HI(J),%R2 |
! R2 = старшие биты адреса J |
|
LD |
[%R2+%LO(J)],%R2 |
!R2=J |
|
NOP |
|
! ждем прибытия J из памяти |
|
ADD |
%R1,%R2,%R2 |
!R2=R1+R2 |
|
SETHI |
%HI(N),%R1 |
! R1 = старшие биты адреса N |
|
ST |
%R2, [%R1+%LO(N)] |
|