Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПО ОСРВ заочники.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.72 Mб
Скачать

2.6.4. Программирование в Unix кажется достаточно простым

Программа who - это программа, которая читает из файла и форматирует данные. Про­грамма ср - это программа, которая читает один файл и производит запись в другой файл.Обе программы используют одни и те же базовые системные вызовы для установления язей с файлами и организации передачи данных в файлы и из файлов. Из справочника и изз текстов заголовочных файлов мы будем извлекать всю информацию, которая будет обходима, чтобы понять, как писать такие программы.

Программирование в Unix не выглядит слишком затруднительным. Следует ли пропустить некоторые основополагающие вопросы? Давайте разберемся. Помимо трех вопросов, которые мы сформулировали в отношении Unix к программирования в Unix, есть еще ин важный вопрос: что можно сделать, чтобы это работало лучше?

2.7. Увеличение эффективности файловых операций ввода/ вывода: Буферирование

В программе ср1 содержится символьная константа BUFFERSIZE, которая задает размер массива в байтах, где содержатся данные по мере их передачи от исходного файла к целевому файлу. Это значение равно 4096. Возникает важный вопрос: какой размер буфера следует считать лучшим?

2.7.1. Какой размер буфера следует считать лучшим?

Давайте порассуждаем. Если вы используете половник для разлива супа по тарелкам, чем больше будет этот половник, тем меньше вам потребуется манипуляций с разливом меньше времени.

Рассмотрим файл длиной в 2500 байт. Можно выделить некоторые особенности при работе с ним:

Ех: Размер файла = 2500 bytes

Если buffer = 100 байт, тогда для копирования потребуется 25 системных вызовов read() и 25 write()

Если buffer = 1000 байт, тогда

для копирования потребуется 3 системных вызова read() и 3 write()

При изменении размера буфера со 100 байт до 1000 байт сокращается число системных вызовов read и write с 50 до 6.

В следующей ниже таблице показано время выполнения программы ср1 при копировании файла размером в 5 Мбайт при различных значениях BUFFERSIZE.

Размер буфера

Время выполнения в секундах

1

50.29

4

12.81

16

3.28

64

0.96

128

0.56

256

0.37

512

0.27

1024

0,22

Размер буфера

Время выполнения в секундах

2048

0.19

4096

0.18

8192

0.18

16384

0.18

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

2.7.2 Почему на системные вызовы требуется тратить время?

Чем определяются временные затраты при работе системных вызовов? На рисунке 2.5 схематично показан поток управления.

Рисунок 2.5

Поток управления при работе системных вызовов

На рисунке изображена память. Процесс развивается в пользовательской памяти, а ядро, располагается в системном пространстве. Диск доступен для ядра. Наша программа ср1 хочет читать данные, поэтому она обращается с системным вызовом read к ядру для чтения данных. Код, который производит фактическую передачу данных процессу с диска, явля­ется частью ядра. Поэтому управление от вашего кода в пользовательском пространстве будет передано коду ядра, находящемуся в системном пространстве. После этого процес­сор будет выполнять ту часть кода ядра, который организует передачу данных. На выпол­нение кода по передаче данных требуется время.

Но время требуется не только на передачу данных. Время требуется также и на переход в ядро и выход из ядра. Когда исполняется код ядра, процессор работает в супервизорном режиме со специальным стеком и памятью. При исполнении пользовательского кода про­цессор работает в пользовательском режиме.

Функции ядра должны иметь доступ к диску, терминалам, принтерам и другим ресурсам.

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

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

Ваша программа не является исключением. Чем больше времени процессор затрачивает ; на исполнение кода ядра и на вход в режим ядра и на выход из него, тем меньше времени у него остается для работы над вашим кодом или на обеспечение неких системных сервисов. Поскольку за время следует платить, то системные вызовы называют дорогими. Что приводит к удорожанию при чтении и записи данных в нашей версии программы who?