1. Си / Говнокод #3496

    +136

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    #if 0
    
    // memory allocator
    // Type: Best Fit with block sorting
    
    #else
    
    static char* last = (char*)KERNEL_HEAP_BEGIN;
    
    void* alloc( size_t size )
    {
    	void * mem = last;
    	last += size;
    	return mem;
    }
    
    void free( void* mem )
    {
    	(void)mem;
    }
    
    #endif

    Менеджер памяти.
    такую заглушку пришлось делать за пару ночей до сдачи диплома, так как не хватало времени на написание записки.
    зато самый быстрый алокатор. сложность О(1)...
    нужен был для выделения памяти для данных 2 потоков и 1 процесса... функция free нигде не использовалась...

    Запостил: pushkoff, 17 Июня 2010

    Комментарии (38) RSS

    • Bump−pointer allocation всегда рулит. Ещё была бы поддержка компактирования на уровне ОС, цены бы тебе не было :\
      Ответить
    • Хотя нет, не вижу выравниваний - не сможем например делать atomic при таком менджере. Говнокод определённо.
      Ответить
    • На, лови подарок (переписал на си с webkillos/пхп):

      void* alloc( size_t size )
      {
              size_t d = size % sizeof(void*);
              if(d)
                    size += (sizeof(void*) - d);
      
      	void * mem = last;
      	last += size;
      	return mem;
      }
      Ответить
      • Сборщик мусора добавь. То, что используется более дня - освободить.
        Ответить
        • И еще, где тут блэкджек?
          Ответить
        • А как вам вообще идея сборщика мусора вшитого в ось? Не какой-нибудь убогий boehm, а именно что с перемещениями памяти и заменой всех ссылок. Мы ведь ниибацца ядро, творим чо хотим - и быстро.
          Ответить
          • Превращается в обезьяну на глазах.
            Ответить
          • А ещё лучше - в процессор.
            Ответить
          • глупо... в новом ядре, собираюсь сделать 3 пула: глобальный - для данных процессов, локальный для процесса - для данных потоков и локальный для процессора... все остальное вынести в юзермод...
            как видно, во всех 3 пулах будут храниться данные одинакового равзмера...
            Ответить
            • сам-то хрень какую-то предложил

              фиксированный мультипёрпес пул =-это пистец. та же фрагментация. надо обхъект размером три байта - аллоцируется 1024 и никуда не приспособить.... осилил линукс 0.0.1, там сделано градацией - блоки по 8, по 16, по 32 и т. д.

              или я не так понимаю?
              Ответить
              • я свожу количество блоков которые нужно алоцировать к минимуму... а их размер к константе... то есть из пула процессов мне нужен только блок в который помещаются данные описателя процесса...
                то есть ядро управляет только 3 видами блоков, каждый из которых имеет свою область видимости... все остальное в юзермоде...
                Ответить
                • таки типа микроядро?

                  а где вообще об этом можно почитать? с практической стороны (как загрузчик делать и то пэ). а то в вузы меня не пускают }:(
                  Ответить
                  • я надеюсь что меньше чем микроядро... никаких практических целей, чисто пиписькомерство...

                    Эндрю Танненбаум у него есть книги по архитектуре ОС.
                    ну и книги по архитектуре QNX, L4... естественно исходники любительских ОС (в них кода на порядки меньше чем в тех, которые стремятся быть коммерческими, легче понять суть)...
                    ну и Wasm.ru, sysbin.com, osdev.ru, osdev.net
                    Ответить
                    • Меньше, чем микроядро - это наноядро!

                      А QNX - очень славно, очень красиво внутри сделано.
                      Ответить
                      • скорее всего это http://ru.wikipedia.org/wiki/Экзоядро
                        Ответить
                  • >>таки типа микроядро?

                    аааааааааа.

                    Сначала вебкилл сказал нам что ООП подход -- это когда публичных свойств нет а всё через аксессоры.
                    Потом сказал, что сложность бизнес-логики исчесляется количеством строк (на любом языке)
                    И вот пришло время узнать что миркоядро это такое ядро, которое использует мало блоков памяти.

                    Чуть не забыл: а Интернет это как телевизор
                    Ответить
                    • > Сначала вебкилл сказал нам что ООП подход -- это когда публичных свойств нет а всё через аксессоры.

                      Я так не говорил. Хотя для "тру-ООПов" (типа смоллтока) это скорее верно

                      > Потом сказал, что сложность бизнес-логики исчесляется количеством строк (на любом языке)

                      Я этого не говорил. Однако, 13 миллионов строк кода тоже показатель. И речь была не о любом языке, а о конкретно си. Если не идиот, то должен представлять, что такое 13 миллионов строк кода на си.

                      > И вот пришло время узнать что миркоядро это такое ядро, которое использует мало блоков памяти.

                      Пушкофф постоянно повторял "всё остальное в - юзермоде", вот я и подумал, что он микроядро ваяет. Более того, я угадал, он потом написал: "я надеюсь что меньше чем микроядро... "

                      > Чуть не забыл: а Интернет это как телевизор

                      Я сказал, что по моему мнению, слово "интернет" нужно писать с маленькой буквы, когда это слово употребляется в житейско--комуникационном значении, как слова "телефон" и "телевизор". Т.е. "мне вчера по телефону сообщили" по узусу слова примерно равно "вчера по телевизору сказали" ~ "вчера в интернете прочитала" ~ "по радио сообщили" и так далее. А когда слово "Интернет" имеется в виду не в значении коммуникации, а как название сети, - то с большой буквы.

                      У тебя с восприятей информации из моих уст какие-то проблемы, или что? Или ты просто дебил? Учитывая, что "исчисляться" ты пишешь через е, я склоняюсь ко второму варианту.
                      Ответить
            • Ну как, сделал?
              Ответить
          • >>А как вам вообще идея сборщика мусора вшитого в ось?
            В ненавидимом вами-бабуинами микрософте есть Object Manager с reference counting, ага.
            Советую тебе про него почитать.

            Но можно конечно и самому выделить память: тогда следить за ней тоже надо самому, потому что никто не знает куда ты сунешь указатель на свою память. Это тебе не jvm и не clr с их рефлексией, где все ссылки видны.

            >>а именно что с перемещениями
            А за одно и про сегментацию и особо про пейджинг в x86 (прямо на сайте интела)
            И узнаешь, что адреса можно не менять даже тогда, когда страницу выгрузили на диск.

            >>Мы ведь ниибацца ядро, творим чо хотим - и быстро.
            Если творить что хотеть -- сразу перестанешь делать это быстро.

            Видишь, как хорошо быть технарем? Можно и про паттерны, и про сети, и про кишки операционок.

            А не только "C++говно"
            Ответить
            • > В ненавидимом вами-бабуинами микрософте есть Object Manager с reference counting, ага.

              Иногда лучше молчать, чем говорить. Я имел в виду компактирующий сборщик, чтобы не было фрагментации + невидимо для пользователя. Сдался мне твой примитивный подсчёт ссылок.

              > Но можно конечно и самому выделить память: тогда следить за ней тоже надо самому, потому что никто не знает куда ты сунешь указатель на свою память. Это тебе не jvm и не clr с их рефлексией, где все ссылки видны.

              Ну у тебя мозг небольшой, чтобы понять, как это обойти. Можно или сделать модифицированный компилер с, который бы незаметно от пользователя регистрировал установку указетелей (не всех, а именно затрагиваемых сборщиком мусора), или сделать специальный дефолтный язык под такую ось (модифицированны с по типу c++/cli как пример или полностью свой), тогда "простой" си регистрировал бы ссылки вручную, напр. WkRegRef(&obj); Регистры и стек тогда будут консервативными, правда, и будут блокировать объект от сборки...

              > А за одно и про сегментацию и особо про пейджинг в x86 (прямо на сайте интела)
              > И узнаешь, что адреса можно не менять даже тогда, когда страницу выгрузили на диск.

              А расскажи ты, вкратце. Я в железе не ахти, это да.

              > Видишь, как хорошо быть технарем? Можно и про паттерны, и про сети, и про кишки операционок.

              Паттерны - капитанство очевидности для кодообезьянок, сети мне (стали) унылы, кишки операционок.
              - тут я постепенно учусь. Да я в других областях больше )
              Ответить
            • Вот ты технарь, и скажи как такой враиант, твоё мнение эксперта важно для вебкиллОС (всё делает модиффицированный си) :

              В каждом стекфрейме си автоматически прописывает небольшую информацию о стекфрейме. Это список собираемых сборщиком ссылок на объекты. Допустим, в таком формате: [начало стекфрейма] (количство оффсетов в списке) (offset x) (offset y) (offset z) (данные) (данные) (данные)

              где "офссеты" указывают смещения на данные, которые собираются мусором.

              Скажи, как это будет влиять на производительность? Сильно? Будут ли какие-от проблемы?
              Ответить
              • а теперь подумай кому нужен неудобный и медленный С? тем более что один такой уже есть - ObjC
                Ответить
                • > а теперь подумай кому нужен неудобный и медленный С?

                  Почему неудобный? Всё скрыто от пользователя.

                  > тем более что один такой уже есть - ObjC

                  у обжц медленный только диспатч методов. всё остальное - 100% си. в 99% случаев время диспатча ни на что не влияет, зато позволяет писать в красявом ООП-стиле. в сложных случаях при bottleneck'е никто не мешает реализовать диспатч самому используя обычный си - через указатели на функцию. часто диспатч и вообще не нужен - тогда обычная сишная функция.
                  Ответить
              • сборщик мусора это универсальное решение, и оно в любом случае будет медленней специализированных решений...
                Ответить
      • зачем позоришься, чёртяка?
        Что ты хотел показать этим кодом, школоло?
        Ответить
      • void * не обязательно самый большой тип.

        typedef union { double d; void *p; long long ll; } properly_aligned_t;
        size = ((size + sizeof (properly_aligned_t) - 1) & (sizeof (properly_aligned_t) - 1));
        Ответить
    • Пулы не осилили?
      Ответить
    • Аллокатор не сложный, прямо скажем)
      А вот скажи -- last так и будет расти бесконечно?
      Ответить
      • да, но так как выделялось всего 3 объекта, этого никто не заметил...
        предел у него около 512метров, но страницы выделяются только при первом обращении...
        Ответить

    Добавить комментарий