Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

1. Сначала вам нужно создать тестовый входной файл размером, скажем, 1 Мбайт и именем file.in.

2. Далее откомпилируйте программу copy_system.c.

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

int main {

 char c;

 int in, out;

 in = open("file.in", O_RDONLY);

 put = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);

 while(read(in, &c, 1) == 1) write(out, &c, 1);

 exit(0);

}

Примечание

Имейте в виду, что строка

#include <unistd.h>
должна быть первой, поскольку она определяет флаги, касающиеся соответствия стандарту POSIX и способные повлиять на другие включенные в
#include
файлы.

3. Выполнение программы даст результат, похожий на следующий:

$ TIMEPORMAT="" time ./copy_system

4.67user 146.90system 2:32.57elapsed 99%CPU

...

$ ls -ls file.in file.out

1029 -rw-r--r-- 1 neil users 1048576 Sep 17 10:46 file.in

1029 -rw------- 1 neil users 1048576 Sep 17 10:51 file.out

Как это работает

Вы используете команду

time
для определения времени выполнения программы. В ОС Linux переменная
TIMEFORMAT
применяется для переопределения принятого по умолчанию в стандарте POSIX формата вывода времени, в который не включено время использования ЦПУ. Как видите, что в этой очень старой системе входной файл file.in размером 1 Мбайт был успешно скопирован в файл file.out, созданный с правами на чтение/запись только для владельца. Копирование заняло две с половиной минуты и затратило фактически все доступное время ЦПУ. Программа так медлительна потому, что вынуждена была выполнить более двух миллионов системных вызовов.

В последние годы ОС Linux продемонстрировала огромные успехи в повышении производительности системных вызовов и файловой системы. Для сравнения аналогичный тест с применением ядра 2.6 занял чуть менее 14 секунд:

$ TIMEFORMAT="" time ./copy_system

2.08user 10.59system 0:13.74elapsed 92%CPU

...

Упражнение 3.2. Вторая версия программы кодирования файла

Вы можете добиться лучших результатов, копируя блоки большего размера. Взгляните на модифицированную программу copy_block.c, которая копирует файл блоками в 1 Кбайт и снова использует системные вызовы.

#include <unistd.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <stdlib.h>

int main {

 char block[1024];

 int in, out;

 int nread;

 in = open("file.in", O_RDONLY);

 out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);

 while((nread = read(in, block, sizeof(block))) > 0)

write(out, block, nread);

 exit(0);

}

Теперь испытайте программу, но сначала удалите старый выходной файл.

$ rm file.out

$ TIMEFORMAT="" time ./copy_block

0.00user 0.02system 0:00.04elapsed 78%CPU

...

Как это работает

Теперь программа выполняется только сотые доли секунды, поскольку ей требуется около 2000 системных вызовов. Конечно, это время очень зависит от системы, но оно показывает, что системные вызовы сопряжены с поддающимися измерению издержками, поэтому их применение стоит оптимизировать.

Другие системные вызовы для управления файлами

Существует ряд других системных вызовов, оперирующих низкоуровневыми дескрипторами файлов. Они позволяют программе контролировать использование файла, возвращая информацию о его состоянии,

  • Читать дальше
  • 1
  • ...
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: