введение_1 (1085732), страница 12

Файл №1085732 введение_1 (Методическое пособие по Операционным системам) 12 страницавведение_1 (1085732) страница 122018-01-12СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 12)

Системный вызов (и библиотечная процедура) возвращает количество дей­ствительно прочитанных байтов в переменной count. Обычно эта величина совпа­дает с параметром nbytes, но может быть меньше, если, например, в процессе чте­ния процедуре встретился конец файла.

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

Системные вызовы выполняются за серию шагов. Вернемся к упоминавшему­ся выше примеру вызова read для того, чтобы разъяснить этот момент. Сначала при подготовке к вызову библиотечной процедуры read, которая фактически осуществляет системный вызов read, вызывающая программа помещает парамет­ры в стек, как показано в шагах 1-3 на рис. 1.17. Компиляторы С и C++ помещают параметры в стек в обратном порядке, так исторически сложилось (чтобы первым был параметр для printf, то есть строка формата оказалась на вершине стека). Пер­вый и третий параметры передаются по значению, а второй параметр передается по ссылке, то есть передается адрес буфера (на то, что это ссылка, указывает сим­вол &), а не его содержимое. Затем следует собственно вызов библиотечной про­цедуры (шаг 4). Эта команда процессора представляет собой обычную команду вызова процедуры и применяется для вызова любых процедур.

Библиотечная процедура, возможно, написанная на ассемблере, обычно по­мещает номер системного вызова туда, где его ожидает операционная система, например в регистр (шаг 5). Затем она выполняет команду TRAP (эмулированное прерывание) для переключения из пользовательского режима в режим ядра и на­чинает выполнение с фиксированного адреса внутри ядра (шаг 6). Запускаемая

программа ядра проверяет номер системного вызова и затем отправляет его нуж­ному обработчику, как правило, используя таблицу указателей на обработчики системных вызовов, индексированную по номерам вызовов (шаг 7). В этом месте начинает функционировать обработчик системных вызовов (шаг 8). Как только он завершает свою работу, управление может возвращаться в пространство пользо­вателя к библиотечной процедуре, к команде, следующей за командой TRAP (шаг 9). Эта процедура в свою очередь передает управление программе пользователя обыч­ным способом, которым производится возврат из вызванной процедуры (шаг 10). Чтобы закончить работу, программа пользователя должна очистить стек, как это делается и после каждого вызова процедуры (шаг 11). Учитывая, что стек рас­тет вниз, последняя команда увеличивает указатель стека ровно настолько, на­сколько нужно для удаления параметров, помещенных в стек перед запросом read. Теперь программа может продолжать свою работу.

А

Возврат к вызывающей процедуре

Переключение в режим ядрa

5 Передача кода для чтения в регистр

4 10 9

Увеличение показателя 11

Вызов read

  1. Передача f d

2 Передача &buffer

1 Передача nbytes

6

7 8 8

8

дреса
0xFFFFFFFF

Б иблиотечная

процедура read

П ространство

пользователя

Программа Программа

пользователя

вызывающая

read



Обработчик системного вызова


Я

Отправка

дро

О перации-

Оная

система

Рис. 1.17. 11 этапов выполнения системного вызова read(fd, buffer, nbytes)

На шаге 9 мы использовали выражение «может возвращаться в пространство пользователя к библиотечной процедуре...» не просто так. Системный вызов мо­жет блокировать вызвавшую его процедуру, препятствуя продолжению ее рабо­ты. Например, если она пытается прочесть что-то с клавиатуры, а там еще ничего не набрано, процедура должна быть блокирована. В этом случае операционная система ищет процесс, который может быть запущен следующим. Позже, когда нужное устройство станет доступно, система вспомнит о блокированном процессе и шаги 9-11 будут выполнены.

В следующих разделах мы рассмотрим некоторые из наиболее часто применяю­щихся системных вызовов стандарта POSIX или, точнее, библиотечных процедур, которые выполняют эти вызовы. В POSIX существует более 100 процедурных вызовов. Часть наиболее важных процедурных вызовов представлена в табл. 1.1, где они для удобства распределены в четыре группы. Далее мы кратко опишем каж­дый вызов и его действие. Службы, предоставляемые этими вызовами, в значи­тельной степени определяют действия операционной системы, так как управле­ние ресурсами на персональном компьютере минимально (по крайней мере, по сравнению с большими машинами, на которых работают несколько пользовате­лей). К этим службам относятся такие функции, как создание и завершение про­цессов, создание, удаление, чтение и запись файлов, управление каталогами, вы­полнение ввода и вывода.

Таблица 1.1. Некоторые из основных системных вызовов POSIX

В ызов Описание

У правление процессами

P id=fork()1 Создает дочерний процесс, идентичный родительскому

Pid=waitpid(pid, &statloc, options) Ожидает завершения дочернего процесса

s=execve(name, argv, environp) Перемещает образ памяти процесса

Exit(status) Завершает выполнение процесса и возвращает статус

У правление файлами

f d=open(file, how,...) Открывает файл для чтения, записи или того и другого

s=close(fd) Закрывает открытый файл

n=read(fd, buffer, nbytes) Читает данные из файла в буфер

n=write(fd, buffer, nbytes) Пишет данные из буфера в файл

Position=lseek(fd, offset, whence) Передвигает указатель файла

s=stat(name, &buf) Получает информацию о состоянии файла

У правление каталогами и файловой системой

s =mkdir(name, mode) Создает новый каталог

s=rmdir(name) Удаляет пустой каталог

s=link(name1, name2) Создает новый элемент с именем name2, указывающий

на namel

s=unlink(name) Удаляет элемент каталога

s=mount(special, name, flag) Монтирует файловую систему

s=umount(special) Демонтирует файловую систему

Р азные

s =chdir(dimame) Изменяет рабочий каталог

s=chmod(name, mode) Изменяет биты защиты файла

s=kill(pid, signal) Посылает сигнал процессу

Seconds=time(&seconds) Получает время, прошедшее с 1 января 1970 года

1 Возвращаемая величина s равна -1, если произошла ошибка. Возвращаемые коды выглядят так: pid выдает идентификатор процесса, fdописатель файла, п — количество байтов, positionсмещение в файле и secondsпрошедшее время. Параметры описываются дальше в тексте.

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

Системные вызовы для управления процессами

Первая группа в табл. 1.1 управляет процессами. Начнем рассмотрение с вызова fork. Системный вызов fork (разветвление) является единственным способом со­здания нового процесса в UNIX. Он создает точную копию исходного процесса, включая дескрипторы файла, регистры и т. п. После вызова fork исходный процесс и его копия (родительский и дочерний) развиваются по отдельности друг от друга. Все переменные имеют одинаковые величины во время вызова fork, но как только родительские данные скопированы для создания дочернего процесса, последу­ющие изменения в одном из них уже не влияют на другой. (Текст программы, ко­торый не изменяется, распределяется между родительским и дочерним процес­сами). Вызов fork возвращает величину, равную нулю в дочернем процессе и равную идентификатору дочернего процесса или PID в родительском. Используя возвра­щенный PID, два процесса могут различить, какой из них родительский, а какой — дочерний.

В большинстве случаев после вызова fork дочернему процессу необходимо вы­полнить программный код, отличный от предназначенного для родительского про­цесса. Рассмотрим пример оболочки. Она читает команды с терминала, запускает дочерний процесс, ждет, пока дочерний процесс выполнит команду, и читает сле­дующую команду после завершения работы дочернего процесса. Ожидая, пока дочерний процесс закончит работу, родительский процесс выполняет системный вызов waitpid, который ожидает завершения дочернего процесса (или всех дочер­них процессов, если их на данный момент несколько). Waitpid может ждать окон­чания какого-либо определенного дочернего процесса или любого дочернего про­цесса, для этого нужно задать первый параметр вызова равным -1. Когда waitpid выполнен, указатель, задаваемый вторым параметром statlос, будет установлен на статус завершения дочернего процесса (нормальное или аварийное завершение и выходное значение). Третий параметр определяет различные необязательные настройки.

Теперь рассмотрим, как вызов fork используется оболочкой. Когда печатается команда, оболочка создает дочерний процесс, который должен выполнить коман­ду пользователя. Он делает это с помощью системного вызова execve, заменяюще­го весь его образ памяти файлом, названным в первом параметре. (Фактически самим системным вызовом является exec, но несколько различных библиотечных

процедур вызывают его с разными параметрами и незначительно отличающимися именами. Мы здесь воспользуемся ими как системными вызовами.) Весьма упро­щенная оболочка, иллюстрирующая использование команд fork, waitpid и execve, показана в листинге 1.1.

Листинг 1.1. Усеченная оболочка1

#define TRUE I

while (TRUE) { /* вечный цикл */

Характеристики

Тип файла
Документ
Размер
798,5 Kb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6381
Авторов
на СтудИзбе
308
Средний доход
с одного платного файла
Обучение Подробнее