## RAM/ОЗУ- Random Access Memory - Оперативная память

Аббревиатуры **ОЗУ** и **RAM** обозначают одно и тоже, а именно оперативную память:
* ОЗУ - оперативное запоминающее устройство;
* RAM - Random Access Memory, что переводится как запоминающее устройство с произвольным доступом и означает тоже самое, что и ОЗУ;

## [Алан Тьюринг](https://www.youtube.com/watch?v=3GKaT-rUwF4) и RAM

В 1936 году выпускник Кембриджа [Алан Тьюринг](https://www.youtube.com/watch?v=3GKaT-rUwF4)г придумал абстрактную вычислительную машину, которая формализовала определение алгоритма. Понятие алгоритма долгое время оставалось интуитивным, что мешало ответить на множество математических вопросов (например, всякую ли задачу можно решить алгоритмически — или есть такие, которые можно решить только методом перебора? Как вообще понять, существует ли алгоритм для решения той или иной задачи? И т. д.). 

Тьюринг переформулировал [теорему Гёделя](https://ru.wikipedia.org/wiki/Теоремы_Гёделя_о_неполноте) о неполноте, заменив универсальный формальный арифметический язык Гёделя на простые гипотетические устройства, которые впоследствии стали известны как [машины Тьюринга](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/one.html). Доказал, что «[машина Тьюринга](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/one.html) » способна произвести любые математические вычисления, представимые в виде алгоритма.

Описание «машины Тьюринга» в [объяснялке от Кембриджского университета](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/one.html):

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

![MachineTuring](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/example_turing_tape.jpg)

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

![MachineTuring2](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/fsm1.jpg)

3) Сама последовательность их вышеперечисленных действий задается программой (алгоритмом).

Далее независимо друг от друга Тьюринг и Черч доказали [(далее доказательство назвали теоремой Чёрча — Тьюринга](https://ru.wikipedia.org/wiki/Теорема_Чёрча_—_Тьюринга), что не существует решения для [проблемы разрешения (Entscheidungsproblem)](https://ru.wikipedia.org/wiki/Проблема_разрешения). С помощью своей универсальной машины Тьюринг доказал, что проблема остановки этой машины - неразрешима: в общем случае невозможно алгоритмически определить, остановится ли когда-нибудь данная [машина Тьюринга](https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/one.html).

> [Проблемы разрешения (Entscheidungsproblem))](https://ru.wikipedia.org/wiki/Проблема_разрешения) - найти такой алгоритм, который бы принимал в качестве входных данных описание проблемы, требующей ответа ИСТИНА или ЛОЖЬ, затем после n количества шагов останавливался бы, и выдовал один из таких ответов.


## Устройство оперативной памяти

И [стек](./3.1.2.2%20Stack.md) и [куча](./3.1.2.3%20Heap.md) оба находятся физически в RAM:

![memory in RAM](https://i.stack.imgur.com/HOY4C.png)

Разные языки по-разному используют [стек](./3.1.2.2%20Stack.md) и [куча](./3.1.2.3%20Heap.md); C и C++ автоматически распределяют память в стеке, и вам, как разработчику, приходится вручную выделять память и освобождать ее из [куча](./3.1.2.3%20Heap.md), в то время как более современные языки, такие как Go и Java, автоматически выделяют память как в [стек](./3.1.2.2%20Stack.md), так и в [куча](./3.1.2.3%20Heap.md), и у вас есть [сборщик мусора](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.3%20ReferenceCounting/3.1.3.2%20GarbageCollector.md), который обрабатывает освобождение [кучи](./3.1.2.3%20Heap.md) самостоятельно. Есть даже такие языки, как Ruby и Python, где все размещается в [куча](./3.1.2.3%20Heap.md) и вообще не использует стек.

### Что такое [виртуальная память](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html)?

1. [What is virtual memory on the Mac?](https://www.quora.com/What-is-virtual-memory-on-the-Mac)

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

VM была особенно полезна, когда оперативная память была ограничена (например, в 50-80-х годах), тк при обращении к этой части программы в VM происходит загрузка в оперативную память по мере необходимости. Это позволяет выполнять программы, которые были больше, чем доступная память.

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

### Почему эффективное управление оперативной памятью важно?

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

---

[3.1.1 About Memory Theme Folder](/3%20Memory%20and%20Concurrency/3.1%20Memory/3.1.1%20AboutMemory/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [3.1.2.2 Stack Theme](./3.1.2.2%20Stack.md)
