• Стек и куча (память)?

    Griboks, вы про ответ jcmvbkbc?

    ulimit -s изменяет размер аппаратного стека для процесса
  • Стек и куча (память)?

    Griboks, не понимаю как виртуальная машина это опровергает и какое отношение к ассемблеру вообще имеет.

    Возьмём jvm например. class-файл не является машинным кодом для платформы. Это байт-код для виртуальной машины. Он в любом случае будет либо скомпилирован в машинный код платформы либо интерпретирован на ней же с помощью инструкций процессора.

    class- файл можно однозначно дизессамблировать в S-выражения и потом обратно. Например https://github.com/minad/chasm

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

    Griboks,

    Почему вы продолжаете мне рассказывать про строение аппаратного стека?

    Потому что в этом заключался вопрос на который вы ответили. Речь шла о куче и аппаратном стеке. Но вы зачем-то приплели в своем ответе программный стек.
  • Стек и куча (память)?

    Griboks,

    Да неужели?

    Да. Нет никаких структур в аппаратном стеке. Есть 2 регистра ESP и EBP (говорю про x86) и линейная область памяти зарезервированная под стек. Все, этими двумя регистрами и происходит все управление стеком. Нет никаких структур, которые ссылаются куда-то.
    Уменьшили значение в ESP - зарезервировали память для своих нужд. Увеличили - освободили память. (тут не ошибка, стек растет снизу вверх). Стек еще называют памятью с автоматическим управлением

    То о чем вы говорите с примером со структурой это просто структура данных стек. Она не относится к аппаратной части процесора. И по большей части распологается она в куче.

    https://rsdn.org/article/cpp/ObjectsAndPointers.xm...

    Макроассемблер

    Речь не идет о макроассемблере. Макросы просто позволяют не вычислять руками некотоые данные (например использовать метки вместо смещений). Но никто не запрещает вместо метки использовать непосредственно смещение или адрес, но его придется вычислить руками.

    А когда дело доходит до виртуальных машин, всё становится ещё сложнее.

    Причем тут они? О них речь не шла.
  • Стек и куча (память)?

    Griboks,

    struct stack
    {
    char *data;
    struct stack *next;
    };


    Это структура данных под названием стек. Это не тоже самое что и аппаратный стек в процессоре.

    Мы с вами говорим об совсем разных сущностях.

    В том, что на машинном коде я могу написать программу без call, без автоматических действий и прочего. Только тот минимум, который необходим. С тем оптимизациями, которые уместны или недоступны верхнему уровню.

    Можно какой-нибудь пример простенький?
    Я вас не понимаю. Дело в том, что ассемблер и машинный код это одно и тоже записанное разными символами. Множесто строк ассемблера и множество байт машинных кодов изоморфны. Между ними есть биекция.
  • Стек и куча (память)?

    Т.е. если бы вы писали на машинном коде, у вас бы программа работала бы быстрее, чем на ассемблере.

    Я могу написать "CALL 0xffffffff" а потом транслировать в машинный код. Могу сразу "e8 ff ff ff' а потом записать в бинарном виде. В чем разница? Может вы говорите про микрокод именно, а не машинный код?

    Одна команда выполняется за несколько тактов, состоит из нескольких микрокоманд, которые выполняются за 1 такт.

    Наконец-то. Да, именно об этом я и говорю.

    Обязательно. В противном случае, эта абстракция называлась бы по-другому.

    https://godbolt.org/z/ZFKFd4
    Доступ к переменной 'a' расположенной в глубине стека по указателю (адресу) без раскрутки самого стека. Ничем не отличается от доступа к любой другой переменной по адресу `addl $0x1,(%rdi)`
    Или вот с рекурсией https://godbolt.org/z/NzqfTG. Глубина рекурсии 1000, но переменная 'a' все так же доступна по прямому адресу.
    Число операций для доступа к 'a' в обоих случаях одинакого.

    Адреса регистров заранее известны

    Если вы приплетаете микрокод, который является деталью реализации и в принципе не имеет никаких доступных спецификаций и способов работы с собой, то почему же вы забываете о переименовывании регистров, что тоже является частью реализации?
    Просто взгялнув на строчку кода нельзя дать однозначный ответ в какой физический регистр будет осуществен доступ.
  • Стек и куча (память)?

    Griboks,

    Получается, что оверхед по командам составляет минимум 2х, а по времени - минимум 4х.

    Т.е. когда вы будете в куче выделять память, то оверхеда не будет? Да у вас вход в аллокатор на порядок больше времени займет для каждого объекта. А именно в этом была суть вопроса.

    Что бы достать значение из стека не обязательно доставать элементы по очереди. Достаточно по абсолютному адресу обратиться. Никакого оверхеда.

    Поэтому с этой точки зрения микрокод выполняется за дробное количество операций.

    Вы не правы. Процессор это дискретное устройство, он не может изменить заряд на затворе транзистора без помощи тактового генератора.
    Ни одна команда или микрокоманда не может быть исполнена менее чем за 1 такт.
    Если я не прав, то вам не составит труда найти это в любом мануале.

    Он никак не привязан к тактам

    Операции привязаны.

    Кстати, регистры - это тоже своего рода физическая абстракция, т.к. для процессора регистры являются такой же памятью, как и l1,l2,l3,ram,ПЗУ

    Раз это такая же память, то как получить адрес регистра?
  • Стек и куча (память)?

    Griboks,

    Например, команда call вызывает процедуру, и транслируется в несколько инструкций (операций). Даже если подобные инструкции однозначны, они дают оверхед.


    Ну давайте разбираться в сколько инструкций транслируется CALL.
    https://godbolt.org/z/JLG3VH

    Опа, одна инструкция `e8 rel32`, корректное смещение будет подставлено на этапе линковки.
    Лезем в мануал интела
    https://www.intel.com/content/dam/www/public/us/en...

    Раздел 3-122 CALL—Call Procedure

    И смотрим, что вариантов CALL несколько. Могут быть вызовы процедуры по аболютному адресу как far, так и near. У нас тут вариант вызова по смещению.
    Но ни один из вариантов не транслируется в 2 команды или более.

    О каком оверхеде вы говорите?

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

    Вы о каком стеке говорите то? Аппаратный стек в x86, arm и куче других архитектур не может быть фрагментирован никак. Вы не можете выделить или освободить память в нем в середине. Только сверху.
    Что бы освободить память где-то в середине, то вам придется выйти из всей цепочки функций вплоть до той стекфрейм которой вы хотите освободить.

    чем больше стек, тем больше выполняется операций по работе с ним => тратится больше тактов процессора на несвязанные с программой действия => коэффициент утилизации падает.

    Все еще не понятно. Текущий размер стека определяется значением в регистре ESP (для x86). И все. Больше ничем. Изменить значение в этом регистре можно обычным mov за один такт изменить. Как это влияет на производительность?

    Микроко́д — программа, реализующая набор инструкций процессора.

    Микрокод преобразует одну сложную CISC команду в набор RISC.
    Но ни одна RISC команда не может быть обработана меньше чем за такт. Это ограничение схемотехники процессоров. Если команда имеет результат какой-то (а иначе она бесмыссленна), то она должна поменять что-то в процессоре. Значение какого-то регистра например. А сделать это можно лишь при очередном сигнале от тактового генератора. Даже ничего не делающий NOP имеет результат - изменение значения в регистре RIP. И он не может быть исполнен быстрее чем за один такт.

    хранить большие переменные на стеке неэффективно

    Тут есть доля истинны. Большие переменные на самом деле хранить на стеке очень эффективно, пока они влязят в стек. Просто структуры переменного размера (например списки) на стеке хранить невозможно приципиально, т.к. нельзя "довыделить" память в середине стека.
    Можно конечно попробовать размотать его, поменять адреса возврата. Но это будет жутко неоптимально и сложно. К тому же абсолютные адреса будут поломаны.
  • Стек и куча (память)?

    Griboks

    Я знаю что такое микрокод.
    Вы привидите пример CISC команды исполняемой за один такт, которая транслируется в более чем одну команду RISC.
  • Стек и куча (память)?

    @Griboks

    > Они работают быстрее машинного когда и как раз умеют в дробные такты.

    Какие ваши доказательства?
    Один такт это одно переключение транзистора.

    Как можно сделать какую-то работу, не переключив ничего?
  • Стек и куча (память)?

    > Даже программа на ассемблере работает медленнее аналога на машинном коде

    Что простите? Ассемблер это просто человекочитаемый машинный код.

    Каждая строчка на ассемблере однозначно кодируется машинной командой с точностью до смещений.

    Вы так и не объяснили, почему большой стек медленнее маленького?

    Различие между ними лишь в значении регистра.
  • Стек и куча (память)?

    Griboks, у вас какая-то бессвязная речь.

    Причем тут машинный код?
    Увеличение значения регистра это и есть машинный код.

    Куда уж быстрее, чем один такт? Полтакта? Компьютеры так не работают.
  • Стек и куча (память)?

    Griboks, выделение и освобождение памяти в стеке это изменение одного регистра, один такт.

    Это на порядки быстрее кучи.
  • Стек и куча (память)?

    > чем больше стек, тем он медленнее
    Это как?
  • Возможно ли совмещать очную форму обучения в ВУЗе и фриланс?

    antonwx, 2 принятых мной оффера и куча собеседований. Ни разу не спрашивали про образование. Наверное стоит бежать от таких контор.

    Другое дело если есть планы уехать за бугор. Но тогда нужна не шарага, а именно вуз. Да и не абы какой, а из перечня. Причем у каждой страны он свой.
  • Возможно ли совмещать очную форму обучения в ВУЗе и фриланс?

    antonwx, какой смысл тогда вообще поступать? На кой черт этот диплом?
  • Какие характеристики затрагиваются при компиляции или интерпретации?

    Чистота важнее всего. Компьютер должен быть чистым, протирайте почаще клавиатуру и мышь.
  • Какую видеокарту посоветуете для KDE?

    > не работает WebRender в firefox
    Так вот оно что. Пробовал gui azul для раста. Думал совсем багованая штука. Спасибо.
  • Как уехать за границу?

    Ярослав Александров, Москва-Торронто 35-60к в обе стороны. Если за 5 лет не смог накопить на билет, то может дело не в цене билета?