7.7 ИЗМЕНЕНИЕ РАЗМЕРА ПРОЦЕССА
7.7 ИЗМЕНЕНИЕ РАЗМЕРА ПРОЦЕССА
С помощью системной функции brk процесс может увеличивать и уменьшать размер области данных. Синтаксис вызова функции:
brk(endds);
где endds — старший виртуальный адрес области данных процесса (адрес верхней границы). С другой стороны, пользователь может обратиться к функции следующим образом:
oldendds = sbrk(increment);
где oldendds — текущий адрес верхней границы области, increment — число байт, на которое изменяется значение oldendds в результате выполнения функции. Sbrk — это имя стандартной библиотечной подпрограммы на Си, вызывающей функцию brk. Если размер области данных процесса в результате выполнения функции увеличивается, вновь выделяемое пространство имеет виртуальные адреса, смежные с адресами увеличиваемой области; таким образом, виртуальное адресное пространство процесса расширяется. При этом ядро проверяет, не превышает ли новый размер процесса максимально-допустимое значение, принятое для него в системе, а также не накладывается ли новая область данных процесса на виртуальное адресное пространство, отведенное ранее для других целей (Рисунок 7.26). Если все в порядке, ядро запускает алгоритм growreg, присоединяя к области данных внешнюю память (например, таблицы страниц) и увеличивая значение поля, описывающего размер процесса. В системе с замещением страниц ядро также отводит под новую область пространство основной памяти и обнуляет его содержимое; если свободной памяти нет, ядро освобождает память путем выгрузки процесса (более подробно об этом мы поговорим в главе 9). Если с помощью функции brk процесс уменьшает размер области данных, ядро освобождает часть ранее выделенного адресного пространства; когда процесс попытается обратиться к данным по виртуальным адресам, принадлежащим освобожденному пространству, он столкнется с ошибкой адресации.
алгоритм brk
входная информация: новый адрес верхней границы области данных
выходная информация: старый адрес верхней границы области данных
{
заблокировать область данных процесса;
if (размер области увеличивается)
if (новый размер области имеет недопустимое значение) {
снять блокировку с области;
return (ошибку);
}
изменить размер области (алгоритм growreg);
обнулить содержимое присоединяемого пространства;
снять блокировку с области данных;
}
Рисунок 7.26. Алгоритм выполнения функции brk
На Рисунке 7.27 приведен пример программы, использующей функцию brk, и выходные данные, полученные в результате ее прогона на машине AT&T 3B20. Вызвав функцию signal и распорядившись принимать сигналы о нарушении сегментации (segmentation violation), процесс обращается к подпрограмме sbrk и выводит на печать первоначальное значение адреса верхней границы области данных. Затем в цикле, используя счетчик символов, процесс заполняет область данных до тех пор, пока не обратится к адресу, расположенному за пределами области, тем самым давая повод для сигнала о нарушении сегментации. Получив сигнал, функция обработки сигнала вызывает подпрограмму sbrk для того, чтобы присоединить к области дополнительно 256 байт памяти; процесс продолжается с точки прерывания, заполняя информацией вновь выделенное пространство памяти и т. д. На машинах со страничной организацией памяти, таких как 3B20, наблюдается интересный феномен. Страница является наименьшей единицей памяти, с которой работают механизмы аппаратной защиты, поэтому аппаратные средства не в состоянии установить ошибку в граничной ситуации, когда процесс пытается записать информацию по адресам, превышающим верхнюю границу области данных, но принадлежащим т. н. „полулегальной“ странице (странице, не полностью занятой областью данных процесса). Это видно из результатов выполнения программы, выведенных на печать (Рисунок 7.27): первый раз подпрограмма sbrk возвращает значение 140924, то есть адрес, не дотягивающий 388 байт до конца страницы, которая на машине 3B20 имеет размер 2 Кбайта. Однако процесс получит ошибку только в том случае, если обратится к следующей странице памяти, то есть к любому адресу, начиная с 141312. Функция обработки сигнала прибавляет к адресу верхней границы области 256, делая его равным 141180 и, таким образом, оставляя его в пределах текущей страницы. Следовательно, процесс тут же снова получит ошибку, выдав на печать адрес 141312. Исполнив подпрограмму sbrk еще раз, ядро выделяет под данные процесса новую страницу памяти, так что процесс получает возможность адресовать дополнительно 2 Кбайта памяти, до адреса 143360, даже если верхняя граница области располагается ниже. Получив ошибку, процесс должен будет восемь раз обратиться к подпрограмме sbrk, прежде чем сможет продолжить выполнение основной программы. Таким образом, процесс может иногда выходить за официальную верхнюю границу области данных, хотя это и нежелательный момент в практике программирования.
Когда стек задачи переполняется, ядро автоматически увеличивает его размер, выполняя алгоритм, похожий на алгоритм функции brk. Первоначально стек задачи имеет размер, достаточный для хранения параметров функции exec, однако при выполнении процесса этот стек может переполниться. Переполнение стека приводит к ошибке адресации, свидетельствующей о попытке процесса обратиться к ячейке памяти за пределами отведенного адресного пространства. Ядро устанавливает причину возникновения ошибки, сравнивая текущее значение указателя вершины стека с размером области стека. При расширении области стека ядро использует точно такой же механизм, что и для области данных. На выходе из прерывания процесс имеет область стека необходимого для продолжения работы размера.
#include ‹signal.h›
char *cp;
int callno;
main() {
char *sbrk();
extern catcher();
signal(SIGSEGV, catcher);
cp = sbrk(0);
printf("original brk value %u ", cp);
for (;;) *cp++ = 1;
}
catcher(signo)
int signo;
{
callno++;
printf("caught sig %d %dth call at addr %u ", signo, callno, cp);
sbrk(256);
signal(SIGSEGV, catcher);
}
original brk value 140924
caught sig 11 1th call at addr 141312
caught sig 11 2th call at addr 141312
caught sig 11 3th call at addr 143360
…(тот же адрес печатается до 10-го вызова подпрограммы sbrk)
caught sig 11 10th call at addr 143360
caught sig 11 11th call at addr 145408
…(тот же адрес печатается до 18-го вызова подпрограммы sbrk)
caught sig 11 18th call at addr 145408
caught sig 11 19th call at addr 145408
-
-
Рисунок 7.27. Пример программы, использующей функцию brk, и результаты ее контрольного прогона
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Изменение размера шрифтов
Изменение размера шрифтов Если у вас есть проблемы со зрением и экранные шрифты кажутся вам слишком мелкими, можете увеличить их размер. Делается это в специальном окне, которое открывается при переходе по ссылке Изменить размер шрифта в окне Персонализация.Здесь вы
6.5.4 Изменение размера области
6.5.4 Изменение размера области Процесс может расширять или сужать свое виртуальное адресное пространство с помощью функции sbrk. Точно так же и стек процесса расширяется автоматически (то есть для этого процессу не нужно явно обращаться к определенной функции) в
Изменение размера шрифта и кодировки
Изменение размера шрифта и кодировки Для начала изучим две очень полезные команды, которые находятся в меню Вид и называются Размер шрифта и Кодировка.С первой проще. Проведя несложные манипуляции мышью (рис. 7.1), вы можете выбрать размер экранных шрифтов в зависимости от
6.3.2.3. Изменение размера
6.3.2.3. Изменение размера Рис. 6.38. Изменение размера изображенияИзменение размера изображения в GIМP называется масштабированием. Выберите инструмент Масштаб (он выделен на рис. 6.38) и щелкните на изображении, размер которого требуется изменить.Раскроется окно Масштаб, в
7.3.2. Концепции, касающиеся основных средств производственного процесса организации Основные средства производственного процесса организации (ППО)
7.3.2. Концепции, касающиеся основных средств производственного процесса организации Основные средства производственного процесса организации (ППО) Организация устанавливает и сопровождает набор основных средств производственного процесса, как показано на рис. 4.1. К
Изменение размера шрифтов
Изменение размера шрифтов Если вы не послушались нас и установили слишком высокое разрешение экрана, то текст на мониторе станет очень мелким. Человек со слабым зрением просто не прочитает. Человек с хорошим зрением прочитает, но через пару месяцев такого чтения
Изменение размера и положения таблицы
Изменение размера и положения таблицы Для редактирования таблиц используются маркеры перемещения и изменения. Маркер перемещения появляется в верхнем левом углу таблицы при наведении указателя мыши на таблицу или щелчке на таблице. Он имеет форму крестика в рамке (рис.
Глава 9 Выбор и изменение размера изображения
Глава 9 Выбор и изменение размера изображения • Кадрирование• Поворот изображения• Изменение физического размера изображенияКак уже говорилось, в идеальной ситуации изображение должно создаваться с правильным физическим размером. Однако практика показывает, что
Изменение физического размера изображения
Изменение физического размера изображения Как уже говорилось, изменение физического размера изображения, то есть изменение количества пикселов, из которых оно состоит, в достаточной степени проблематично: потери в качестве неизбежны. Любая графическая программа,
Редактирование размера
Редактирование размера Команда DIMEDIT обеспечивает редактирование размера и вызывается щелчком на пиктограмме Dimension Edit на панели инструментов Dimension.Запросы команды
Перемещение, изменение размера и поворот
Перемещение, изменение размера и поворот Чтобы переместить, повернуть выделенные объекты, изменить их размер, нужно нажать кнопку на нижней панели инструментов. В меню Титры пункт, который отмечен галочкой при включенном режиме перемещения, поворота и изменения
2.3.9. Вычисление размера БД
2.3.9. Вычисление размера БД ERwin позволяет рассчитать приблизительный размер БД в целом, а также таблиц, индексов и других объектов через определенный период времени после начала эксплуатации ИС. Для расчета размеров физических объектов служит диалог Volumetrics Editor (рис. 2.99),
Изменение размера и масштаба изображения
Изменение размера и масштаба изображения После запуска программы открывается ее окно, в котором отображено несколько панелей и палитр (рис. 5.9). На основной палитре инструментов размещаются инструменты для создания и редактирования рисунков. Важной также является
2.2.2. Изменение размера окна
2.2.2. Изменение размера окна Если окно развернуто не на весь экран, то вы можете изменять его размер — для этого нужно подвести курсор мыши к границе окна — тогда курсор пример форму двух стрелок, направленных в разные стороны. Теперь нажмите левую кнопку мыши и, не
Изменение размера окна
Изменение размера окна Если кнопка развернуть/восстановить окно активна (пиктограмма на кнопке контрастирует с цветом кнопки), то такое окно можно в зависимости от необходимости как увеличить, так и уменьшить. Если же кнопка не активна (пиктограмма на кнопке