Управление памятью, страница 3

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

10.2. Память, управляемаяпрограммистом исистемой

До какой степени следует позволять программисту непосредственно управлять распределением памяти? С одной стороны, популярность языка С объясняется отчасти тем, что он предоставляет программисту широкие возможности явного управления памятью посредством операций ma11ос и free, которые соответственно выделяют память для структур данных, определяемых программистом, и освобождают ее. С другой стороны, многие языки высокого уровня не дают программисту никаких средств прямого управления памятью; на распределение ресурсов памяти можно влиять только косвенным образом путем использования тех или иных возможностей языка.

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

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


10.3. Статическое управление памятью


463



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

Фазыуправленияпамятью

Принято выделять три основных аспекта управления памятью.

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