- 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 нигде не использовалась...
Webkill 17.06.2010 07:44 # +1
Webkill 17.06.2010 07:48 # +1
Webkill 17.06.2010 07:53 # −2
guest 17.06.2010 08:04 # 0
nil 17.06.2010 08:07 # +2
Webkill 17.06.2010 08:18 # −2
Webkill 17.06.2010 08:22 # −1
guest 17.06.2010 08:29 # +2
guest 17.06.2010 09:04 # +3
pushkoff 17.06.2010 12:03 # 0
как видно, во всех 3 пулах будут храниться данные одинакового равзмера...
Webkill 17.06.2010 14:10 # +1
фиксированный мультипёрпес пул =-это пистец. та же фрагментация. надо обхъект размером три байта - аллоцируется 1024 и никуда не приспособить.... осилил линукс 0.0.1, там сделано градацией - блоки по 8, по 16, по 32 и т. д.
или я не так понимаю?
pushkoff 17.06.2010 14:54 # 0
то есть ядро управляет только 3 видами блоков, каждый из которых имеет свою область видимости... все остальное в юзермоде...
Webkill 17.06.2010 15:00 # +1
а где вообще об этом можно почитать? с практической стороны (как загрузчик делать и то пэ). а то в вузы меня не пускают }:(
pushkoff 17.06.2010 15:07 # 0
Эндрю Танненбаум у него есть книги по архитектуре ОС.
ну и книги по архитектуре QNX, L4... естественно исходники любительских ОС (в них кода на порядки меньше чем в тех, которые стремятся быть коммерческими, легче понять суть)...
ну и Wasm.ru, sysbin.com, osdev.ru, osdev.net
nil 17.06.2010 15:53 # 0
А QNX - очень славно, очень красиво внутри сделано.
pushkoff 17.06.2010 16:10 # 0
guest 18.06.2010 03:40 # +1
аааааааааа.
Сначала вебкилл сказал нам что ООП подход -- это когда публичных свойств нет а всё через аксессоры.
Потом сказал, что сложность бизнес-логики исчесляется количеством строк (на любом языке)
И вот пришло время узнать что миркоядро это такое ядро, которое использует мало блоков памяти.
Чуть не забыл: а Интернет это как телевизор
Webkill 18.06.2010 13:32 # +1
Я так не говорил. Хотя для "тру-ООПов" (типа смоллтока) это скорее верно
> Потом сказал, что сложность бизнес-логики исчесляется количеством строк (на любом языке)
Я этого не говорил. Однако, 13 миллионов строк кода тоже показатель. И речь была не о любом языке, а о конкретно си. Если не идиот, то должен представлять, что такое 13 миллионов строк кода на си.
> И вот пришло время узнать что миркоядро это такое ядро, которое использует мало блоков памяти.
Пушкофф постоянно повторял "всё остальное в - юзермоде", вот я и подумал, что он микроядро ваяет. Более того, я угадал, он потом написал: "я надеюсь что меньше чем микроядро... "
> Чуть не забыл: а Интернет это как телевизор
Я сказал, что по моему мнению, слово "интернет" нужно писать с маленькой буквы, когда это слово употребляется в житейско--комуникационном значении, как слова "телефон" и "телевизор". Т.е. "мне вчера по телефону сообщили" по узусу слова примерно равно "вчера по телевизору сказали" ~ "вчера в интернете прочитала" ~ "по радио сообщили" и так далее. А когда слово "Интернет" имеется в виду не в значении коммуникации, а как название сети, - то с большой буквы.
У тебя с восприятей информации из моих уст какие-то проблемы, или что? Или ты просто дебил? Учитывая, что "исчисляться" ты пишешь через е, я склоняюсь ко второму варианту.
OCEHHuu_nemyx 16.10.2020 13:59 # 0
guest 18.06.2010 03:37 # −1
В ненавидимом вами-бабуинами микрософте есть Object Manager с reference counting, ага.
Советую тебе про него почитать.
Но можно конечно и самому выделить память: тогда следить за ней тоже надо самому, потому что никто не знает куда ты сунешь указатель на свою память. Это тебе не jvm и не clr с их рефлексией, где все ссылки видны.
>>а именно что с перемещениями
А за одно и про сегментацию и особо про пейджинг в x86 (прямо на сайте интела)
И узнаешь, что адреса можно не менять даже тогда, когда страницу выгрузили на диск.
>>Мы ведь ниибацца ядро, творим чо хотим - и быстро.
Если творить что хотеть -- сразу перестанешь делать это быстро.
Видишь, как хорошо быть технарем? Можно и про паттерны, и про сети, и про кишки операционок.
А не только "C++говно"
Webkill 18.06.2010 04:30 # 0
Иногда лучше молчать, чем говорить. Я имел в виду компактирующий сборщик, чтобы не было фрагментации + невидимо для пользователя. Сдался мне твой примитивный подсчёт ссылок.
> Но можно конечно и самому выделить память: тогда следить за ней тоже надо самому, потому что никто не знает куда ты сунешь указатель на свою память. Это тебе не jvm и не clr с их рефлексией, где все ссылки видны.
Ну у тебя мозг небольшой, чтобы понять, как это обойти. Можно или сделать модифицированный компилер с, который бы незаметно от пользователя регистрировал установку указетелей (не всех, а именно затрагиваемых сборщиком мусора), или сделать специальный дефолтный язык под такую ось (модифицированны с по типу c++/cli как пример или полностью свой), тогда "простой" си регистрировал бы ссылки вручную, напр. WkRegRef(&obj); Регистры и стек тогда будут консервативными, правда, и будут блокировать объект от сборки...
> А за одно и про сегментацию и особо про пейджинг в x86 (прямо на сайте интела)
> И узнаешь, что адреса можно не менять даже тогда, когда страницу выгрузили на диск.
А расскажи ты, вкратце. Я в железе не ахти, это да.
> Видишь, как хорошо быть технарем? Можно и про паттерны, и про сети, и про кишки операционок.
Паттерны - капитанство очевидности для кодообезьянок, сети мне (стали) унылы, кишки операционок.
- тут я постепенно учусь. Да я в других областях больше )
Webkill 18.06.2010 04:43 # 0
В каждом стекфрейме си автоматически прописывает небольшую информацию о стекфрейме. Это список собираемых сборщиком ссылок на объекты. Допустим, в таком формате: [начало стекфрейма] (количство оффсетов в списке) (offset x) (offset y) (offset z) (данные) (данные) (данные)
где "офссеты" указывают смещения на данные, которые собираются мусором.
Скажи, как это будет влиять на производительность? Сильно? Будут ли какие-от проблемы?
pushkoff 18.06.2010 12:41 # 0
Webkill 18.06.2010 13:48 # −1
Почему неудобный? Всё скрыто от пользователя.
> тем более что один такой уже есть - ObjC
у обжц медленный только диспатч методов. всё остальное - 100% си. в 99% случаев время диспатча ни на что не влияет, зато позволяет писать в красявом ООП-стиле. в сложных случаях при bottleneck'е никто не мешает реализовать диспатч самому используя обычный си - через указатели на функцию. часто диспатч и вообще не нужен - тогда обычная сишная функция.
pushkoff 18.06.2010 12:42 # 0
blackhearted 17.06.2010 10:55 # +1
Что ты хотел показать этим кодом, школоло?
Webkill 17.06.2010 13:52 # +1
blackhearted 17.06.2010 16:41 # +1
Webkill 18.06.2010 04:44 # +1
guest 23.03.2012 18:29 # 0
typedef union { double d; void *p; long long ll; } properly_aligned_t;
size = ((size + sizeof (properly_aligned_t) - 1) & (sizeof (properly_aligned_t) - 1));
guest 17.06.2010 08:04 # +1
guest 17.06.2010 11:18 # −3
guest 17.06.2010 11:28 # −4
guest 17.06.2010 15:21 # −3
blackhearted 17.06.2010 16:41 # −3
guest 17.06.2010 17:01 # −4
guest 18.06.2010 02:04 # 0
А вот скажи -- last так и будет расти бесконечно?
pushkoff 18.06.2010 12:45 # 0
предел у него около 512метров, но страницы выделяются только при первом обращении...