Есть ли какие-либо шансы, что malloc() возвратит тот же начальный адрес в два процесса.
Да, но это не проблема.
Что вы не понимаете, так это то, что операционные системы сначала обрабатывают ваше физическое пространство - программы и т. Д. Видят только виртуальные адреса. Существует только одно виртуальное адресное пространство, однако операционная система (давайте придерживаться 32-битной версии) делит это. В Windows верхняя половина (0xA0000000 +) относится к процессам ядра и нижней половины к пользовательскому. Это называется разделение 2 ГБ/2 ГБ. В Linux, разрыв составляет 3GB/1GB - см this article:
памяти ядра определяется начать в PAGE_OFFSET, что в x86 является 0xC0000000, или 3 гигабайта. (Здесь определяется разделение 3gig/1gig.) Каждый виртуальный адрес выше PAGE_OFFSET является ядром, любой адрес ниже PAGE_OFFSET является адресом пользователя.
Теперь, когда происходит переключение процессов (в отличие от переключения контекста), все страниц, принадлежащих к текущему процессу являются некартированными из виртуальной памяти (не обязательно пейджинговые их) и все страниц, принадлежащие к (отказ от ответственности: это может быть не совсем верно, можно было бы пометить страницы грязными и т. д. и скопировать на доступ, теоретически).
Причина разделения заключается в том, что по соображениям производительности верхняя половина пространства виртуальной памяти может отображаться в ядре операционной системы.
Таким образом, хотя таНос может возвращать то же значение в двух заданных процессов, что не имеет значения, потому что:
- физически, они не тот же адрес.
- Процессы не обмениваются виртуальной памятью в любом месте.
Для 64-разрядных систем, поскольку в настоящее время мы используем только 48 из этих битов, существует залив между нижней частью пользовательского режима и режимом ядра, который не адресуется (пока).
Мы используем виртуальные адреса! – phoxis