Стек Program и "куча", как они работают?

Да, вы можете выполнить эту проверку. Например:

class IssuedContract : Contract {
    companion object {
        // Used to identify our contract when building a transaction.
        const val ID = "com.issuing.IssuedContract"
    }

    private val expectedIssuer = CordaX500Name("Expected Issuer", "London", "GB")

    override fun verify(tx: LedgerTransaction) {
        val issuedStates = tx.outputsOfType<IssuedState>()
        issuedStates.forEach { issuedState ->
            if (issuedState.issuer.name != expectedIssuer)
                throw IllegalArgumentException("The state is not issued by the correct party.")
        }
    }
}

Однако, этот подход был бы хрупким. Контракт будет работать только для указанного эмитента.

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

27
задан 4 revs, 3 users 67% 16 July 2012 в 06:58
поделиться

4 ответа

Попробуйте:

g++ -static -pthread Thread.cpp -lboost_thread

Библиотеки должны быть указаны после объектов (или источников), использующих символы из этих библиотек.

-121--3329852-

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

Рассмотрим суперкласс, который проверяет поля x и y , а подкласс - x , y и z .

Итак, подкласс = = суперкласс = подкласс, где z отличается между первым экземпляром подкласса и вторым, нарушая транзитивную часть контракта.

Поэтому типичная реализация равных будет проверять getClass ()! = obj.getClass () вместо того, чтобы делать экземпляр. В приведенном выше примере проверка экземпляра SubClass или Superclass приведет к нарушению симметрии.

Таким образом, результат состоит в том, что подкласс может, безусловно, принимать во внимание super.equals (), но также должен выполнить собственную проверку getClass (), чтобы избежать вышеуказанных проблем, а затем проверить на равенство в собственных полях в дополнение. Это была бы странная утка класса, которая изменила свое собственное равное поведение на основе определенных полей суперкласса, а не просто, если суперкласс возвращается равным.

-121--989555-
  1. Да - стек обычно хранится в «низких» адресах памяти и заполняется вверх к своему верхнему пределу. Куча обычно хранится в «верхней части» адресного пространства и растет в направлении стека.

  2. В операционной системе хранится «контекст» для каждого выполняющегося процесса. Операция сохранения и восстановления состояния процесса называется «переключением контекста».

  3. Просто соглашение AFAIK. Стек на самом деле не «растет» он имеет фиксированное распределение.

  4. Кэши просто содержат снимки частей оперативной памяти, которые были использованы (недавно или рядом). В любой момент времени они могут иметь память из любой части адресного пространства в них. То, что отображается, сильно зависит от структурных параметров кэша (длина блока, ассоциативность, общий размер и т.д.).

Я бы предложил Computer Architecture: A Quantitative Approach в качестве хорошей ссылки на базовое оборудование и любую книгу по операционным системам для того, как оборудование «управляется»

.
14
ответ дан 28 November 2019 в 05:46
поделиться

Когда используется операционная система защищенного режима (например, Windows или Linux), каждый процесс имеет целую кучу страниц памяти, доступных для данного процесса. Если требуется больше памяти, больше страниц может быть выгружено.

Как правило, процесс делит память, данную ему на две части. Один - это куча, а другой - стек. Нижняя часть стека обозначается указателем стека r13 на руке и esp на x86. Когда кто-либо создает переменную в стеке, указатель стека перемещается, чтобы учесть необходимое дополнительное пространство. Это делается инструкцией ассемблера PUSH. Точно так же, когда переменная выходит из области видимости, она выводится из стека.

Обычно PUSH вызывает уменьшение указателя стека, оставляя значение выше значения указателей стека «в стеке».

Другая часть памяти может использоваться для кучи. Это тогда доступно для распределения с использованием malloc или new. Каждый поток должен иметь свой собственный стек, но может совместно использовать кучу с другими потоками в процессе.

Когда ядро ​​перепланирует поток, оно сохраняет регистр стека и изменяет регистр стека на новый стек. если может или не нужно хранить счетчик программы в зависимости от того, как это делает планирование.

Кеш не имеет ничего общего ни со стеком, ни с кучей. Он управляется процессором и обеспечивает способ гарантировать, что данные, необходимые для ЦП, находятся под рукой, так что ему не нужно ждать, пока шина его извлечет. Это полностью зависит от процессора, чтобы гарантировать, что то, что находится в основной памяти, совпадает с тем, что хранится в кэше. Единственное время, когда действительно нужно беспокоиться о кеше - это использование DMA. Один из них должен будет вручную очистить или синхронизировать кеш, чтобы процессор не доверял кешу и фактически извлекал данные из основной памяти.

1
ответ дан doron 28 November 2019 в 05:46
поделиться

3. Почему стек растет вниз, и куча растет?

Обратите внимание, что в некоторых системах (например, некоторые системы HP), стек растет вверх вместо вниз. И на других системах (например, IBM / 390) есть NO NO NO Real Advance Sack, а скорее пул страниц, которые динамически выделяются из памяти пользовательского пространства.

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

3
ответ дан 28 November 2019 в 05:46
поделиться

Это мое понимание этих вопросов:

  1. - это стек также частью какой-то страницы в основной памяти?

    Да, стек обычно также хранится в программе процесса.

  2. Что произойдет, когда программа перемещена в состояние ожидания, где находится указатель стека, счетчик программы и другой информацией, сохраненные в

    , когда оперативная система принимает процесс под активным ожиданием, он хранит все регистры (что включает в себя Указатель стека и счетчик программы) в таблице процессов ядра. Затем, когда он снова станет активным, ОС копирует всю эту информацию обратно на место.

  3. Почему стек растет, и куча растет?

    , потому что они обычно должны делиться одно и то же адресное пространство, и в качестве удобства они начинают на один конец адресного пространства. Затем они растут друг к другу, давая тем, что расти поведение.

  4. CAN CAN L1, кэш L2 содержит только один кусок непрерывной памяти или может иметь какую-то часть стека и кучи?

    Кэширует CPU, сохранит недавно использованные куски памяти. Поскольку оба стека, так и куча хранятся в основной памяти, кэши могут содержать части обоих.

7
ответ дан 28 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: