Ноу Інти, лекція, пристрій комп’ютера
апаратний стек
Стек - це пристрій, що запам'ятовує. з якого елементи витягуються в порядку, зворотному їх приміщенню в стек. Стек можна уявити як стопку аркушів паперу, на кожному з яких записаний один з зберігаються елементів. На вершині стека знаходиться останній заповнений елемент.
Стек можна уявити у вигляді трубки з пружними дном, що розташована вертикально. Верхній кінець трубки відкритий, в нього можна додавати, або, як кажуть, заштовхувати елементи. Загальноприйняті англійські терміни в цьому плані дуже барвисті, операція додавання елемента в стек позначається push. в перекладі "заштовхнути, запхати". Новий елемент, проштовхує елементи, приміщення в стек раніше, на одну позицію вниз. Під час вилучення елементів з стека вони як би виштовхуються вгору, по-англійськи pop ( "вистрілюють").
Команди виклику підпрограми call і повернення return
Апаратний стек і локальні змінні підпрограми
Оскільки апаратний стек розташовується в оперативній пам'яті, в ньому можна розміщувати звичайні змінні програми. Розміщення локальних змінних в стек має низку переваг у порівнянні зі статичним розміщенням змінних в фіксованих осередках оперативної пам'яті. Як вже говорилося вище, це дозволяє організовувати рекурсію. Крім того, в сучасних архітектурах принципове значення має підтримка паралельних процесів, які працюють над спільними статичними змінними. Це так звані легковагі процеси, або нитки (Thread), що працюють паралельно в рамках однієї програми. На використанні ниток, наприклад, заснована робота всіх графічних додатків в системі Microsoft Windows 32: одна нитка обробляє повідомлення графічної системи (натискання на клавіатуру і кнопки миші, перерисовка вікон, вибірка команд з меню і т.п.), інші нитки займаються обчисленнями, мережевим обміном, анімацією і т.п.
Різні нитки працюють паралельно над загальними статичними даними, здійснюючи таким чином деяку спільну роботу. При цьому одна і та ж підпрограма може викликатися з різних ниток. На відміну від статичних змінних, які є загальними для всіх ниток, для кожної нитки виділяється свій окремий стек. При використанні ниток дуже важливо, щоб локальні змінні підпрограми розташовувалися в стеці. Інакше було б неможливо паралельно викликати одну й ту ж підпрограму з різних ниток: повторний виклик підпрограми, яка працює в рамках іншої нитки, зруйнував би статичний набір локальних змінних цієї підпрограми. А при використанні стека набори локальних даних однієї і тієї ж підпрограми, що викликається з різних ниток, різні, оскільки вони розташовуються в різних стеках. Таким чином, різні нитки працюють з різними наборами локальних змінних, не заважаючи один одному.
Розглянемо більш докладно, як розміщуються локальні змінні підпрограми в стеці, на прикладі мови Сі. У Сі підпрограми називаються функціями. Функція може мати аргументи і локальні змінні, тобто змінні, що існують тільки в процесі виконання функції. Розглянемо для прикладу функцію f. залежну від двох вхідних аргументів x і y цілого типу, в якій використовуються три локальні змінні a. b і c також цілого типу. Функція повертає ціле значення.
Нехай в деякому місці програми викликається функція f з аргументами x = 222, y = 333:
Зухвала програма видаляє з стека фактичні значення аргументів x і y. поміщені в стек перед викликом функції f.