Добавлен: 29.10.2018
Просмотров: 48034
Скачиваний: 190
926
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
14. Имеет
ли
смысл забирать у процесса память, когда процесс переходит в состояние
зомби? Почему да или почему нет?
15. С каким аппаратным понятием тесно связан сигнал? Приведите два примера ис-
пользования сигналов.
16. Как вы думаете, почему разработчики операционной системы Linux сделали для
процесса невозможной отправку сигналов другим процессам, не входящим в его
группу процессов?
17. Обычно системный вызов реализуется при помощи команды эмулированного
(программного) прерывания. Может ли для этого на компьютере Pentium ис-
пользоваться обычный вызов процедуры? Если да, то при каких условиях и как?
Если нет, то почему?
18. Какие процессы, как правило, обладают более высоким приоритетом, демоны или
интерактивные процессы?
19. При создании нового процесса ему должен быть присвоен уникальный номер PID.
Достаточно ли для этого хранить в ядре счетчик, увеличивающийся на единицу
при создании каждого нового процесса, и использовать этот счетчик как новый
PID? Аргументируйте свой ответ.
20. В структуре задачи для каждого процесса хранится PID родительского процесса.
Зачем?
21. Механизм копирования при записи используется в системном вызове fork как
средство оптимизации: копия страницы создается только в том случае, если один
из процессов (родительский или дочерний) пытается записать данные в страницу.
Предположим, что процесс p1 породил друг за другом процессы p2 и p3. Объяс-
ните, как в таком случае может вестись управление совместным использованием
страниц.
22. Какая комбинация битов sharing_flags, используемых командой clone в Linux,
соответствует стандартному системному вызову fork в UNIX? Созданию потока
в UNIX?
23. Две задачи, A и B, нужны для выполнения одинакового объема работы. Но задача A
имеет более высокий приоритет, и ей нужно выделять больше времени централь-
ного процессора. Объясните, как этого можно достичь в каждом из планировщиков
Linux, описанных в данной главе, в O(1) и в CFS.
24. Ряд UNIX-систем работает в режиме без тиков, следовательно, у них нет пери-
одических прерываний от таймера. Зачем это делается? И имеет ли смысл ис-
пользовать режим без тиков на компьютере (например, на встроенной системе),
запускающем только один процесс?
25. При загрузке операционной системы Linux (и большинства других операци-
онных систем) начальный загрузчик, хранящийся в 0-м секторе диска, сначала
загружает программу загрузки, которая затем загружает операционную систему.
Зачем требуется этот лишний промежуточный этап? Было бы проще, если бы
хранящийся в 0-м секторе диска начальный загрузчик загружал операционную
систему напрямую.
26. Предположим, что редактор состоит из 100 Кбайт кода программы, 30 Кбайт ини-
циализированных данных и 50 Кбайт BSS. Начальный размер стека составляет
Вопросы
927
10 Кбайт. Предположим, что одновременно запускаются три копии этого редак-
тора. Сколько потребуется физической памяти:
а) если используется общий текстовый сегмент;
б) общий текстовый сегмент не используется?
27. Почему для Linux нужны таблицы дескрипторов открытых файлов?
28. В Linux сегменты данных и стека подкачиваются постранично и выгружаются во
временные копии, хранящиеся на специальном диске подкачки или в дисковом
разделе подкачки, но для подкачки текстового сегмента используется сам испол-
няемый файл. Почему?
29. Опишите способ использования системного вызова mmap и сигналов для создания
механизма межпроцессного взаимодействия.
30. Файл отображается на память с помощью системного вызова mmap следующим
образом:
mmap(65536, 32768, READ, FLAGS, fd, 0)
Размер страниц 8 Кбайт. Какой байт файла будет считан при обращении к адресу
памяти 72 000?
31. После выполнения системного вызова из предыдущей задачи процесс делает
системный вызов
munmap(65536, 8192)
Будет ли он выполнен успешно? Если да, то какие байты файла останутся ото-
браженными на память? Если нет — почему нет?
32. Может ли страничная ошибка привести к завершению работы вызвавшего ее про-
цесса? Если да, приведите пример. Если нет, то почему нет?
33. Возможно ли, чтобы при использовании приятельской системы управления памя-
тью два соседних свободных блока одинакового размера сосуществовали и не были
объединены в один блок? Если да, приведите пример, как это может произойти.
Если нет — докажите, что это невозможно.
34. В тексте утверждалось, что производительность страничной подкачки выше при
выгрузке в отдельный раздел диска, а не в файл. Почему это так?
35. Приведите два примера преимущества относительных путей перед абсолютными.
36. Несколько процессов делают следующие вызовы блокировки. Скажите, что про-
изойдет при каждом вызове. Если процесс не может получить блокировку, то он
блокируется сам:
1) процесс A хочет получить блокировку без монополизации байтов с 0-го по 10-й;
2) процесс B хочет получить блокировку с монополизацией байтов с 20-го по 30-й;
3) процесс C хочет получить блокировку без монополизации байтов с 8-го по 40-й;
4) процесс A хочет получить блокировку без монополизации байтов с 25-го
по 35-й;
5) процесс B хочет получить блокировку с монополизацией байта 8.
37. Рассмотрим блокированный файл на рис. 10.16, в. Предположим, что процесс
пытается получить блокировку байтов 10 и 11 и блокируется. Затем, прежде чем
928
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
процесс C отпустит свою блокировку, еще один процесс пытается получить блоки-
ровку байтов 10 и 11 и также блокируется. Какую проблему добавляет к семантике
эта ситуация? Предложите два решения и обоснуйте их.
38. Объясните, в каких ситуациях процессу может потребоваться блокировка без
монополизации или блокировка с монополизацией. Какие проблемы могут воз-
никать у процесса, запросившего блокировку с монополизацией?
39. Что могут сделать с файлом в Linux его владелец, группа владельца и все осталь-
ные пользователи, если режим защиты файла равен 755 (восьмеричное)?
40. У
некоторых накопителей на магнитной ленте есть нумерованные блоки и возмож-
ность перезаписывать определенные блоки, не затрагивая соседние блоки. Может
ли подобное устройство содержать смонтированную файловую систему Linux?
41. На рис. 10.14 после создания связи у Фреда и Лизы есть доступ к файлу
x
в своих
каталогах. Является ли доступ к этому файлу абсолютно симметричным, то есть
обладают ли оба пользователя одинаковыми правами по отношению к этому
файлу?
42. Как было показано, абсолютные пути файлов отсчитываются от корневого ката-
лога, а относительные — от рабочего каталога. Предложите эффективный способ
реализации обоих способов поиска файлов.
43. Когда открывается файл
/usr/ast/work/f
, требуется несколько обращений к диску,
чтобы прочитать i-узел и блоки каталога. Сосчитайте количество необходимых
дисковых обращений при условии, что i-узел корневого каталога постоянно на-
ходится в памяти, а размер всех каталогов — 1 блок.
44. I-узел в системе Linux содержит 12 дисковых адресов для блоков данных, а также
адреса одинарного, двойного и тройного косвенных блоков. Чему равен мак-
симальный размер файла, если каждый из косвенных блоков может содержать
256 дисковых адресов, а размер дискового блока равен 1 Кбайт?
45. Когда при открытии файла с диска считывается i-узел, он помещается в хранящу-
юся в памяти таблицу i-узлов. В этой таблице есть поля, отсутствующие на диске.
Одно из них — это счетчик, отслеживающий количество обращений к i-узлу. Зачем
нужно это поле?
46. На многопроцессорных платформах Linux поддерживает очередь выполнения для
каждого процессора. Хорошая ли это идея? Объясните свой ответ.
47. Концепция загружаемых модулей может пригодиться потому, что новые драйверы
устройств могут быть загружены в ядро в ходе работы системы. Назовите два не-
достатка такой концепции.
48. Потоки pdflush периодически просыпаются для записи на диск очень старых
страниц — старше 30 с. Зачем это нужно ?
49. Когда операционная система перезагружается после сбоя, то, как правило, выпол-
няется программа восстановления. Предположим, эта программа обнаруживает,
что значение счетчика связей в i-узле равно 2, но только одна запись каталога ссы-
лается на данный i-узел. Может ли программа восстановления исправить такую
ошибку, и если да, то как?
50. Попытайтесь угадать, какой системный вызов Linux выполняется быстрее всех.
Вопросы
929
51. Возможно ли сделать unlink для файла, для которого связь никогда не создавалась?
Что произойдет?
52. Основываясь на информации, представленной в данной главе, определите, какой
максимальный объем данных пользователя можно разместить на дискете емкостью
1,44 Мбайт, если использовать файловую систему Linux ext2? Предположим, что
размер блоков диска равен 1 Кбайт.
53. Учитывая все неприятности, которые могут причинить студенты, если они получат
права доступа суперпользователя, можете ли вы сказать, зачем вообще существует
понятие суперпользователя?
54. Профессор пользуется общими файлами вместе со своими студентами, помещая
их в каталог, к которому предоставлен публичный доступ. Этот каталог рас-
положен в системе Linux на компьютере факультета вычислительной техники.
Однажды профессор спохватывается, что разрешил доступ записи к одному из
файлов для всех пользователей. Он изменяет разрешения доступа и убеждается,
что файл соответствует оригиналу. На следующий день профессор обнаружи-
вает, что файл был изменен. Как это могло произойти и как это можно было
предотвратить?
55. Linux поддерживает системный вызов fsuid. В отличие от setuid, который предо-
ставляет пользователю все права рабочего идентификатора (имеющиеся у вы-
полняемой им программы), fsuid предоставляет выполняющему программу
пользователю специальные права только для доступа к файлам. Почему такая
функция полезна?
56. В
Linux-системе перейдите к каталогу
/proc/####
, где
####
является десятичным
числом, соответствующим процессу, запущенному в данный момент в системе.
Ответьте на следующие вопросы, дав развернутые объяснения:
а) Каков размер большинства файлов в этом каталоге?
б) Какое время и какая дата установлены для большинства этих файлов?
в) Какой тип прав доступа предоставляется пользователям вотношении этих
файлов?
57. Как при написании Android-активности для отображения веб-страницы в браузере
реализуется его состояние активности, сохраняемое для минимизации объема со-
храненного состояния без потери чего-либо важного?
58. Если вы пишете код для работы в сети на Android, использующий сокет для за-
грузки файла, то что при этом нужно принять в расчет в отличие от стандартной
Linux-системы?
59. Станете ли вы при разработке чего-то вроде zygote-процесса Android для системы
с несколькими потоками, запущенными в каждом ответвленном от него процессе,
отдавать предпочтение запуску таких потоков в zygote-процессе или же будете
запускать их после создания дочернего процесса?
60. Представьте, что Android Binder IPC используется для отправки объекта другому
процессу. Позже вы получаете объект при вызове вашего процесса и обнаружива-
ете, что получили тот же самый объект, что был отправлен вами ранее. Что можно
предположить в отношении того процесса, который вызвал ваш процесс?
930
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
61. Рассмотрите Android-систему, на которой сразу же после запуска выполняются
следующие действия:
1) запускается домашнее (загрузочное) приложение;
2) запускается в фоновом режиме синхронизация приложения электронной по-
чты с почтовым ящиком;
3) пользователь запускает приложение для фотокамеры;
4) пользователь запускает веб-браузер.
Теперь веб-страница, просматриваемая пользователем в браузере, требует все
больше и больше оперативной памяти, пока ей не понадобится все, что она может
получить. Что при этом происходит?
62. Напишите минимальную оболочку, способную выполнять простые команды. Она
также должна быть способна запускать эти команды в фоновом режиме.
63. С помощью ассемблера и вызовов BIOS напишите программу, загружающуюся
с гибкого диска на компьютере с процессором Pentium. Эта программа должна
использовать вызовы BIOS для чтения ввода с клавиатуры и вывода эха вводимых
символов на экран (просто чтобы продемонстрировать, что она работает).
64. Напишите программу для неинтеллектуального терминала, позволяющую соеди-
нить две (управляемые операционными системами Linux) рабочие станции через
последовательные порты. Используйте для настройки портов вызовы управления
терминалом стандарта POSIX.
65. Напишите клиент-серверное приложение, которое по запросу передает большой
файл (через сокеты). Переделайте это приложение с использованием разделяемой
памяти. Какая версия будет иметь более высокую производительность? Почему?
Проведите замеры производительности с использованием файлов разного размера.
Что вы установили? Что внутри ядра Linux вызывает такое поведение?
66. Реализуйте простую библиотеку потоков пользовательского уровня, которая
будет работать поверх Linux. Интерфейс прикладного программирования библи-
отеки должен содержать такие вызовы функций: mythreads_init, mythreads_create,
mythreads_join, mythreads_exit, mythreads_yield, mythreads_self и, возможно, еще
несколько. Затем реализуйте для обеспечения безопасности одновременно выпол-
няемых операций следующие переменные синхронизации: mythreads_mutex_init,
mythreads_mutex_lock, mythreads_mutex_unlock. До начала четко определите ин-
терфейс прикладного программирования и укажите семантику каждого вызова.
Затем реализуйте библиотеку пользовательского уровня с простым вытесняющим
(по циклической схеме) планировщиком. Вам также понадобится написать одно
или несколько многопоточных приложений, которые будут использовать вашу
библиотеку (чтобы протестировать ее). И наконец, замените простой механизм
планировщика другим, который ведет себя как планировщик ядра 2.6 системы
Linux (описанный в этой главе). Сравните производительность ваших приложений
при использовании разных планировщиков.
67. Напишите сценарий оболочки, отображающий ряд важной системной информа-
ции, например количество запущенных процессов, ваш главный каталог и текущий
каталог, тип процессора, текущую загруженность центрального процессора и т. п.