Array-based lists нужны ли на NT или только linked?
От: LimyKurn  
Дата: 23.09.18 01:00
Оценка:
Надеюсь, это мой последний вопрос про списки на NT

Ситуация вот в чем.
Если посмотреть какие списки предоставляет само API NT:
https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/singly-and-doubly-linked-lists
то увидим, что там только связные списки.

В то же время, если посмотреть какие списки распространены в разных платформах user-mode, то увидим, что кроме linked есть и array-based, и вторые даже более распространены, чем первые. Пример? Да хоть std::vector из стандартного C++, который используют много чаще, чем std::list (двусвязный список).
И думается, что это не только из-за отсутствия `operator []`, который можно было бы легко добавить самими же авторами стандарта

Как вы считаете — стоит ли написать для драйверов свой array-based list (точнее, адаптировать под NT какую-то уже имеющуюся реализацию)?
Что у них будет с быстродействием? Будет ли выигрыш в каких-то случаях (см. предыдущий вопрос про списки с 2 разными ситуациями)
Отредактировано 23.09.2018 1:01 LimyKurn . Предыдущая версия .
Re: Array-based lists нужны ли на NT или только linked?
От: -prus-  
Дата: 23.09.18 17:27
Оценка:
Здравствуйте, LimyKurn, Вы писали:

LK>Как вы считаете — стоит ли написать для драйверов свой array-based list (точнее, адаптировать под NT какую-то уже имеющуюся реализацию)?

LK>Что у них будет с быстродействием? Будет ли выигрыш в каких-то случаях (см. предыдущий вопрос про списки с 2 разными ситуациями)

По моему, что-то похожее уже мелькало вроде. C++ RTL for NT kernel-mode drivers
Сам не смотрел. Исходники тут.
С уважением,
Евгений
Re[2]: Array-based lists нужны ли на NT или только linked?
От: LimyKurn  
Дата: 23.09.18 20:19
Оценка:
Здравствуйте, -prus-, Вы писали:

P>Здравствуйте, LimyKurn, Вы писали:


LK>>Как вы считаете — стоит ли написать для драйверов свой array-based list (точнее, адаптировать под NT какую-то уже имеющуюся реализацию)?

LK>>Что у них будет с быстродействием? Будет ли выигрыш в каких-то случаях (см. предыдущий вопрос про списки с 2 разными ситуациями)

P>По моему, что-то похожее уже мелькало вроде. C++ RTL for NT kernel-mode drivers

P>Сам не смотрел. Исходники тут.

Это уже другой вопрос получается.
И звучит он так: "стоит ли в NT тащить стороннюю библиотеку, которая реализует STL?"
При этом пока даже неизвестно, есть ли там собственно хоть какой-нибудь array-based list

В целом про такие библиотеки могу сказать следующее.

Они тупо копируют STL, а он не нужен. И это я говорю как человек, который ЗНАЕТ плюсы, пишет на них много и тщательно. Где можно обойти эту STL через Boost, Qt, fc, там ее обходят. А на создание фундамента, достаточного для переноса хотя бы Boost в NT, таких библиотек уже вряд ли хватит. Причем, нужно еще определиться, что из Boost нужно в NT, а что нет. А для этого надо очень плотно крутиться в области и очень многое в ней увидеть. Между тем, вряд ли многие поддержат эту затею финансово

Вывод: если и писать библиотеку утилит, то пока она маленькая, не стоит заботиться тем, что она ни с чем не совместима. Гораздо важнее, чтобы она была нужна. Если при этом можно без особого труда обеспечить еще и совместимость — то делаем, а иначе — нет.


По структуре тут есть вообще такая идея: делать классы не в стиле STL, а, внезапно, в стиле .NET.
На первый взгляд — безумие — зачем? Но ответ приходит быстро: если STL и NT связаны через C++, то .NET и NT связаны через Windows. Именно .NET есть основной инструментарий под Windows, тогда как C++ больше удел линуксоидов. К тому же, хоть .NET и более примитивен, но он и более прогрессивен, чем STL уж точно... Наконец, если выбирать между Windows и C++, то разработчик драйверов NT — это скорее человек со стажем в первом, чем втором... Получается, что идея со стилем .NET с какой-то стороны выглядит даже более здравой.

Но в данном случае меня больше интересует, нет ли там все-таки конкретно array-based list'а, и если есть, то не годен ли он — а взять его к себе можно и отдельно от всего, если он того стоит. Все же, не нужно допускать того, чтобы вы создавали свое тогда, когда намного проще задействовать уже готовое.
Отредактировано 23.09.2018 20:44 LimyKurn . Предыдущая версия . Еще …
Отредактировано 23.09.2018 20:43 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:42 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:30 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:27 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:25 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:25 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:24 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:23 LimyKurn . Предыдущая версия .
Отредактировано 23.09.2018 20:22 LimyKurn . Предыдущая версия .
Re: Array-based lists нужны ли на NT или только linked?
От: m2l  
Дата: 23.09.18 21:02
Оценка:
Здравствуйте, LimyKurn, Вы писали:

LK>то увидим, что там только связные списки.

Такое положение дел диктует модель памяти. Операции выделение/освобождения структуры отделены от операций работы со списком.
Это актуально при работе на разных irql, позволяет мешать с одном и том-же списке динамически и статически выделяемую память и т.д. В минусах больший объем кода, большая сложность.

LK>В то же время, если посмотреть какие списки распространены в разных платформах user-mode, то увидим, что кроме linked есть и array-based, и вторые даже более распространены, чем первые. Пример? Да хоть std::vector из стандартного C++, который используют много чаще, чем std::list (двусвязный список).

Последнее время в user-mode больше распространен GC))

LK>И думается, что это не только из-за отсутствия `operator []`, который можно было бы легко добавить самими же авторами стандарта

LK>Как вы считаете — стоит ли написать для драйверов свой array-based list (точнее, адаптировать под NT какую-то уже имеющуюся реализацию)?
Возможность писать драйверы на C++, с перегрузкой операторов и прочим блек-джеком никто не отменял. Не думаю, что адаптация актуальна.

LK>Что у них будет с быстродействием? Будет ли выигрыш в каких-то случаях (см. предыдущий вопрос про списки с 2 разными ситуациями)

Хочу обратить твоё внимание, что списки в ядрах отличаются от std::list по внутреннему устройству. Они сделаны так, чтобы любые операции исключали динамическую работу с памятью. Поэтому сложно представить эквивалентные условия для оценки производительности.
Re[2]: Array-based lists нужны ли на NT или только linked?
От: LimyKurn  
Дата: 24.09.18 00:17
Оценка:
Здравствуйте, m2l, Вы писали:

m2l>Возможность писать драйверы на C++, с перегрузкой операторов и прочим блек-джеком никто не отменял. Не думаю, что адаптация актуальна.


Но там же нет STL. Нет того же std::vector.
Более того, я всерьез задаюсь вопросом — а нужна ли она там, или там нужна иная система библиотеки с утилитами.
Дело в том, что чистый STL малополезен, никто не использует его в чистом виде, а предпочитают Boost, Qt, fc и др.; но для того, чтобы их утащить в драйвера, нужна полноценная реализация STL. Городить такой огород — это совсем не задача энтузиастов.
Между тем, у меня есть иная идея: утилиты для NT — писать, собирая их из всяких адаптаций (хотя, конечно, только по мере необходимости), но не пытаться сделать STL, а строить структуру в стиле библиотеки .NET: в названиях классов, методов, самом разбиении на классы стараться придерживаться .NET.
С одной стороны, это выглядит безумием: какое отношение .NET имеет к C/C++, на которых пишутся драйвера NT?
С другой стороны, ряд преимуществ:
— Если STL связан с NT через C++, то .NET связан с NT через Windows. Разработчик под NT — это больше разработчик под Windows, чем разработчик на C++, который, кстати, более любим линуксоидами, чем разработчиками под Windows. Вполне вероятно, что его приложения для user-mode написаны под .NET, так что здесь он встретит знакомые классы.
— .NET хоть и примитивнее, но зато и не так переусложнен, как тот же Boost.
— .NET единообразен, в отличие от связки STL + Boost и даже самого по себе Boost.
— .NET не стандартен. При желании можно разглядеть какие-то стандарты, но о них даже мало кто знает. И, конечно, .NET никогда не покрывал все низкоуровневое API, как это делает STL. Поэтому никто не будет считать мою библиотеку(-и) убогими за то, что я не проделал откровенно ненужной и лишней работы вроде реализации всех методов всех классов .NET. Что хочу — оборачиваю, что считаю и так достаточно простым — то предлагаю юзать непосредственно и сам так делаю.
Отредактировано 24.09.2018 0:21 LimyKurn . Предыдущая версия . Еще …
Отредактировано 24.09.2018 0:19 LimyKurn . Предыдущая версия .
Re[3]: Array-based lists нужны ли на NT или только linked?
От: -prus-  
Дата: 24.09.18 10:17
Оценка:
Здравствуйте, LimyKurn, Вы писали:

LK>Но там же нет STL. Нет того же std::vector.


Чем вам не нравится из ядра прокинуть данные наверх, обработать там при помощи boost, stl, algorithms и тп, и потом вернуть результат обратно?
Также в ядре есть и свои реализации, например, AVL Tree: RtlInitializeGenericTableAvl. Можно найти реализации HashTable ну и тп.
И что это за такой загадочный array-based list для ядра, о котором вы говорите? Можно подробнее?
С уважением,
Евгений
Re[4]: Array-based lists нужны ли на NT или только linked?
От: LimyKurn  
Дата: 24.09.18 15:16
Оценка:
Здравствуйте, -prus-, Вы писали:

P>Чем вам не нравится из ядра прокинуть данные наверх, обработать там при помощи boost, stl, algorithms и тп, и потом вернуть результат обратно?

okman говорил, что в моем конкретном случае делать user-mode-сервис не нужно. Хотя уже предлагали несколько раз. Но я не сделал.
А если серьезно, то просто узнайте весь масштаб применения одного только vector в проектах на C++ в user-mode, и вы оцените, насколько реально или нереально кидать данные туда-сюда каждый раз, где хочется применить vector.
Впрочем, я сомневаюсь, что вы захотите что-то там узнавать, поэтому попытаюсь просто сказать словами. Динамических массивов в современных проектах на C++ не бывает. Бывает только вектор. Не только "динамический массив", но и "коллекция" вообще — почти синоним слова "вектор".

P>Также в ядре есть и свои реализации, например, AVL Tree: RtlInitializeGenericTableAvl

Спасибо, посмотрю.

P> Можно найти реализации HashTable ну и тп.

Этот видел. Там еще LinkedList рядом лежит — его посмотрел — не впечатлил. Потокобезопасности нет нигде.

P>И что это за такой загадочный array-based list для ядра, о котором вы говорите? Можно подробнее?

Его пока нету. Есть только сама идея того, что нужен array-list, а не только связный.
Array-list — это список, в котором лежит динамический массив, и именно он непосредственно хранит элементы. Связи — отсутствуют, это и отличает его от связного списка.
Array-list используется гораздо шире, чем связные списки. В user-mode можно взять любой язык программирования, посмотреть какой список там используется шире всего, и наверняка он будет array-listом, а не связным. Тот же вектор — это array-list.
Правда, я не знаю, как, собственно, его реализовать. В частности, как там делают само добавление элементов. Думаю, что выделяют новый буфер, копируют в него старый, добавляют элемент в конец, а старый буфер очищают.
Re[5]: Array-based lists нужны ли на NT или только linked?
От: -prus-  
Дата: 24.09.18 16:42
Оценка:
Здравствуйте, LimyKurn, Вы писали:

LK>А если серьезно, то просто узнайте весь масштаб применения одного только vector в проектах на C++ в user-mode, и вы оцените, насколько реально или нереально кидать данные туда-сюда каждый раз, где хочется применить vector.

LK>Впрочем, я сомневаюсь, что вы захотите что-то там узнавать, поэтому попытаюсь просто сказать словами. Динамических массивов в современных проектах на C++ не бывает. Бывает только вектор. Не только "динамический массив", но и "коллекция" вообще — почти синоним слова "вектор".

Что такое С++ я в курсе. И я не спорю. Может я просто пока не сталкивался с такой задачей, где бы это можно было оценить прям явно. Тогда еще стоить подумать подтянуть в ядро умные указатели, например, чтобы не париться об утечках памяти или boost::multi_index, flat_map и тп. Но имхо есть системное программирование со своей спецификой, архитектурой и нюансами (возьмем KernelMode), где есть все необходимое для разработчика на каждом уровне (оборудование, файловая система, сетевой стек, подсистема процессов и потоков, реестр, память и тд и тп), а есть прикладное направление С++ со всякими очень полезными контейнерами, алгоритмами, STL, Boost и свистелками/перделками, которые уже годами отлажены сообществом для своих нужд, которые в KernelMode могут быть оверхедом по памяти, например, размеру бинарного модуля и даже пагубно сказаться на производительности. Не?

LK>Его пока нету. Есть только сама идея того, что нужен array-list, а не только связный.

Идея — это всегда хорошо
С уважением,
Евгений
Re[6]: Array-based lists нужны ли на NT или только linked?
От: LimyKurn  
Дата: 24.09.18 17:55
Оценка:
Здравствуйте, -prus-, Вы писали:

P>подтянуть в ядро умные указатели, например, чтобы не париться об утечках памяти

Даже умные почти не применяются в прикладном C++. Только ссылки.

P> или boost::multi_index, flat_map и тп.

Интуитивно: мапа — да, bmi — нет.
bmi — это "засри консоль непонятными ошибками НАГЛУХО."
И только потом — самый гибкий из контейнеров и прочие плюшки.
Думаю, что если бы было что-то поадекватнее, поновее, то часть бы народу перешло на него.

P> оборудование, файловая система, сетевой стек, подсистема процессов и потоков, реестр, память и тд и тп

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

P> могут быть оверхедом по памяти, например, размеру бинарного модуля и даже пагубно сказаться на производительности. Не?

Размер бинарного модуля — не. Память — не. Это все-таки не микроконтроллеры. К тому же, куда больше дров (каламбур) способна наломать утечка памяти при кривом использовании чего-л., чем нормально реализованная обертка, которая хоть и весит сколько-то сама, но зато снижает риск ошибиться при использовании
Производительность — да. Но насколько знаю, у linked list она в чем-то лучше array list — а в чем-то то и хуже.
Отредактировано 24.09.2018 17:58 LimyKurn . Предыдущая версия .
Re[3]: Array-based lists нужны ли на NT или только linked?
От: m2l  
Дата: 24.09.18 20:02
Оценка:
Здравствуйте, LimyKurn, Вы писали:

LK>Дело в том, что чистый STL малополезен, никто не использует его в чистом виде, а предпочитают Boost, Qt, fc и др.; но для того, чтобы их утащить в драйвера, нужна полноценная реализация STL. Городить такой огород — это совсем не задача энтузиастов.

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

LK>Между тем, у меня есть иная идея: утилиты для NT — писать, собирая их из всяких адаптаций (хотя, конечно, только по мере необходимости), но не пытаться сделать STL, а строить структуру в стиле библиотеки .NET: в названиях классов, методов, самом разбиении на классы стараться придерживаться .NET.

Контекст твоих вопросов и раздел форума подразумевает драйверы или штуки вроде chdisk-а, который при загрузке.
LK>С одной стороны, это выглядит безумием: какое отношение .NET имеет к C/C++, на которых пишутся драйвера NT?
LK>С другой стороны, ряд преимуществ:
LK>- Если STL связан с NT через C++, то .NET связан с NT через Windows. Разработчик под NT — это больше разработчик под Windows, чем разработчик на C++, который, кстати, более любим линуксоидами, чем разработчиками под Windows. Вполне вероятно, что его приложения для user-mode написаны под .NET, так что здесь он встретит знакомые классы.
Исходники открыты, можно и весь dotnet внутрь ядра засунуть. CL будет компилироваться и запускаться прямо в ring 0, с доступом почти ко всему богатству стандартной библиотеки.
Только преимущества не перекрывают недостатков.
LK>- .NET хоть и примитивнее, но зато и не так переусложнен, как тот же Boost.
Разница в рефлексии, из-за неё воссоздать часть особенностей стандартной библиотеки C# на C++ нельзя.
LK>- .NET единообразен, в отличие от связки STL + Boost и даже самого по себе Boost.
Не ясно по какому критерию оценено единообразие. И как он видоизменится при переходе в ядро.
LK>- .NET не стандартен. При желании можно разглядеть какие-то стандарты, но о них даже мало кто знает. И, конечно, .NET никогда не покрывал все низкоуровневое API, как это делает STL. Поэтому никто не будет считать мою библиотеку(-и) убогими за то, что я не проделал откровенно ненужной и лишней работы вроде реализации всех методов всех классов .NET. Что хочу — оборачиваю, что считаю и так достаточно простым — то предлагаю юзать непосредственно и сам так делаю.
Это плохой аргумент. Если библиотека будет упрощать работу, то никого не будет волновать её корреляция с какими-либо стандартами.


ЗЫ. Я так вижу ты плотно нацелился повелосипедить. Отговаривать не буду, но предметную область в которой хочешь работать всё-же изучи.
Re[4]: Array-based lists нужны ли на NT или только linked?
От: LimyKurn  
Дата: 29.09.18 21:55
Оценка:
Здравствуйте, m2l, Вы писали:

m2l>Контекст твоих вопросов и раздел форума подразумевает драйверы или штуки вроде chdisk-а, который при загрузке.

Под утилитами имелась в виду библиотека для драйверов NT. В этом контексте, утилы и хелперы — это и есть библиотека, только в зачаточном состоянии. А когда все разовьется и объединится, получится фреймворк.

m2l>Если библиотека будет упрощать работу, то никого не будет волновать её корреляция с какими-либо стандартами.

Это совсем не так. В данном конкретном случае — не совсем так. Но "не совсем" только потому, что тут низкоуровневые разработчики и разработчики под Windows. Думается, что для этих двух групп не столь характерна любовь к порядку. И особенно — для вторых.

m2l>ЗЫ. Я так вижу ты плотно нацелился повелосипедить.

Нет. Создание фреймворка (крупной библиотеки) для NT — это не велосипед, потому что здесь нет ни одного хоть немножко общепринятого аналога.
Я еще могу согласиться про списки — для них, действительно, если и нужно что-то, то лишь недостающие функции для стандартных списков. Но, опять же, эти функции стоит написать. А во многих случаях именно надо обернуть конкретную часть функций по какой-то теме, если не все.
Это именно уникальный проект... только на любой проект надо иметь хоть немного сил, и проект делать сообразно им.
Отредактировано 29.09.2018 22:00 LimyKurn . Предыдущая версия . Еще …
Отредактировано 29.09.2018 21:59 LimyKurn . Предыдущая версия .
Отредактировано 29.09.2018 21:59 LimyKurn . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.