21. Лимиты системы


О каких лимитах идет речь

ОСРВ QNX Neutrino основана на микроядре, поэтому те ограничения, которые в других операционных системах были бы связаны с ядром, в данном случае будут зависеть только от того или иного администратора, реализующего соответствующую службу в ОСРВ QNX Neutrino. Особенно это относится к файловым системам и тем случаям, когда одновременно применяется несколько разных файловых систем.

Многие ресурсы зависят от объема доступной памяти. Другие лимиты зависят от целевой системы. Например, виртуальное адресное пространство для процесса может составлять от 32 Мбайт на архитектуре ARM до 3,5 Гбайт на архитектуре x86.

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

Конфигурационные лимиты

Когда вы пытаетесь выяснить ограничения для системы, то нужно рассмотреть конфигурационные лимиты (configurable limit) — специальные переменные с атрибутами "только чтение", в которых сохраняется системная информация.

Примечание. В ОСРВ Neutrino поддерживаются также конфигурационные строки (configu­rable string), которые похожи на переменные окружения и часто используются совместно с ними. Подробнее об этом см. раздел 9.

Получить значения конфигурационных лимитов или строк можно с помощью утилиты getconf (POSIX). Поскольку утилита getconf относится к интерфейсу POSIX, то ее можно использовать в сценариях вместо жестко запрограммированных в QNX значений лимитов, что позволяет адаптировать сценарии к другим конфигурационным параметрам POSIX.

Некоторые конфигурационные лимиты связаны с путями. Их имена начинаются с _PC_. Когда вы запрашиваете значения этих параметров, то при запросе должен быть указан путь (см. подразд. "Лимиты файловой системы" далее в этом разделе). Например, для получения максимальной длины для имени файла нужно ввести:

getconf _PC_NAME_MAX имя_для_пути


Другие ограничения связаны с системой в целом. Имена этих параметров начинаются с _SC_, и при их извлечении указание пути не требуется. Например, для получения максимального числа файлов, которые может открывать процесс, нужно ввести команду:

getconf _SC_OPEN_MAX

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

В библиотеках ОСРВ Neutrino имеется несколько различных функций, которые можно использовать в программах для работы со значениями конфигурационных лимитов, связанных с конфигурацией:
Лимиты файловой системы

Файловые системы в ОСРВ Neutrino не являются частью ядра или базовых компонентов операционной системы. Файловые системы представляют собой отдельно загружаемые процессы или библиотеки.

Под этим понимается следующее:
В последующих разделах будут приведены ограничения для поддерживаемых файловых систем. Имейте в виду следующее:
Запрос лимитов файловой системы

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

Файловая система QNX 4

Далее приведены лимиты для файловых систем QNX 4:

Файловая система Power-Safe (fs-qnx6.so)

Лимиты для файловой системы Power-Safe (поддерживаемой fs-qnx6.so):

При размере блока 2 Кб, каждый блок поддерживает 512 указателей и соответственное масштабирование.

Файловая система Ext2

Далее приведены лимиты для файловых систем Linux Ext2:
Файловая система DOS FAT12/16/32

Далее приведены лимиты для файловых систем DOS FAT12/16/32:
В перечисленных файловых системах не поддерживается установка прав доступа к файлам, но эту функцию можно эмулировать.

Файловая система CD-ROM (ISO 9660)

Далее приведены лимиты для файловых систем CD-ROM (ISO 9660):
Примечание. Взамен fs-cd.so лучше использовать fs-udf.so, поддерживающий файловую систему ISO-9660 в дополнение к UDF. Дополнительную информацию о лимитах UDF, см. в «Файловая система UDF» далее в этом разделе.

Файловая система NFS2 и NFS3

Далее приведены лимиты для файловых систем NFS2 и NFS3:
Файловая система CIFS

Далее приведены лимиты для файловых систем CIFS:
Файловая система CIFS не поддерживает использование функций chmod или chown.

Встраиваемая файловая система

Далее приведены лимиты для встраиваемых файловых систем (для флэш-памяти):
Записи для файлов, каталогов и файловых экстентов представляют собой связанные списки. Чем длиннее список, тем больше времени требуется для поиска места, где нужно присоединить данные или получить связанную с файлом статистику.

Встраиваемая транзакционная файловая система (Embedded Transaction filesystem (ETFS))


Лимиты для ETFS:

Для флеш-памяти NAND существуют дополнительные лимиты:

поддерживается только секция одного уровня (single-level cell (SLC)) NAND flash;

максимальный размер файловой системы 4 Гб;

защита резервной области ECC поддерживается только 2 Kб и 4 Kб страницами памяти NAND;

программное обеспечение ECC поддерживает только 1-битную коррекцию ошибок для каждого 256-байтного буфера;

поддерживается только флеш-память NAND с размерами страниц памяти 512, 2048 и 4096 байт.


Для ETFS на NAND необходимо выполнить программную кодировку 1-битной коррекции ошибок (ECC) для данных в резервной области. Поддерживаемые конфигурации доступны для:

• 2 Kб страниц памяти устройства памяти NAND;

• 4 Kб страниц памяти устройства памяти NAND.

Установлено, что резервная область получает значение ECC от devio_postcluster(), и после этого записывает его на устройство памяти NAND. Для определения соответсвующего размера значения ECC необходимо использовать следующее:

для 512 NAND, не доступно;

для 2048 NAND, используется 64 байт ECC;

для 4096 NAND, используется 128 байт ECC;

Для установки приоритета резервной области необходимо выполнить следующие изменения для BSP:

для devio_readtrans() и devio_readcluster() — при чтении резервной области, в первую очередь сохраняется резервная область ECC, после этого задаются области резервной структуры 0xFF, которые запрашивают определение циклического контроля избыточности (CRC — проверка сохранности данных для устройства памяти NAND). Выполняется определение CRC, и если произошел сбой, для восстановления необходимо попробовать использовать другую резервную область значения ECC. Если резервная область ECC исправна, действия CRC игнорируются. Если резервная область ECC была скорректирована, устанавливается tacode в структуре транзакции ETFS_TRANS_ECC. Если ECC не было скорректирована, устанавливается tacode для ETFS_TRANS_DATAERR;

для devio_postcluster() — после определения CRC и ECC для кластера данных, и определения CRC для резервной области, добавляется определение ECC для резервной области. При выполнении определения CRC, необходимо использовать 0xFF в качестве символа-заполнителя для резервной области ECC.

Файловая система UDF

Лимиты для файловой системы UDF:

Какие-либо действия в файловой системе с использованием fs-udf.so запрещены. Данная файловая система доступна только для чтения.

Apple Macintosh HFS и HFS Plus

Лимиты для Apple Macintosh HFS (Hierarchical File System) и HFS Plus:
Какие-либо действия в файловой системе с использованием fs-mac.so запрещены. Данная файловая система доступна только для чтения.

 Файловая система Windows NT

Лимиты для файловой системы Windows:
Данная файловая система доступна только для чтения.

Другие системные лимиты

Приведенные далее лимиты относятся ко всей системе в целом:
В платформе ARM лимит установлен практически на количество разделенных адресных пространств; можно запустить больше процессов, если они будут происходить в разделенном адресном пространстве, благодаря vfork(), но это исключительный случай.

К каждому процессу применимы следующие лимиты:
Приоритет с номером 0 используется для потока ожидания. По умолчанию приоритеты с номерами более 64 относятся к категории привилегированных, поэтому использовать их могут только пользователи с ID=0 (т. е. имеющие учетную запись root). Остальным пользователям доступны приоритеты от 1 до 63.

Изменить диапазон привилегированных приоритетов можно с помощью утилиты procnto при использовании ключа -P.

- asyncmsg_malloc()

- calloc()

- iofunc_lock_calloc()

- malloc()

- memalign()

- realloc()

- valloc()


Файловые дескрипторы

Полное число файловых дескрипторов жестко ограничено значением 32 767 для каждого процесса, но, скорее всего, ограничение будет задано с помощью ключа -F при использовании утилиты procnto или системной переменной RLIMIT_NOFILE. Значение по умолчанию равно 1000, минимальное значение равно 100.

Примечание. Имейте в виду, что файловые дескрипторы используются сокетами, именованными семафорами, очередями сообщений, идентификаторами соединений (coids).

Для того чтобы получить установленное в текущий момент времени значение для этого параметра, используйте встроенную команду ksh, утилиту ulimit (см. в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01) или вызовите библиотечную процедуру getrlimit() (см. руководство по библиотекам "Library Refe­rence").

Примитивы для синхронизации

Не существует никаких ограничений на количество мьютексов (mutex) и переменных для условий (condvars).

Нет также ограничений на количество непоименованных семафоров, но количество именованных семафоров ограничивается числом доступных дескрипторов (см. предыдущий раздел).

Лимиты для протокола TCP/IP

Число открытых соединений и сокетов ограничивается только доступной памятью и максимальным числом файловых дескрипторов на каждый процесс (см. подразд. "Файловые дескрипторы" ранее в этом разделе).

Разделяемая память

Число областей разделяемой памяти ограничено разрешенным виртуальным адресным пространством, которое зависит от архитектуры целевой системы. См. описание ресурсных переменных RLIMIT_AS и RLIMIT_DATA для библиотечной процедуры setrlimit() в руководстве по библиотекам "Neutrino Library Reference".

Очереди сообщений

Количество очередей сообщений ограничено числом доступных файловых дескрипторов (см. разд. "Файловые дескрипторы" ранее в этом разделе).

Установленное по умолчанию максимальное число записей в очереди и установленный по умолчанию максимальный размер записи для очереди зависит от того, используете вы для реализации очереди традиционный подход (mqueue) или альтернативный (mq) (табл. 21.1).

Таблица 21.1

Атрибут

Традиционный подход

Альтернативный подход

Число записей

1024

64

Размер сообщения

4096

256


Более подробно об этом см. описание команд mqueue и mq в руководстве "Описание программы. Часть 1. Справочник по утилитам" КПДА.10964-01 13 01 и описание функции mq_open() в руководстве по библиотекам Neutrino "Library Reference".

 Ограничения, связанные с платформой

Таблица 21.2

Ограничение на

x86

PPC

MIPS

SH-4

ARMv4

ARMv6

Системное ОЗУ

64 Гбайт (36-битовая адресация)

64 Гбайт (36-битовая адресация)

1 Тбайт

(40-битовая адресация)

512 Мбайт

(29-битовая адресация)

4 Гбайт

(32-битовая адресация)

512 MB

(32-битовая адресация)***

ЦПУ*

8

8

8

1

1

1

Виртуальное адресное пространство**

3,5 Гбайт

3 Гбайт

2 Гбайт

2 Гбайт

32 Мбайт

2 Гбайт


Примечание. * — применяемое оборудование может определять дополнительные лимиты на количество ЦПУ. ** — приведены абсолютные максимальные лимиты для виртуального адресного пространства. Эти значения можно уменьшить, изменив параметр RLIMIT_AS с помощью функции setrlimit(). *** – 32-битная адресация устанавливает 4 Гб пространства данных, но оно не может быть все использовано для RAM системы на некоторых платформах. Некоторое количество пространства данных зарезервировано для устройств, и некоторые платформы могут накладывать ограничения.