Разница между физической адресацией и концепцией виртуальной адресации

Почему wait () всегда следует вызывать внутри цикла

blockquote>

. Основная причина, по которой петли while так важны, - это условия гонки между потоками. Разумеется, ложные пробуждения реальны, а для некоторых архитектур они являются общими, но условия гонки являются гораздо более вероятной причиной для цикла while.

Например:

synchronized (queue) {
    // this needs to be while
    while (queue.isEmpty()) {
       queue.wait();
    }
    queue.remove();
}

С приведенный выше код, может быть 2 потребительских потока. Когда производитель блокирует queue, чтобы добавить к нему, потребитель № 1 может быть заблокирован в блокировке synchronized, пока потребитель # 2 ожидает на queue. Когда элемент добавляется в очередь и notify вызывается, # 2 перемещается из очереди ожидания, которая должна блокироваться блокировкой queue, но будет позади потребителя # 1, который был уже заблокирован на замке. Это означает, что потребитель № 1 сначала отправляется вперед, чтобы вызвать remove из queue. Если цикл while - это только if, тогда, когда потребитель # 2 получает блокировку и вызывает remove, возникает исключение, потому что queue теперь пуст - другой потребительский поток уже удалил элемент из очередь. Просто потому, что он был уведомлен, он должен убедиться, что queue по-прежнему пуст из-за этого состояния гонки.

Это хорошо документировано. Вот веб-страница, которую я создал некоторое время назад, которая подробно объясняет условие гонки и имеет некоторый пример кода.

23
задан bahrep 5 January 2018 в 11:51
поделиться

2 ответа

Физическая адресация означает, что ваша программа действительно знает реальное расположение оперативной памяти. Когда вы обращаетесь к переменной по адресу 0x8746b3, она действительно хранится в физических чипах ОЗУ.

При виртуальной адресации все обращения к памяти приложения переходят в таблицу страниц, которая затем отображается из виртуального в физический адрес. Таким образом, каждое приложение имеет свое собственное «личное» адресное пространство, и никакая программа не может читать или записывать в память другой программы. Это называется сегментация .

Виртуальная адресация имеет много преимуществ. Он защищает программы от сбоя друг друга из-за плохого манипулирования указателем и т. Д. Поскольку каждая программа имеет свой собственный набор виртуальной памяти, ни одна из программ не может читать чужие данные - это одновременно и безопасность, и плюс безопасности. Виртуальная память также позволяет разбивать на страницы , где физическое ОЗУ программы может храниться на диске (или, теперь, более медленной флэш-памяти), когда оно не используется, а затем вызываться обратно, когда приложение пытается получить доступ к странице. Кроме того, поскольку только одна программа может быть размещена на конкретной физической странице , в физической системе подкачки либо a) все программы должны быть скомпилированы для загрузки по разным адресам памяти, либо b) каждая программа должна использовать Position- Независимый код или c) некоторые наборы программ не могут выполняться одновременно.

Физически-виртуальное отображение может быть сделано в программном обеспечении (с аппаратной поддержкой перехватов памяти) или в чистом аппаратном обеспечении. Иногда даже сами таблицы страниц находятся на специальном наборе аппаратной памяти. Я не знаю, с какой стороны, что встроенная система делает, но на каждом рабочем столе есть аппаратный TLB (Translation Lookaside Buffer, в основном кэш для виртуально-физических отображений), а некоторые теперь имеют расширенные модули отображения памяти, которые помогают с виртуальные машины и тому подобное.

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

47
ответ дан Borealid 5 January 2018 в 11:51
поделиться

VAX (Virtual Address eXtented Digital Equipment Corp, которая стала Compaq, которая стала HP) является очень хорошим примером виртуальной встроенной аппаратной системы. Это был 32-битный мини-компьютер с ОС под названием VMS или Virtual Memory Systems. Дейв Катлер был одним из главных архитекторов систем, и он намного позже написал Kernal для Windows NT. Он очень хорошо читает это и другие вещи. У Vax было специальное оборудование для управления виртуальным пространством и контроля доступа кода операции для обеспечения безопасности с помощью оборудования ... очень безопасно. Эта система была или является дедушкой современного ПК на уровне Kernal. Первый BSOD, который я увидел в WNT 3.51, я смог прочитать, потому что он пришел из аварийного дампа, используемого в VMS для остановки системы в нестабильном состоянии. Кстати, посмотрите на названия VMS и WNT, и вы найдете следующие буквы в алфавите от VMS, что делает термин WNT. Это был не несчастный случай. возможно, удар в DEC за то, что он отпустил его.

1
ответ дан MarkC 5 January 2018 в 11:51
поделиться
Другие вопросы по тегам:

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