Как написать функцию выделения памяти?18.08.2020, 01:51. Показов 7879. Ответов 76
Метки нет (Все метки)
Насколько сложно это сделать? Покажите примитивный механизм поиска памяти, как вариант мне даже интересно посмотреть как работают известные функции(
new maloc caloc), я читал что по принципу сборщика мусора но механизмов реализации не видел.
0
|
|
| 18.08.2020, 01:51 | |
|
Ответы с готовыми решениями:
76
Создать функцию для выделения памяти под двумерный массив |
| 31.08.2020, 23:18 [ТС] | ||
brk является первичной функцией низкоуровневой тот её и не нужно указывать в стандартах: 1)потому что она только просит память и возвращает указатель; 2)она не сохраняет размер( и номер блока если это нужно); 3)она не инициализирует запрошенный участок; 4)она не помечает поля с которыми вы работаете; 6)возможно не работает с виртуальной памятью т.е. вообще либо не производит никаких регулировок (точно не знаю потому что спрашиваю сам); 5)она не производит никаких оптимизаций в отличие от maloc и newДругими словами это сырая функция. Что по вашему стоит за maloc в последней вашей ссылке тоже используется brk. Вы знаете какие-нибудь методы запроса памяти не используя maloc brkВы выше упомянули виртуальную память про неё то я забыл. Я так понимаю что brk запрашивает физическую память в отличие от maloc который является функцией разработчиков и работает правильно, в неё конечно вложен многолетний труд. Я думаю что new использует maloc, последняя более первичная функция по отношении к new?
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 01.09.2020, 01:12 | |||||||
0
|
|||||||
|
Модератор
|
|
| 01.09.2020, 06:25 | |
|
Кен Томпсон написал break в UNIX раньше.
Когда написали первый Си, break уже был. И использовался в ранних юниксовых программах. http://man.cat-v.org/unix-1st/2/sys-break
0
|
|
|
Модератор
|
||
| 01.09.2020, 15:57 | ||
myMalloc(), который написал Renji, https://www.cyberforum.ru/post14812869.htmlкак раз работает по принципу sbrk()
0
|
||
| 01.09.2020, 22:28 [ТС] | ||
Малокиэто модифицированные функции а sbrk()это просто сырая функция выделяющая память. Ну там идёт не выделение, там происходит имитация это функция просто двигает указатель внутри ядра или где там короче подаёт команду в процессор(грубо говоря тонкостей нельзя всех знать). Меня заинтересовало то что вы выше написали что есть ещё и виртуальная память и возникает вопрос где просит память sbrk(), это будет физическая память которую нужно самому регистрировать в виртуальную страницу или эта деталь уже учтена т.е. работа изначально происходит с виртуальной памятью. Но опять же есть ещё библиотека "windows.h", которая работает с исключениями а также там проверяется выход за пределы виртуальной страницы, получается что работая с sbrk() нужно самому это дело настраивать или нет?
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 02.09.2020, 00:30 | ||
|
2
|
||
|
Модератор
|
|||||||||||
| 02.09.2020, 05:34 | |||||||||||
|
Минимальная реализация
realloc() в стиле Microsoft Windows. ![]() https://github.com/changloong/... b/malloc.c Организация управления памятью прилкадных программ к с++ напрямую не относится. Это или общие вопросы практики программирования или https://www.cyberforum.ru/c-linux/ и https://www.cyberforum.ru/c-linux/ , если обсуждаются особенности конкретных систем. Кликните здесь для просмотра всего текста
А в с++ new, delete, std::realloc() - средства перераспределения памяти с целью последующего создания в ней новых объектов.И изучаеющему полезно помнить, что стандарт с++ позволяет переопределять operator new (и delete) как глобально, так и для отдельных классов, а также определять новые варианты этих операторов ( с другими параметрами ), отсутствующие в стандарте.
0
|
|||||||||||
| 03.09.2020, 00:53 [ТС] | ||
sbrk()? Я имею в виду какую память просит sbrk() физическую или виртуальную или это не имеет значения, память по умолчанию запрашивается виртуальная а уже поиск физической памяти это уже не задача sbrk(), этим может заниматься ОС, если подана команда в ОС на запрос памяти то она её даёт, если виртуальной памяти не хватает то ОС просит физическую память и тем самым увеличиваем объём виртуальной а виртуальная память отдаёт часть себя нужной программе? Какие там примерно механизмы такие или нет?
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 03.09.2020, 01:36 | ||
|
Виртуальная "память" это просто ассоциативный массив внутри процессора, состоящий из пар "виртуальный адрес:куда обращаться за данными". Причем, "куда" может быть как физической памятью, так и вызовом некоторой функции (подгрузки свопа, например). Все эти sbrk просто оформляют бумажку "предъявителю сего выдать данные по обращению к адресу 0x12345678". Выдадут ли по этой бумажке хоть что-то или менеджер памяти внезапно объявит себя банкротом - вопрос другой.
0
|
||
| 03.09.2020, 02:44 [ТС] | ||
sbrk() не целесообразно да и по большей степени мы в своих функциях такую проверку не делаем т.к. 99% что new maloc дадут память. В общем на этой функции можно свободно строить свои функции.
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 03.09.2020, 03:46 | |||||||
0
|
|||||||
|
Модератор
|
||||||||||||||||||||||||||
| 03.09.2020, 11:34 | ||||||||||||||||||||||||||
brk() при этом на моей системе практически не дёргается
Microsoft linux на Windows 10 справляется с лабораторной работой по суммированию 27-гигабайтного массива.
0
|
||||||||||||||||||||||||||
|
Модератор
|
||||||
| 06.09.2020, 06:44 | ||||||
|
На 1000 new char[010000000000] всего 3 вызова
brk() за всё время работы программы, при том два из них - brk(0) .
0
|
||||||
|
Модератор
|
||||||
| 07.09.2020, 06:10 | ||||||
|
За этим системным вызовом стоит история UNIX и лично Кен Томпсон с покойным Деннисом Ритчи.
https://minnie.tuhs.org/Archiv... /man21.pdf https://minnie.tuhs.org/Archiv... _Jun72.pdf
0
|
||||||
|
Модератор
|
||||||||||||||||||||||||||
| 07.09.2020, 17:31 | ||||||||||||||||||||||||||
|
Не по теме:
Кликните здесь для просмотра всего текста
jsr r0,iget / get i-node for file to be executed
bit $20,i.flgs / is file executable beq error9 jsr r0,iopen / gets i-node for file with i-number given in / r1 (opens file) bit $40,i.flgs / test user id on execution bit beq 1f tstb u.uid / test user id beq 1f / super user movb i.uid,u.uid / put user id of owner of file as process / user id 1: mov (sp)+,r5 / r5 now contains address of list of pointers to / arguments to be passed mov $1,u.quit / u.quit determines handling of quits; / u.quit = 1 take quit mov $1,u.intr / u.intr determines handling of interrupts; / u.intr = 1 take interrupt mov $rtssym,30 / emt trap vector set to take system routine mov $fpsym,*10 / reserved instruction trap vector set to take / system routine mov $sstack,sp / stack space used during swapping mov r5,-(sp) / save arguments pointer on stack mov $ecore,r5 / r5 has end of core mov $core,r4 / r4 has start of users core mov r4,u.base / u.base has start of users core mov (sp),r2 / move arguments list pointer into r2 1: tst (r2)+ / argument char = "nul" bne 1b tst -(r2) / decrement r2 by 2; r2 has addr of end of arguent / pointer list 1: / move arguments to bottom of users core mov -(r2),r3 / (r3) last non zero argument ptr cmp r2,(sp) / is r2 = beginning of argument ptr list blo 1f / branch to 1f when all arguments are moved 2: tstb (r3)+ bne 2b / scan argument for \0 (nul) 2: movb -(r3),-(r5) / move argument char by char starting at / "ecore" cmp r3,(r2) / moved all characters in this argument bhi 2b / branch 2b if not mov r5,(r4)+ / move r5 into top of users core; r5 has / pointer to nth arg br 1b / string 1: clrb -(r5) bic $1,r5 / make r5 even, r5 points to last word of argument / strings mov $core,r2 1: / move argument pointers into core following argument strings cmp r2,r4 bhis 1f / branch to 1f when all pointers are moved mov (r2)+,-(r5) br 1b 1: sub $core,r4 / gives number of arguments *2 asr r4 / divide r4 by 2 to calculate the number of args stored mov r4,-(r5) / save number of arguments ahead of the argument / pointers clr -(r5) / popped into ps when rti in sysrele is executed mov $core,-(r5) / popped into pc when rti in sysrele / is executed mov r5,0f / load second copyz argument tst -(r5) / decrement r5 mov r5,u.r0 / sub $16.,r5 / skip 8 words mov r5,u.sp / assign user stack pointer value, effectively / zeroes all regs when sysrele is executed jsr r0,copyz; core; 0:0 / zero user's core clr u.break mov r5,sp / point sp to user's stack mov $14,u.count mov $u.off,u.fofp clr u.off / set offset in file to be read to zero jsr r0,readi / read in first six words of user's file, starting / at $core mov sp,r5 / put users stack address in r5 sub $core+40.,r5 / subtract $core +40, from r5 (leaves / number of words less 26 available for / program in user core mov r5,u.count / cmp core,$405 / br .+14 is first instruction if file is / standard a.out format bne 1f / branch, if not standard format mov core+2,r5 / put 2nd word of users program in r5; number of / bytes in program text sub $14,r5 / subtract 12 cmp r5,u.count / bgt 1f / branch if r5 greater than u.count mov r5,u.count jsr r0,readi / read in rest of user's program text add core+10,u.nread / add size of user data area to u.nread br 2f
https://www.tuhs.org/cgi-bin/u... n2/break.2 https://www.tuhs.org/cgi-bin/u... an2/exec.2 Те же exec() и sbreak(), переписанные на архаичном Си:https://www.tuhs.org/cgi-bin/u... ken/sys1.c Добавлено через 4 часа 9 минут А вот и простой malloc() на K&R https://www.tuhs.org/cgi-bin/u... r/malloc.c
1
|
||||||||||||||||||||||||||
|
Модератор
|
|||||||
| 07.09.2020, 21:17 | |||||||
![]() Вот, кстати, чуть короче реализация: https://www.tuhs.org/cgi-bin/u... sys/sys1.c
0
|
|||||||
|
Неэпический
|
|
| 07.09.2020, 21:49 | |
|
politoto, почему-то всегда читаю твой ник как "поллитро"
2
|
|
| 07.09.2020, 21:49 | |
|
Написать функцию выделения первого слова из строки Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память)
Написать код для динамического выделения памяти под массив из 10000 целых чисел Написать функцию выделения произвольной строки двумерного массива в одномерный Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер
На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|