OSDev http://osdev.su/ |
|
Размер идентификатора http://osdev.su/viewtopic.php?f=6&t=436 |
Страница 1 из 2 |
Автор: | 418ImATeapot [ 19 авг 2011, 19:23 ] |
Заголовок сообщения: | Размер идентификатора |
Какого размера должен быть PID, ThID и пр? Знаю, что обычно DWORD. Это связано с производительностю или это - просто страховка от повторений? |
Автор: | SII [ 19 авг 2011, 19:46 ] |
Заголовок сообщения: | Re: Размер идентификатора |
А это уж исходя из требований к системе и из того, что реально эти номера означают... |
Автор: | 418ImATeapot [ 19 авг 2011, 19:53 ] |
Заголовок сообщения: | Re: Размер идентификатора |
Просто номер в ассоциативном массиве. Если, к примеру, вычеркиваем поток из списка, надо закрыть все его сокеты. |
Автор: | SII [ 19 авг 2011, 21:00 ] |
Заголовок сообщения: | Re: Размер идентификатора |
Тогда лучше исходить из максимально возможного в теории количества этих самых номеров: память впустую тратить смысла нет, производительности это ну никак не добавит. У меня, например, все номера имеют смысл только внутри задач, поэтому я сделал их 16-разрядными, причём у меня их несколько категорий, поскольку я считаю неправильным валить в одну кучу совершенно разные вещи. 16 бит, думается, для реальных случаев вполне достаточно: трудно представить себе задачу, которой потребуется держать открытыми больше 64 К файлов или имеющую такую кучу каких-либо объектов (тем более, что я работаю с АРМом, где пока 64-разрядных процессоров нет в принципе, ну а на 32-разрядных такое количество использовать проблематично: память, пожалуй, раньше кончится). |
Автор: | phantom-84 [ 19 авг 2011, 21:53 ] |
Заголовок сообщения: | Re: Размер идентификатора |
Идентификаторы и описатели - это немного разные вещи. Чем идентификатор "шире", тем обычно лучше, но не нужно сильно увлекаться. В общем размерность идентификатора для объекта данного типа нужно выбирать в зависимости от величины минимально возможного времени между созданием двух объектов этого типа. Чисто инкрементные идентификаторы не слишком эффективны в плане поиска объектов, которым они соответствуют. Лучше использовать идентификаторы, состоящие из двух частей - инкрементной и позиционной (указывающей на местоположение данного объекта). Естественно, позиционную часть в структуре самого объекта хранить не обязательно. |
Автор: | pavia [ 21 авг 2011, 14:43 ] |
Заголовок сообщения: | Re: Размер идентификатора |
Я лично взял 4 байтрные. Так как массивы у меня динамические и они могут быть сколь угодно большими. Ограничения только память и тип переменной под размер. 16 бит это не мало 65 536, но с другой стороны и немного. У некоторых в браузере бывает под 500вкладок открыто, а если учесть что во вкладке под 20 картинок то имеем 10 000. На самом деле я реальную задачу придумать не могу. Но я не люблю ограничения. Во вторых история развития жёстких дисков учит что ресурсов никогда много не бывает. Вначале под адрес отвели три 8-битовых числа. Потом пришлось бороться с нехваткой 8 битовости и число цилиндров увеличили до 10 битового числа. Потом головки с 63 штук пришлось транслировать в 255. А ещё после в LBA не хватило 24 бит и сделали 28 бит которые сами понимаете закончились года через 2. А ещё было 32 битные переменные в функции вычисляющие адреса. Вердикт каждые 4 года приходилось переписывать софт. Так что я выбрал 4 байта. Это должно хватить всем и на долго. Во вторых унификация все идентификаторы имеют стандартный размер и для всех них есть стандартные функции одна на все типы идентификаторов. По поводу инкрементных пока не придумал где их можно использовать. Так как система может работать 24 часа 7 дней в неделю несколько лет. И в результате может переполнится счётчик. А что делать если 0 ресурс был выделен, но не освобождён? Получится коллизия. |
Автор: | SII [ 21 авг 2011, 15:54 ] |
Заголовок сообщения: | Re: Размер идентификатора |
pavia писал(а): Я лично взял 4 байтрные... 16 бит это не мало 65 536, но с другой стороны и немного. У некоторых в браузере бывает под 500вкладок открыто, а если учесть что во вкладке под 20 картинок то имеем 10 000. На самом деле я реальную задачу придумать не могу. Но я не люблю ограничения. Во вторых история развития жёстких дисков учит что ресурсов никогда много не бывает... Как уже говорил, зависит от целей, задач, возможностей. Моя система в первую очередь ориентирована на встраиваемые применения, а там с ресурсами напряжёнка. Например, она потенциально может использоваться на каком-нибудь STM32F103RB, у которого 128 килобайт флэш-памяти и всего 20 килобайт ОЗУ -- и в эти 20 килобайт надо впихнуть стек и данные системы, стеки и данные задач... В общем, развернуться особо негде. С другой стороны, мои 16-разрядные номера предназначены исключительно для идентификации системных объектов (события, мутексы, открытые файлы и т.д. и т.п.) в задачах, причём: 1) сами эти объекты разделены на несколько групп (пока их три -- файлы, разделы памяти и объекты синхронизации), у каждой из которых своя нумерация, поэтому один и тот же номер в зависимости от контекста может означать разные объекты; 2) у каждой задачи своя нумерация, никак не связанная с нумерацией в других задачах. Поэтому, думается, 64К номеров вполне хватит для любых разумных задачах не только на довольно хилых микроконтроллерах, но и на самых мощных АРМах. Нуа 500 вкладок... Вкладка -- не объект системы, и как там их браузер внутри себя будет именовать, это его сугубо личное дело. |
Автор: | phantom-84 [ 21 авг 2011, 16:24 ] |
Заголовок сообщения: | Re: Размер идентификатора |
pavia писал(а): По поводу инкрементных пока не придумал где их можно использовать. Так как система может работать 24 часа 7 дней в неделю несколько лет. И в результате может переполнится счётчик. А что делать если 0 ресурс был выделен, но не освобождён? Получится коллизия. В этом-то и проблема инкрементных идентификаторов, но для некоторых типов объектов они необходимы.SII писал(а): 1) сами эти объекты разделены на несколько групп (пока их три -- файлы, разделы памяти и объекты синхронизации), у каждой из которых своя нумерация, поэтому один и тот же номер в зависимости от контекста может означать разные объекты; 2) у каждой задачи своя нумерация, никак не связанная с нумерацией в других задачах. Это все правильно (отдельная нумерация по каждому типу объектов, локальная нумерация отдельных типов объектов), но а как же прямое обращение к глобальным объектам, проблема повторного использования "глобальных входов"?
|
Автор: | SII [ 21 авг 2011, 17:18 ] |
Заголовок сообщения: | Re: Размер идентификатора |
Чтобы использовать глобальный объект, задача его должна сначала открыть, а открываются они по именам (прям как в Винде). Если ж объект не должен быть глобальным, то при его создании имя просто остаётся пустым. В результате успешного открытия (или создания) задача получает 16-разрядный ссылочный номер, с которым потом работает дальше. |
Автор: | 418ImATeapot [ 21 авг 2011, 18:22 ] |
Заголовок сообщения: | Re: Размер идентификатора |
Похоже, я опять сформулировал через G0. Объясняю. Имеется таблица потоков и таблица процессов (максиум, на 2048 записей). Требуется привязать потоки к процессам. Можно, конечно, индефицировать по LDT, но как-то это по ламерский. Могут быть разные нюансы. Имеет ли смысл брать 4 байта (исключительно из соображения быстродействия)? |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |