Работа с памятью

Татьяна Ефимова предлагает статью на тему: "работа с памятью" с детальным описанием.

Работа с памятью

Современные операционные системы не позволяют обращаться к любому участку оперативной памяти. Это в частности вызвано многозадачностью системы, т. е. чтобы одна программа, умышленно или по ошибке не могла исказить данные другой программы. Для доступа к памяти, сначала нужно запросить у операционной системы память, требуемого размера. Для работы с памятью в PureBasic есть ряд функций, описание которых можно найти в разделе Memory справки.
Итак, для того, чтобы получить доступ к памяти, её сначала нужно “заказать” у операционной системы, затем выполнить требуемые действия, после чего нужно обязательно освободить память, что-бы избежать её “утечек”. Под словом “утечка” имеется в виду использование памяти программой, после того, как она становится не нужной для дальнейших операций. Этого следует всячески избегать.

Вот пример работы с памятью.

*MemoryID = AllocateMemory (50) ; Запрашиваем у ОС 50 байт памяти
If *MemoryID
; В цикле производится запись в память
For i=0 To 9
PokeC ( *MemoryID +i, i)
Next i

; В цикле производится чтение из памяти
For i=0 To 9
Debug PeekC ( *MemoryID +i)
Next i
; Запись строки в память
PokeS ( *MemoryID , “Работа с памятью” )

; Чтение строки из памяти
Debug PeekS ( *MemoryID )

FreeMemory ( *MemoryID ) ; Освобождаем память, т. к. она больше не нужна
Else
MessageRequester (“”, “Не удалось выделить память!” )
EndIf

С помощью функции AllocateMemory у операционной системы запрашивается требуемое число байт, в данном случае 50. В случае успеха, функция возвращает указатель на первую ячейку памяти. Если по той или иной причине, не удалось выделить память, то функция вернет число 0 . Оператор If проверяет чтобы в переменной-указателе было число не равное нулю. В цикле For – Next происходит запись 10 байт в пе р вые 10 ячеек выделенной памяти, а затем, в следующем цикле, данные из памяти считываются и отображаются в отладочном окне. Потом в память записывается строка текста, после чего считывается от-туда.
Функция FreeMemory освобождает память, т. к. для работы программы она больше не нужна.

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

Жёлтым цветом выделены строки, в котрых происходит работа с памятью.
В начале программы с помощью функции OpenFileRequester создаётся стандартное окно выбора открываемого файла, в котром нужно указать путь с текстовому файлу, имеющему расширение TXT. Функция возвращает полный путь к выбранному файлу, который будет записан в строковую переименую File . Далее открывается выбранный файл и определяется его размер – количество байт в файле. Затем с помощью функции AllocateMemory выделяется размер памяти, равный размеру файла и с помощью функции ReadData данные из файла копируются в память. Так как файл нам больше не нужен (его копия хранится в памяти), то его закрываем с помощью функции CloseFile . Далее с помощью функции PeekS считываются данные из памяти и помещаются в строковую переменную с именем Text . Так как данные были скопированы в переменную и память нам больше не нужна, то её освобождаем при помощи функции FreeMemory .
Далее открывается окно и создаётся текстовый редактор, в который помещается текст из переменной Text . В итоге мы видим текст из выбранного файла.

Работа с памятью с помощью new и delete

Как известно, в языке С для динамического выделения и освобождения памяти используются фун­кции malloc() и free(). Вместе с тем С++ содержит два оператора, выполняющих выделение и освобождение памяти более эффективно и более просто. Этими операторами являются new и delete. Их общая форма имеет вид:

переменная_указатель = new тип_переменной;

Здесь переменная_указaтель является указателем типа тип_переменной. Оператор new выделяет память для хранения значения типа тип_переменной и возвращает ее адрес. С помощью new могут быть размещены любые типы данных. Оператор delete освобождает память, на которую указывает указатель переменная_указатель.

Если операция выделения памяти не может быть выполнена, то оператор new генерирует ис­ключение типа xalloc. Если программа не перехватит это исключение, тогда она будет снята с выполнения. Хотя для коротких программ такое поведение по умолчанию является удовлетвори­тельным, для реальных прикладных программ обычно требуется перехватить исключение и обра­ботать его соответствующим образом. Для того чтобы отследить это исключение, необходимо вклю­чить заголовочный файл except.h.

Оператор delete следует использовать только для указателей на память, выделенную с исполь­зованием оператора new. Использование оператора delete с другими типами адресов может по­родить серьезные проблемы.

Есть ряд преимуществ использования new перед использованием malloc(). Во-первых, оператор new автоматически вычисляет размер необходимой памяти. Нет необходимости в использовании оператора sizeof(). Более важно то, что он предотвращает случайное выделение неправильного количества памяти. Во-вторых, оператор new автоматически возвращает указатель требуемого типа, так что нет необходимости в использовании оператора преобразования типа. В-третьих, как ско­ро будет описано, имеется возможность инициализации объекта при использовании оператора new. И наконец, имеется возможность перегрузить оператор new и оператор delete глобально или по отношению к тому классу, который создается.

Ниже приведен простой пример использования операторов new и delete. Следует обратить вни­мание на использование блока try/catch для отслеживания ошибок выделения памяти.

#include
#include
int main()
int *p;
try p = new int; // выделение памяти для int
> catch (xalloc xa) cout
#include
int main()
int *p;
try p = new int (99); // инициализация 99-ю
> catch (xalloc xa) cout
#include
int main()
float *p;
int i;
try p = new float [10]; // получение десятого элемента массива
> catch(xalloc xa) cout

SBP-Program

Работа с памятью в C

Для работы с памятью в C используют библиотечные функции: free(), malloc(), calloc(), realloc().

используется для освобождения памяти, на которую указывает аргумент pointer. Сначала память выделяется для приложения, после завершения работы с памятью её надо вернуть, этим возвратом и занимается функция free.

Функция _msize возвращает размер область памяти, выделенной из кучи:

аргумент — указатель на блок памяти. Функция _msize возврашает размер памяти в байтах. size_t — это unsigned integer.

Еще статьи:  Что такое суицид расшифровка

Функция malloc выделяет область памяти из «кучи» (т.е. свободной области памяти):

аргумент определяет количество байтов, которое надо выделить из памяти. Функция malloc возвращает void указатель на выделенную область памяти, его можно привести к нужному типу. Если свободной для выделения памяти меньше, чем затребовоно в size_t, то функция malloc вернет NULL.

Пример работы с функцией malloc:

здесь выделено место в памяти для массива, состоящего из двух элементов типа int. Если выделение памяти пошло успешно, то освобождаем эту область памяти с помощью функции free.

Получаем:

Функция calloc выделяет область памяти и размещает в ней массив, инициализированный нулями:

первый аргумент количество элементов, а второй — размер в байтах одного элемента. Произведение значений аргуменов и даст величину области памяти, запрошенной для выделения. Функция calloc возвращает void указатель на выделенную область памяти, его можно привести к нужному типу. Если свободной для выделения памяти меньше, чем затребовоно, то функция calloc вернет NULL.

Пример работы с функцией calloc:

в примере выделяется память для массива типа int, содержащего два элемента. Эти элементы инициализированны нулями. Если выделение памяти пошло успешно, то освобождаем эту область памяти с помощью функции free.

Получаем:

Функция realloc меняет размер предварительно выделенной области памяти:

первый аргумент — это указатель на область памяти, размер которой нужно изменить, второй аргумент определяет новый размер области памяти. Если этот размер равен нулю, а первый аргумент указывает на имеющуюся область памяти, то функция realloc вернет NULL, а исходный блок памяти, на который указывает первый аргумент, будет освобожден. Если свободной для выделения памяти меньше, чем затребовоно, то функция realloc вернет NULL, а исходный блок памяти, на который указывает первый аргумент, сохраниться и останется без изменений. Функция realloc возвращает void указатель на выделенную область памяти, его можно привести к нужному типу.

Пример работы с функцией realloc:

В примере с помомощью функции malloc выделяем область памяти, далее с помощью функции realloc увеличиваем эту память.

Получаем:

Модель памяти в языках программирования

Память — одна из самых сложных тем в информатике, но понимание устройства памяти компьютера позволяет разрабатывать более эффективные программы, а для более низкоуровневого программирования, например, при разработке ОС, это понимание и вовсе является обязательным.

В этой статье будет рассмотрена модель памяти с высокоуровневой точки зрения — виды памяти, аллокаторы, сборщик мусора.

Виды памяти

Существует 3 типа памяти: статический, автоматический и динамический.

Статический — выделение памяти до начала исполнения программы. Такая память доступна на протяжении всего времени выполнения программы. Во многих языках для размещения объекта в статической памяти достаточно задекларировать его в глобальной области видимости.

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

Стек, как структура данных, работает по принципу LIFO («последним пришёл — первым ушёл»). Другими словами, добавлять и удалять значения в стеке можно только с одной и той же стороны.

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

Проще всего это понять из примера на С++:

Стек при вызове последней рекурсивной функции будет выглядеть следующим образом:

Детали реализации автоматической памяти могут быть разными в зависимости от конкретной платформы. Например, кому очищать из стека метаинформацию функции и её аргументы: вызывающей функции или вызываемой? Как передавать результат: через стек или, что намного быстрее, через регистры процессора (память, расположенную прямо на кристалле процессора. В этой статье не рассматривается, т. к. в языках программирования высокого уровня зачастую нет прямого доступа к регистрам процессора). На все эти вопросы отвечает конкретная реализация calling convention — описание технических особенностей вызова подпрограмм, определяющее способы передачи параметров/результата функции и способы вызова/возврата из функции.

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

Размер автоматической памяти, а он тоже фиксированный, определяется линковщиком (обычно — 1 мегабайт), максимальный размер зависит от конкретной системы и настроек компилятора/линковщика.

Если приложение выйдет за максимум автоматической памяти, его там может ждать Page Fault (сигнал SIGSEGV в POSIX-совместимых системах: Mac OS X, Linux, BSD и т. д.) — ошибка сегментации, приводящая к аварийному завершению программы.

Динамическая — выделение памяти из ОС по требованию приложения.

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

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

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

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

Максимальный размер динамической памяти зависит от многих факторов: среди них ОС, процессор, аппаратная архитектура в целом, не говоря уже о самом очевидном — максимальном размере ОЗУ у конкретного устройства. Например x86_64 процессоры используют только 48 бит для адресации виртуальной памяти, что позволяет использовать до 256 ТБ памяти. В следующей статье про более низкоуровневую архитектуру памяти будет объяснено, почему не все 64 бита.

Еще статьи:  Мужчина боится женщин психология

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

Аллокатор — это часть программы, которая запрашивает память большими кусками напрямую у ОС через системные вызовы (в POSIX-совместимых ОС это mmap для выделения памяти и unmap — для освобождения), затем по частям отдаёт эту память приложению (в Си это могут быть функции malloc() / free() ). Такой подход увеличивает производительность, но может вызвать фрагментацию памяти при длительной работе программы.

malloc() / free() и mmap / unmap — это не одно и то же. Первый является простейшим аллокатором в libc , второй является системным вызовом. В большинстве языков можно использовать только аллокатор по умолчанию, но в языках с более низкоуровневой моделью памяти можно использовать и другие аллокаторы.

Например, boost::pool аллокаторы, созданные для оптимальной работы с контейнерами ( boost::pool_allocator для линейных ( std::vector ), boost::fast_pool_allocator для нелинейных ( std::map, std::list )). Или аллокатор jemalloc, оптимизированный для решения проблем фрагментации и утилизации ресурсов CPU в многопоточных программах. Более подробно о jemalloc можно узнать из доклада с конференции C++ Russia 2018.

Способы контроля динамической памяти

Из-за сложности программ очень трудно определить, когда необходимо освобождать память в ОС, и это вторая явная проблема динамической памяти. Если забыть вызвать munmap() или free() , то произойдет следующая ситуация: приложению память уже не нужна, но ОС всё ещё будет считать, что эта память используется программой. Эту проблему называют «утечкой памяти». Существуют несколько способов автоматического или полуавтоматического решения этой проблемы:

RAII (Получение ресурса есть инициализация) — в ООП — организация получения доступа к ресурсу в конструкторе, а освобождения — в деструкторе соответствующего класса. Достаточно реализовать управление памятью в конструкторах и деструкторах, а компилятор вызовет их автоматически. Например, немного урезанный класс String из статьи про Move-семантику. Выделяем память в конструкторе, очищаем в деструкторе:

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

std::unique_ptr — класс уникального указателя, является единственным владельцем памяти и очищает её в своём деструкторе. Поэтому объекты класса std::unique_ptr не могут иметь копий, но могут быть перемещены. Подробнее о семантике перемещения в этой статье.

std::shared_ptr — класс общего указателя, использующий атомарный счётчик ссылок для подсчёта количества владельцев памяти. В конструкторе счётчик инкрементируется, в деструкторе — декрементируется. Как только счётчик становится равным нулю, память освобождается.

Но у std::shared_ptr есть проблема, например, когда объект A ссылается на объект B, а объект B ссылается на объект A. В таком случае у обоих объектов счётчик ссылок никогда не будет меньше 1 и произойдёт утечка памяти. Решений у этой проблемы два. Использование std::weak_ptr , который ссылается на объект, но без счётчика ссылок, и не может быть разыменован без предварительной конвертации в std::shared_ptr . Вторым решением этой проблемы является сборщик мусора.

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

Умные указатели и RAII используются в основном в относительно низкоуровневых языках, например, С++ или Swift. В более высокоуровневых языках обычно используется сборщик мусора (Java), хотя может применяться комбинация умного указателя и сборщика мусора (Python).

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

Хинт для программистов: если зарегистрироваться на соревнования Huawei Honor Cup, бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании. Перейти к регистрации.

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

Цель работы: приобрести практические навыки использования системных программ для получения информации о распределении памяти в вычислительной памяти.

Общие сведения

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

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

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

Информацию о параметрах разных видов памяти в ОС MS Windows можно получить с помощью Диспетчера задач.

Диспетчер задач позволяет просматривать общее использование памяти на вкладке Быстродействие, где отображается информация в трех разделах:

1) в разделе Выделение памяти содержатся три статистических параметра виртуальной памяти:

а) Всего – это общий объем виртуальной памяти, используемой как приложениями, так и ОС;

Еще статьи:  Как называется нервное расстройство

б) Предел – объем доступной виртуальной памяти;

в) Пик – наибольший объем памяти, использованный в течение сессии с момента последней загрузки;

2) в разделе Физическая память содержатся параметры, несущие информацию о текущем состоянии физической памяти машины, которая не имеет отношения к файлу подкачки:

а) параметр Всего – это объем памяти, обнаруженный ОС на компьютере;

б) Доступно – отражает память, доступную для использования процессами. Эта величина не включает в себя память, доступную приложениям за счет файла подкачки. Каждое приложение требует определенный объем физической памяти и не может использовать только ресурсы файла подкачки;

в) системный кэш – объемфизической памяти, доступный кэш-памяти системы и оставленный ОС после удовлетворения своих потребностей;

3) в разделе Память ядра – отображается информация о потребностях компонентов ОС, обладающих наивысшим приоритетом. Параметры этого раздела отображают потребности ключевых служб ОС:

а) Всего – объем виртуальной памяти, необходимый ОС;

б) Выгружаемая – информацию об общем объеме памяти, использованной системой за счет файла подкачки;

в) Невыгружаемая – объем физической памяти, потребляемой ОС.

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

– в окне Диспетчера задач представлены процессы, зарегистрированные в Windows, не включены драйверы устройств, некоторые системные службы;

– требования к памяти отражают текущее состояние процесса (объемы памяти, занимаемые приложениями в текущий момент);

– поскольку не выводятся временные характеристики, то нет возможности отследить ее изменения.

Утилита TaskList доставляет более обширную информацию по сравнению с Диспетчером задач. Запускается утилита из окна командной строки.

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

– полный объем установленной в компьютере физической памяти;

– общий объем виртуальной памяти и доступной (свободной) в данный момент времени виртуальной памяти;

– размещение и объем файла подкачки.

Щелкнув на кнопке Ресурсы аппаратуры, а затем на кнопке Память, можно получить сведения об использовании физической памяти аппаратными компонентами компьютера.

Изменение размера файла подкачки. Файл подкачки – это область жесткого диска, используемая Windows для хранения данных оперативной памяти. Он создает иллюзию, что система располагает большим объемом оперативной памяти, чем это есть на самом деле. По умолчанию файл подкачки удаляется системой после каждого сеанса работы и создается в процессе загрузки ОС. Размер файла подкачки постоянно меняется по мере выполнения приложений и контролируется ОС. Для самостоятельной установки размера файла подкачки нужно выполнить следующую последовательность действий:

а) щелкнуть правой кнопкой мыши по значку Мой компьютер и выбрать в контекстном меню строку Свойства;

б) перейти на вкладку Дополнительно и нажать кнопку Параметры в рамке Быстродействие;

в) в появившемся окне Параметры быстродействия нажать кнопку Изменить.

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

Основное правило – при небольшом объеме оперативной памяти файл подкачки должен быть достаточно большим. При большом объеме оперативной памяти (512 Мбайт) файл подкачки можно уменьшить. Можно установить Исходный размер файла подкачки, равный размеру физической памяти, а Максимальный размер не более двух размеров физической памяти. После этого нажать кнопку Задать и убедиться, что новое значение файла подкачки установлено. Щелкнуть на кнопке ОК. Выйдет сообщение, что данное изменение требует перезагрузки компьютера. Нажать ОК.

Задания к лабораторной работе

7.2.1 Система устраняет свободные участки памяти с помощью уплотнения. Предположим, что множество свободных участков сегментов данных распределены случайно, а время для чтения или записи 32-разрядного слова в памяти равно 10 нс. Сколько времени займет уплотнение 128 Мбайт памяти в худшем случае? Построить график времени уплотнения в зависимости от объема занятой памяти.

7.2.2 Компьютер имеет 32-разрядное адресное пространство и страницы размером 8 кбайт. Таблица страниц целиком поддерживается аппаратно, на запись в ней отводится одно 32-разрядное слово. При запуске процесса таблица страниц копируется из памяти в аппаратуру, одно слово требует 10 тс. Какая доля времени процессора жертвуется на загрузку таблицы страниц, если каждый процесс работает в течение 100 мс (включая время загрузки таблицы страниц)?

7.2.3 Используя командную строку, получить отчетыо распределении памяти в системе с помощью команды mem. Указанная команда предназначена для вывода информации о распределении оперативной памяти между загруженными программами. Выполнение команды без параметров выводит информацию об объемах свободной и занятой памяти. Ключ /program выводит информацию обо всех загруженных в память программах, включая системные программы. При ключе /debug в отчет включаются данные о внутренних системных драйверах. Просмотреть и проанализировать отчеты о распределении памяти всеми указанными способами.

Требования к отчету

Отчет по работе выполняется на бумажном носителе и должен содержать:

– задание к работе;

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

– снимки экрана с результатами работы;

– выводы по каждому заданию.

7.4 Контрольные вопросы

7.4.1 Какие способы распределения памяти используются в современных операционных системах?

7.4.2 Какие способы разделения используются при разделении оперативной памяти?

7.4.3 Какие способы разделения используются при разделении внешней памяти?

7.4.4 Что характерно для методов неразрывного распределения памяти?

7.4.5 Чем характеризуются методы непрерывного распределения и распределения с перекрытием?

7.4.6 Что характерно для методов разрывного распределения памяти?

7.4.7 Какую информацию можно получить с помощью Сведений о системе?

7.4.8 С какой целью используется файл подкачки?

7.4.9 Какую информацию о памяти позволяет получить утилита TaskList?

7.4.10 Как осуществляется изменение размера файла подкачки?

Последнее изменение этой страницы: 2017-01-25; Нарушение авторского права страницы

Рабочая память — или работа с памятью?

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

Еще статьи:  Эвтаназия в голландии

К сожалению, как предубеждения широкой публики относительно памяти, так и традиционные способы исследований памяти имеют мало общего с тем, как память функционирует в реальной жизни. В типичном исследовании памяти испытуемого просят запомнить информацию, а затем вспомнить ее. Испытуемый запоминает определенную информацию потому, что экспериментатор инструктирует его таким образом. Запоминание и воспроизведение являются здесь самоцелью, а решение, что запомнить, исходит от экспериментатора, а не от испытуемого.

В большинстве ситуаций реальной жизни мы храним и вспоминаем информацию не ради самого припоминания, а как предпосылку решения стоящей перед нами проблемы. Здесь воспоминание является средством достижения цели, а не самой целью. Более того, и это особенно важно, определенные воспоминания отыскиваются и активируются не в ответ на внешнюю команду, исходящую от кого-то другого, а в ответ на внутреннюю потребность. Мне не говорят, что вспомнить, я сам решаю, какая информация полезна для меня в контексте моей деятельности в данный момент.

Каждый из нас владеет огромным количеством информации. Я знаю расположение парикмахерских на западной стороне Манхеттена, имена ведущих русских композиторов, таблицу умножения, главные аэропорты Австралии, возраст моих родственников и т.д. и т.п. Как же тогда получается, что, сидя сейчас перед моим компьютером и работая над этой книгой, я быстро извлекаю мое знание о лобных долях и пишу о них, а не о Французской революции или о моих любимых ресторанах Нью-Йорка? Более того, как получается, что, проголодавшись после нескольких часов усиленного печатания, я столь же быстро извлекаю мое знание о ближайших ресторанах, а уже не о лобных долях, причем этот переход является мгновенным и не вызывающим никаких затруднений?

Большинство актов припоминания в реальной жизни включает решение о том, какой тип информации полезен для меня в данный момент, и затем отбор информации из всего огромного многообразия всех доступных мне знаний. Более того, как только род наших занятий меняется, мы совершаем плавное, мгновенное переключение от одного вида отбора к другому, а затем снова и снова. Мы осуществляем такие решения, выборы и переходы фактически в каждый момент нашей бодрствующей жизни, большую часть времени автоматически и без усилий. Но при общем объеме различной информации, доступной нам в каждый данный момент времени, эти решения с информационной точки зрения отнюдь не тривиальны. Они требуют сложных нейронных вычислений, производимых лобными долями. Память, основывающаяся на таких постоянно изменяющихся, текучих решениях, выборах и переключениях, направляется лобными долями и называется рабочей памятью. В каждый момент этого процесса нам нужен доступ к специфической информации, которая представляет лишь весьма малую часть нашей памяти в целом. Наша способность доступа к этой памяти подобна мгновенному отыскиванию иголки в стоге сена, и это на самом деле изумительно.

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

Несоответствие между тем, как память реально используется, и тем, как она экспериментально исследуется, помогает объяснить путаницу относительно роли лобных долей в памяти. Дебаты по этому предмету, до сих пор не приведшие к окончательным выводам, ведутся много лет, с тех пор как Якобсен 3 и Лурия 4 впервые подняли эту тему. В последнее время, в значительной степени благодаря работам нейробиологов Патриции Голдман-Ракич 5 и Хоакина Фюстера 6 роль лобных долей в памяти была подтверждена и получило признание понятие рабочей памяти. Рабочая память тесно связана с той решающей ролью, которую играют лобные доли во временной организации поведения и в контролировании точной последовательности, в которой совершаются различные психические операции, направленные на достижение целей организма 7 . Сегодня понятие рабочей памяти относится к числу наиболее популярных понятий когнитивной нейронауки. Как это бывает с популярными понятиями, оно часто используется произвольно и неопределенно, что иногда граничит с бессмыслицей. Поэтому особенно важно обсудить это понятие аккуратно и точно.

Как только в лобных долях завершен отбор информации, требующейся для решения наличной проблемы, они должны «знать», по крайней мере приблизительно, где эта информация хранится в мозге. Это позволяет предположить, что все корковые области каким-то образом репрезентированы в лобных долях, — утверждение, впервые высказанное Хьюлингсом Джексоном в конце девятнадцатого века 8 . Такие репрезентации являются, вероятно, скорее грубыми, чем специфичными, позволяющими лобным долям знать, где хранится какой тип информации, но не саму специфическую информацию. Лобные доли затем контактируют с соответствующими частями мозга и обеспечивают поступление памяти (или, как говорят ученые, «энграммы») «on-line», путем активации тех нейронных сетей, в которых энграмма заключается. Аналогия между лобными долями и главным управляющим снова оказывается полезной. Подписав новый контракт, директор компании может не иметь технических умений, требуемых для проекта, но он знает, кто из его персонала ими обладает, и способен правильно отобрать сотрудников для проекта, основываясь на их специфических знаниях и умениях.

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

Еще статьи:  Случаи возникновения конфликтов интересов

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

Давайте вернемся к нашему главному управляющему. Ему необходимо собрать команду экспертов для сложного, долгосрочного проекта с непредсказуемыми результатами. На каждой стадии проекта он должен найти требуемые знания; решить, как он выйдет на имена экспертов; найти их; помнить их имена и телефоны, по крайней мере пока длится проект; найти средства, диктуемые следующей стадией проекта, и т.д. Представьте себе далее, что на каждой стадии проекта ему нужны эксперты более чем одного типа, так что проводятся различные параллельные поиски. Это будет довольно точное описание рабочей памяти. Рабочая память весьма отлична от активности, которую мы традиционно отождествляем со словом «память» — заучивание и сохранение фиксированного объема информации.

Но роль рабочей памяти не ограничена принятием крупномасштабных решений. Мы зависим от рабочей памяти даже в самых обыденных ситуациях. Вы храните в вашей памяти номера телефонов вашего любимого ресторана и вашего врача. Вы знаете, где вы держите ваши туфли и ваш пылесос. Даже если эта информация всегда в вашей памяти, она не постоянно в фокусе вашего внимания. Когда вам нужно развлечь ваших друзей, вы звоните в ресторан, а не своему врачу. Когда вы утром одеваетесь, вы идете к шкафу, в котором хранятся туфли, а не к шкафу, где помещается пылесос. Эти на вид тривиальные и не требующие усилий решения также требуют рабочей памяти.

Мы обладаем способностью концентрироваться на информации, релевантной данной задаче, и затем переходить к следующему фрагменту релевантной информации. Отбор информации, подходящей для задачи, происходит автоматически и без усилий, и гладкость этого отбора гарантируется лобными долями. Однако пациенты на ранних стадиях деменции часто сообщают о «бессмысленных» действиях. Они могут взять грязные тарелки в спальню вместо кухни, или открыть холодильник в поисках перчаток. Это ранняя поломка способности лобных долей отбирать и активировать информацию, соответствующую задаче. Рабочая память часто страдает на ранних стадиях деменции. Человек с серьезно ухудшившейся рабочей памятью очень быстро окажется в состоянии безнадежной путаницы.

Парадокс рабочей памяти состоит в том, что хотя лобные доли играют решающую роль в доступе и активации информации, релевантной задаче, сами они не содержат этой информации — она находится в других частях мозга. Чтобы продемонстрировать это отношение, Патриция Голдман-Ракич и ее коллеги из Йельского университета изучали задержанные ответы у обезьян 9 . Они вели внеклеточную регистрацию нейронов в лобных долях обезьяны, которые были активны до тех пор, пока энграмма (след памяти) была активирована, и которые выключаются, как только инициирован ответ. Эти нейроны ответственны за активирование энграмм, но не за их хранение.

Различные части префронтальной коры вовлечены в различные аспекты рабочей памяти, и существует своеобразный параллелизм между функциональной организацией лобных долей и задними отделами коры. Было давно известно, что у приматов (включая человека) зрительная система состоит из двух различных компонентов. «Что»-система, простирающаяся вдоль затылочно-височного градиента, перерабатывает информацию, позволяющую отождествлять объекты. «Где»-система, простирающаяся вдоль затылочно-теменного градиента, перерабатывает информацию о местоположении объектов. Вероятно, зрительное пространственное знание также распределено. Память на «что» формируется внутри затылочно-височной системы, а память на «где» — внутри затылочно-теменной системы.

Контролируется ли доступ к этим двум типам зрительной памяти одними и теми же или различными лобными зонами? Сьюзан Кортни и ее коллеги из Национального института психического здоровья ответили на этот вопрос с помощью PET-эксперимента с оригинальной активационной задачей 10 . Предъявлялся набор лиц в формате четыре ряда по шесть изображений, за ним следовал другой набор лиц. Испытуемых просили ответить на «что»-вопрос (Являются ли лица одними и теми же?) или на «где»-вопрос (Появляются ли они на тех же позициях?). Две задачи породили два различных типа активации внутри лобных долей, в нижних частях — для «что», и в верхних частях — для «где». Аналогичные открытия были сделаны Патрицией Голдман-Ракич и ее коллегами из Йельского университета, которые изучали обезьян, используя записи активности одиночных клеток (single-cell recordings) 11 .

По-видимому, различные аспекты рабочей памяти находятся под контролем различных отделов лобных долей. Означает ли это, что каждая часть префронтальной коры связана с особой системой вне лобных долей? Что же случилось с дирижером? Есть ли такая часть лобных долей, вклад которой является поистине универсальным? Удивительно, но несмотря на все попытки, до сих пор не удалось охарактеризовать в специфических терминах функции зоны вокруг лобных полюсов, самого дальнего продолжения лобной доли (зона Бродмана 10). Я не удивлюсь, если будущие исследования покажут, что зоны, непосредственно окружающие лобные полюсы, обслуживают наиболее синтетическую функцию и образуют дополнительный уровень нейронной иерархии над дорзолатеральными и орбитофронтальными областями коры. Синтетические функции, которые эта часть мозга, вероятно, выполняет, обсуждаются в следующем разделе.

Не нашли то, что искали? Воспользуйтесь поиском:

Автор статьи: Татьяна Ефимова

Позвольте представиться. Меня зовут Татьяна. Я уже более 8 лет занимаюсь психологией. Считая себя профессионалом, хочу научить всех посетителей сайта решать разнообразные задачи. Все данные для сайта собраны и тщательно переработаны для того чтобы донести как можно доступнее всю необходимую информацию. Перед применением описанного на сайте всегда необходима ОБЯЗАТЕЛЬНАЯ консультация с профессионалами.

Обо мнеОбратная связь
Оценка 5 проголосовавших: 3
ПОДЕЛИТЬСЯ

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here