- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 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 нигде не использовалась...
как видно, во всех 3 пулах будут храниться данные одинакового равзмера...
фиксированный мультипёрпес пул =-это пистец. та же фрагментация. надо обхъект размером три байта - аллоцируется 1024 и никуда не приспособить.... осилил линукс 0.0.1, там сделано градацией - блоки по 8, по 16, по 32 и т. д.
или я не так понимаю?
то есть ядро управляет только 3 видами блоков, каждый из которых имеет свою область видимости... все остальное в юзермоде...
а где вообще об этом можно почитать? с практической стороны (как загрузчик делать и то пэ). а то в вузы меня не пускают }:(
Эндрю Танненбаум у него есть книги по архитектуре ОС.
ну и книги по архитектуре QNX, L4... естественно исходники любительских ОС (в них кода на порядки меньше чем в тех, которые стремятся быть коммерческими, легче понять суть)...
ну и Wasm.ru, sysbin.com, osdev.ru, osdev.net
А QNX - очень славно, очень красиво внутри сделано.
аааааааааа.
Сначала вебкилл сказал нам что ООП подход -- это когда публичных свойств нет а всё через аксессоры.
Потом сказал, что сложность бизнес-логики исчесляется количеством строк (на любом языке)
И вот пришло время узнать что миркоядро это такое ядро, которое использует мало блоков памяти.
Чуть не забыл: а Интернет это как телевизор
Я так не говорил. Хотя для "тру-ООПов" (типа смоллтока) это скорее верно
> Потом сказал, что сложность бизнес-логики исчесляется количеством строк (на любом языке)
Я этого не говорил. Однако, 13 миллионов строк кода тоже показатель. И речь была не о любом языке, а о конкретно си. Если не идиот, то должен представлять, что такое 13 миллионов строк кода на си.
> И вот пришло время узнать что миркоядро это такое ядро, которое использует мало блоков памяти.
Пушкофф постоянно повторял "всё остальное в - юзермоде", вот я и подумал, что он микроядро ваяет. Более того, я угадал, он потом написал: "я надеюсь что меньше чем микроядро... "
> Чуть не забыл: а Интернет это как телевизор
Я сказал, что по моему мнению, слово "интернет" нужно писать с маленькой буквы, когда это слово употребляется в житейско--комуникационном значении, как слова "телефон" и "телевизор". Т.е. "мне вчера по телефону сообщили" по узусу слова примерно равно "вчера по телевизору сказали" ~ "вчера в интернете прочитала" ~ "по радио сообщили" и так далее. А когда слово "Интернет" имеется в виду не в значении коммуникации, а как название сети, - то с большой буквы.
У тебя с восприятей информации из моих уст какие-то проблемы, или что? Или ты просто дебил? Учитывая, что "исчисляться" ты пишешь через е, я склоняюсь ко второму варианту.
В ненавидимом вами-бабуинами микрософте есть Object Manager с reference counting, ага.
Советую тебе про него почитать.
Но можно конечно и самому выделить память: тогда следить за ней тоже надо самому, потому что никто не знает куда ты сунешь указатель на свою память. Это тебе не jvm и не clr с их рефлексией, где все ссылки видны.
>>а именно что с перемещениями
А за одно и про сегментацию и особо про пейджинг в x86 (прямо на сайте интела)
И узнаешь, что адреса можно не менять даже тогда, когда страницу выгрузили на диск.
>>Мы ведь ниибацца ядро, творим чо хотим - и быстро.
Если творить что хотеть -- сразу перестанешь делать это быстро.
Видишь, как хорошо быть технарем? Можно и про паттерны, и про сети, и про кишки операционок.
А не только "C++говно"
Иногда лучше молчать, чем говорить. Я имел в виду компактирующий сборщик, чтобы не было фрагментации + невидимо для пользователя. Сдался мне твой примитивный подсчёт ссылок.
> Но можно конечно и самому выделить память: тогда следить за ней тоже надо самому, потому что никто не знает куда ты сунешь указатель на свою память. Это тебе не jvm и не clr с их рефлексией, где все ссылки видны.
Ну у тебя мозг небольшой, чтобы понять, как это обойти. Можно или сделать модифицированный компилер с, который бы незаметно от пользователя регистрировал установку указетелей (не всех, а именно затрагиваемых сборщиком мусора), или сделать специальный дефолтный язык под такую ось (модифицированны с по типу c++/cli как пример или полностью свой), тогда "простой" си регистрировал бы ссылки вручную, напр. WkRegRef(&obj); Регистры и стек тогда будут консервативными, правда, и будут блокировать объект от сборки...
> А за одно и про сегментацию и особо про пейджинг в x86 (прямо на сайте интела)
> И узнаешь, что адреса можно не менять даже тогда, когда страницу выгрузили на диск.
А расскажи ты, вкратце. Я в железе не ахти, это да.
> Видишь, как хорошо быть технарем? Можно и про паттерны, и про сети, и про кишки операционок.
Паттерны - капитанство очевидности для кодообезьянок, сети мне (стали) унылы, кишки операционок.
- тут я постепенно учусь. Да я в других областях больше )
В каждом стекфрейме си автоматически прописывает небольшую информацию о стекфрейме. Это список собираемых сборщиком ссылок на объекты. Допустим, в таком формате: [начало стекфрейма] (количство оффсетов в списке) (offset x) (offset y) (offset z) (данные) (данные) (данные)
где "офссеты" указывают смещения на данные, которые собираются мусором.
Скажи, как это будет влиять на производительность? Сильно? Будут ли какие-от проблемы?
Почему неудобный? Всё скрыто от пользователя.
> тем более что один такой уже есть - ObjC
у обжц медленный только диспатч методов. всё остальное - 100% си. в 99% случаев время диспатча ни на что не влияет, зато позволяет писать в красявом ООП-стиле. в сложных случаях при bottleneck'е никто не мешает реализовать диспатч самому используя обычный си - через указатели на функцию. часто диспатч и вообще не нужен - тогда обычная сишная функция.
Что ты хотел показать этим кодом, школоло?
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 так и будет расти бесконечно?
предел у него около 512метров, но страницы выделяются только при первом обращении...