|
|
  |
MMU - сильно ли надо? |
|
|
|
May 12 2006, 12:28
|
Участник

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685

|
Цитата(makc @ May 12 2006, 13:18)  MMU в этом случае может очень даже пригодиться, если хочется сделать "дефрагментации" малой кровью. А как будет в этом случае выглядет дефрагментация?
|
|
|
|
|
May 12 2006, 20:15
|
Участник

Группа: Свой
Сообщений: 55
Регистрация: 10-07-05
Пользователь №: 6 685

|
Цитата(makc @ May 12 2006, 15:43)  С помощью MMU можно реализовать непрерывное логическое адресное пространство из нескольких малых физических блоков памяти по разным физическим адресам. Т.е. произвести определяемую менеджером памяти (с функцией дефрагментации) трансляцию логических адресов в физические. Т.е., в приципе, можно и не производить дефрагментацию?
|
|
|
|
|
May 13 2006, 07:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(DASM @ May 13 2006, 06:37)  Zltigo - не пугайте людей. new в случае неуспеха вернет нулл. 1) "If unsuccessful, new returns zero or throws an exception" 2) " specified in the C++ standard, which is to throw a std::bad_alloc exception if the memory allocation fails" Господь с авторм приведенной Вами цитаты, но ни при каких условиях new не может возвращать NULL. В 'нормальном' варианте cо свопами и прочими наворотами просто циклится в ожидании появления памяти и в случае если и это не удается - система может просто прибить задачу. В мелких системах, где более-менее сразу ясно, что памяти скорее всего не появится - exeption. В самых примитивных реализациях - просто вечный цикл. Но никак не NULL'. Ну а то, что автору, цитаты, что NULL, что 'zero' все едино - еще раз указывает на его некомпетентность. Цитата(makc @ May 13 2006, 08:17)  В принципе да... Ага битик включил и "само работать будет" - не будет :-(. Это только механизм, которым можно воспользоваться в менеджере памяти для РЕАЛИЗАЦИИ компенсации фрагментированости.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2006, 08:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(DASM @ May 13 2006, 11:04)  ну это я с переводом лопухнулся. По умолчанию генерируется исключение bad_alloc. Вызовом set_new_handler() мы можем назначить иное поведение. Это по Страуструпу. Ну уж если он некомпетентен.... С этим согласен. Если установить new_handler возвращающий NULL, то new() возвратит результат NULL. Вопросы: 1.Вы когда-нибудь его переустанавливали? 2.Мы обсуждаем поведение new() или того что МОЖНО сделать из new() установкой new_handler, перегрузкой или написанием макроса new ??? Цитата Вот из MSDN "If unsuccessful, new returns zero .... А вот на это "MS" ссылаться не надо. Из того, что у них в Windows на 32 разрядном x86 #define NULL 0 никоем образом не следует, то NULL являющийся абстрактным нулевым _указателем_ может всегда, везде и на всех платформах использоваться как попало и его физическое представление 0. Не говоря о том, что размеры указателя могут ОТЛИЧАТЬСЯ от разрядности ЧИСЛА. И в любом случае писать, что функция которая по определению возвращает УКАЗАТЕЛИ вернула не УКАЗАТЕЛЬ а число 0 (или три или любое другое) некорректно в принципе. Что касается путаницы и самой возможности использовать 0 как NULL, то за это отдельное спасибо авторам С, которые вместо отдельного ключевого слова для нулевого указателя типа паскалевского "nil" использовали ключевое слово "0" :-(. Потом ANSI выкрутились через макрос NULL, который всетаки был в С определен как УКАЗАТЕЛЬ.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 13 2006, 11:07
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(DASM @ May 13 2006, 13:34)  Приведите пожалуйста список, дабы я (а может и еще кто) никогда их (эти пакеты) не использовали Разбираться как ведет себя new() в конкретной библиотеке это задача того, кто решил его использовать. Я лично - не использую. Мне лет 15-17 назад хватило BCC, дабы отбить сие желание. Лет пять назад копался в ЧУЖОМ линуксовом приложении которое аккуратно периодически молча отстреливалось системой как зависшее. Догадались что там было? Ну и самое главное - чем Вам "exception" буде он реализован во EMBEDDED приложении сильно поможет? А? Типа "перезагрузимся и сделаем вид, что ни ничего не случилось".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 15 2006, 05:23
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
new() практически во всех ранних C++ компиллерах умел возращать NULL. Многие нынешние компиляторы/библиотеки поддерживают конструкцию: Код #include <new> ... T* p = new (std::nothrow) T; if(!p) { ... // не дали памяти гады! }
|
|
|
|
|
May 15 2006, 07:23
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Alex03 @ May 15 2006, 08:23)  умел возращать NULL .... Многие поддерживают конструкцию .... О чем и речь :-(, что кто-то, где-то, как-то... Посему, либо разбираться конкретно :-( и не забывать о повторных разборках при портировании, либо устанавливать свой new_handler(), причем единственным разумным вариантом new_handler() для embedded предстваляется возвращение им NULL для возможности максимально безболезненого выхода из каждого конкретной ситуации. Либо не использовать new() в принципе.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 4 2006, 07:56
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ May 13 2006, 11:49)  А вот на это "MS" ссылаться не надо. Из того, что у них в Windows на 32 разрядном x86 #define NULL 0 никоем образом не следует, то NULL являющийся абстрактным нулевым _указателем_ может всегда, везде и на всех платформах использоваться как попало и его физическое представление 0. А вот тут zltigo не прав. Цитирую Страуструпа: Цитата Ноль (0) имеет тип int. Благодаря стандартным преобразованиям, 0 можно использовать в качестве константы любого интегрального типа, типа с плавающей точокй, указателя или указателя на член класса. Тип нуля определяется по контексту. Ноль, как правило (но не всегда), будет физически представлен в виде последовательности нулевых битов соответствующей длины. Гарантируется, что нет объектов с нулевым адресом. Следовательно, указатель, равный нулю, можно интерпретировать как указатель, который ни на что не ссылается. В языке С было очень популярно определять макрос NULL для представления такого указателя. Так как в С++ типы проверяются более жестко, использование банального нуля вместо NULL приведет к меньшим проблемам. Если вы чувствуете, что просто обязаны определеить NULL, воспользуйтесь Код const int NULL = 0; Модификатор const предотвращает ненамеренное замещение NULL и гарантирует, что NULL можно использовать везде, где требуется константа. Так что ноль вполне законен и даже очень правилен. Кстати, IAR 4.30 после вызова new проверяет R0 на ноль и если не ноль вызывает конструктор. Глубже не копал, но интуитивно понял что new таки в случае неудачи возвращает ноль. Счас отловлю другие ошибки и попробую организовать нехватку памяти.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Aug 4 2006, 08:26
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Сергей Борщ @ Aug 4 2006, 10:56)  А вот тут zltigo не прав. Цитирую Страуструпа: Это всего лишь личное мнение Страуструпа :-)))) который и затвердил :-( его в своей реализации ++. Я не слишком слежу за процессом стандартизации C++, но похоже комитет пока еще не родил стандарта :-(. В моей полной цитате речь шла о проблеме более широко: - не только по отношению к C++, но и к C (более того это был именно кусок по С ); - по отношению к разным платформам, как например должен выглядеть Страуструповский 0 на платформе типа Cray-Cyber с кольцевыми указателями? Короче в С++ болезнь вместо лечения ( введением ключевого слова, как в Паскале) была загнана вовнутрь наложением исскуственного требования иметь внутреннее представление нулевых указателей нулевым. И с легкостью необыкновенной считать, что ключевое слово для нулевого указателя это "0".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|