5 Архитектура процесса, функции.pptx
- Количество слайдов: 19
Занятие 5 Курс "Основы программирования"
План занятия 1. Архитектура процесса 2. Стек 3. Функции, вызовы 4. int f(int x) { return 0; } / function f(x) { }
Простейшая программа Блок данных Стек Блок кода (команд) int x = 10; float arr[] = { 1. f, 0. 5 f, . 3 f}; char str[] = “Суббота”; int f(float x) { return x; } int main() точка входа { float a = 10. 3 f; int b = f(a) return 0; }
Программа – процесс Перед запуском: 1. Файл считывается в ОЗУ «как есть» 2. Система выделяет служебные таблицы 3. Устанавливаются права доступа к регионам памяти 4. Процесс регистрируется в системе как таковой
Размещение в памяти • Процесс находится в памяти наравне с остальным содержимым. • Права доступа ограничены так, чтобы процессы не вмешивались друг в друга. • Для процесса, в основном, всё выглядит так, будто других процессов нет. Адрес Содержимое 0 x 0000 Система 0 x 00000001 Система … … 0 x 1 c 003 a 8 d Ваш процесс 0 x 1 c 003 a 8 e Ваш процесс … … 0 x 1 c 003 df 1 Ваш процесс … … 0 xffff … 4 Гбайт
Служебные таблицы • Глобальная таблица дескрипторов – Сегменты памяти, существующие в ОС • Сегмент состояния задачи – Информация о процессе и его состоянии • Локальная таблица дескрипторов – Сегменты памяти конкретного процесса
Состояния процесса Выполняется, режим задачи Прерывание / Вызов Прекращает существование Выход Возврат Выполняется, режим ядра Приостановлен Возврат в режим задачи Резервируется Запуск Возобновление Готов к запуску Зарезервирован
Динамические данные об этих данных всё известно заранее int x = 10; float arr[] = { 1. f, 0. 5 f, . 3 f}; char str[] = “Суббота”; int f(float x) функция может быть вызвана многократно { return x; } int main() { эти данные появляются по требованию float a = 10. 3 f; int b = f(a) return 0; }
Буфер временных данных int f(float x) Позиция Содержимое 0 10. 3 1 10. 3 int a = x; 2 10 return a+5; 3 … Позиция 0 1 2 3 { } Очистка временных данных int main() Содержимое { 10. 3 float a = 10. 3 f; 15 int b = f(a) … return 0; … }
Стек / Stack Чтобы всё работало надо знать: Позиция Содержимое 0 10. 3 1 10. 3 2 10 3 … • Где в памяти лежит этот буфер • Насколько он сейчас заполнен • Какие значения где лежат • Сколько места освобождать при выходе
Работа со стеком int f(int x, int y) { // последнюю занятую ячейку СТЕКА назовём БАЗОЙ, ‘BP’ int a = x; // создание переменной: +1 ячейка // данная переменная теперь доступна по адресу if(a > y) { int b = y; // ещё 1 ячейка занята, BP+2 return a+5; // выход } else { mov int b = x, с = y; // BP+2 и BP+3 a = b+c; add } // освободить 2 ячейки (b и с) mov return a-2; // выход } // освободить все ячейки вплоть до БАЗЫ BP+1 AX, [BP+2] AX, [BP+3] [BP+1], AX
Вызов функции Вызов имеет следующий синтаксис: • имя_функции(аргумент1, …) int f(int x, int y) { return x*x + y; } mov mul add ret AX, [BP-1] ; что тут? AX, AX AX, [BP-2] ; возврат к месту вызова ЧТО В [BP]? int main() { int a = f(2, 7); // вызов функции f return 0; } push 7 ; положить 7 в стек push 2 ; положить 2 в стек call f ; перейти к коду функции mov [BP+1], AX ; [BP+1] – это ‘a’
Функция Функцией называется фрагмент программы, в который передаются параметры, и который возвращает значение (или ничего). • Перед использованием функцию необходимо создать. • Чтобы использовать её – осуществляют вызов.
Функция = глагол Обычно под функцией понимается некоторое сложное действие. На вход подаётся исходный объект, над которым требуется произвести действие. Например: вынести_мусор( пакет_с_мусором ); или x = возвести_в_степень( 5, 3 ); // 125
Объявление функции С int func(int x) { return x+1; } int func(. . . – задает функцию с именем func • (имя выдумывает программист, как и имена переменных). • int означает, что функция возвращает целое значение. . (int x). . . – задает список аргументов функции. . ){. . . } – задает тело функции - последовательность операторов. return выражение; – выход из функции в точку ее вызова.
Объявление функции JS function func(x) { return x+1; } function func(. . . – задает функцию с именем func • (имя выдумывает программист, как и имена переменных). • функция в JS способна вернуть значение любого рода. . (x). . . – задает список аргументов функции. . ){. . . } – задает тело функции - последовательность операторов. return выражение; – выход из функции в точку ее вызова.
Передача аргументов function func(x) { x = x*x; return x+1; } var a = 10; var b = func( a ); // b = 101, a = ? Передача «простых» аргументов идёт «по значению» , то есть копией. Передача «сложных» , составных, как массивы – «по ссылке» . • Изменяя копию, нельзя повлиять на оригинал. • Работая со ссылкой вы можете влиять на оригинал. То есть, можно передать в функцию массив, а она его отсортирует.
Функция факториала 1. Используем навыки полученные на 3 -м занятии. 2. Создаём функцию, вычисляющую y = (x!). 3. Тестируем созданную функцию. fact(0) fact(1) fact(2) fact(3) fact(4) =1 =1 =2 =6 = 24
Домашнее задание 1. Создать функцию сортировки массива, на вход принимающую массив и опционально – значение его длины. – Массив заполнить случайными числами и отправить на сортировку. – Вывести содержимое «до» и «после» сортировки.


