Весь программный код загружается в раздел текст\код\сегмент памяти

Я начал интересоваться программированием на C, и хотя я не совсем новичок (у меня есть знания в области Java и веб-разработки), я многого не понимаю.

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

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

После этого этот код\набор инструкций заменяется на физический диск и из него, поскольку процесс получает процессорное время, или загруженный код остается в памяти во время работы программы?

Если два процесса могут совместно использовать один и тот же набор инструкций, означает ли это, что каждый процесс получает отдельный раздел кода в своем пространстве виртуальной памяти?

Извините, если мои вопросы простые или плохо сформулированы, но я начал изучать это только на прошлой неделе, и после выходных чтения у меня гораздо больше вопросов, чем ответов!


person berimbolo    schedule 20.05.2013    source источник


Ответы (1)


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

Большинство современных ОС будут загружаться «по запросу», поэтому начальная точка приложения (main) будет загружена ОС, а затем ОС просто запустится там. Когда приложение переходит к фрагменту кода, которого еще нет в памяти, оно загружает этот бит.

После этого этот код\набор инструкций заменяется на физический диск и из него, поскольку процесс получает процессорное время, или загруженный код остается в памяти во время работы программы?

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

Если два процесса могут совместно использовать один и тот же набор инструкций, означает ли это, что каждый процесс получает отдельный раздел кода в своем пространстве виртуальной памяти?

Безусловно, код можно использовать для нескольких копий одного и того же приложения. Опять же, делает ли это конкретная ОС или нет, зависит от ОС. Linux, безусловно, разделяет копии кода одного и того же приложения между двумя (не связанными) процессами [очевидно, разветвленный процесс разделяет код по определению]. Я считаю, что Windows тоже.

Общие библиотеки (файлы «.so» и «.dll» для Linux/Unix и Windows соответственно) также используются для совместного использования кода между процессами — одна и та же общая библиотека используется для многих различных приложений.

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

person Mats Petersson    schedule 20.05.2013
comment
Матс, спасибо за этот ответ, он охватил все, что мне нужно было знать, но, к сожалению (как это обычно бывает), он оставил у меня больше связанных вопросов! Если бы были загружены инструкции для метода и этот метод можно было бы вызывать несколько раз в течение жизни программы, остался бы он в памяти? И мой другой вопрос о коде для создания графического дисплея? Я предполагаю, что этот код должен загружаться постоянно в течение всего срока службы программы, или я ошибаюсь, думая об этом? - person berimbolo; 20.05.2013
comment
Пока памяти не так много, чтобы ОС нуждалась в памяти для чего-то другого, она остается в памяти. Я не понимаю, почему код для создания графического отображения отличается от любого другого кода - это код, точно так же, как код, который выполняет математику, выполняет поиск в таблице или подсчитывает количество единиц в некотором целом числе. [Очевидно, что код для ДРАЙВЕРА, который фактически рисует на экране, является модулем ядра или системным драйвером, и они, как правило, не подлежат замене - и обычно они также не загружаются по запросу, а загружаются все сразу, а не выгружаются в типичный случай]. - person Mats Petersson; 20.05.2013
comment
Я должен добавить, что обычно ОС отслеживает, как долго эта память использовалась каким-либо образом. Таким образом, более вероятно, что какой-то код (или данные), который простоял без дела, будет удален, чем тот, который недавно был запущен. - person Mats Petersson; 20.05.2013
comment
хорошо, еще раз спасибо, что нашли время, чтобы объяснить это, я думаю, что теперь я счастлив, что понимаю достаточно, чтобы продолжить чтение! Ваше здоровье. - person berimbolo; 20.05.2013