Почему 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
по-прежнему пуст из-за этого состояния гонки.Это хорошо документировано. Вот веб-страница, которую я создал некоторое время назад, которая подробно объясняет условие гонки и имеет некоторый пример кода.
Физическая адресация означает, что ваша программа действительно знает реальное расположение оперативной памяти. Когда вы обращаетесь к переменной по адресу 0x8746b3, она действительно хранится в физических чипах ОЗУ.
При виртуальной адресации все обращения к памяти приложения переходят в таблицу страниц, которая затем отображается из виртуального в физический адрес. Таким образом, каждое приложение имеет свое собственное «личное» адресное пространство, и никакая программа не может читать или записывать в память другой программы. Это называется сегментация .
Виртуальная адресация имеет много преимуществ. Он защищает программы от сбоя друг друга из-за плохого манипулирования указателем и т. Д. Поскольку каждая программа имеет свой собственный набор виртуальной памяти, ни одна из программ не может читать чужие данные - это одновременно и безопасность, и плюс безопасности. Виртуальная память также позволяет разбивать на страницы , где физическое ОЗУ программы может храниться на диске (или, теперь, более медленной флэш-памяти), когда оно не используется, а затем вызываться обратно, когда приложение пытается получить доступ к странице. Кроме того, поскольку только одна программа может быть размещена на конкретной физической странице , в физической системе подкачки либо a) все программы должны быть скомпилированы для загрузки по разным адресам памяти, либо b) каждая программа должна использовать Position- Независимый код или c) некоторые наборы программ не могут выполняться одновременно.
Физически-виртуальное отображение может быть сделано в программном обеспечении (с аппаратной поддержкой перехватов памяти) или в чистом аппаратном обеспечении. Иногда даже сами таблицы страниц находятся на специальном наборе аппаратной памяти. Я не знаю, с какой стороны, что встроенная система делает, но на каждом рабочем столе есть аппаратный TLB (Translation Lookaside Buffer, в основном кэш для виртуально-физических отображений), а некоторые теперь имеют расширенные модули отображения памяти, которые помогают с виртуальные машины и тому подобное.
Единственными недостатками виртуальной памяти являются сложность в аппаратной реализации и более низкая производительность.
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 за то, что он отпустил его.