Электронный учебно-методический комплекс по учебной дисциплине «Системное программирование» для специальностей 1-40 01 01 «Программное обеспечение информационных технологий», 6-05-0612-01 «Программная инженерия»
.pdfБелорусский национальный технический университет
Международный институт дистанционного образования Кафедра «Информационные системы и технологии»
ЭЛЕКТРОННЫЙ УЧЕБНО-МЕТОДИЧЕСКИЙ КОМПЛЕКС
ПО УЧЕБНОЙ ДИСЦИПЛИНЕ
СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ
для специальностей:
1-40 01 01 «Программное обеспечение информационных технологий» 6-05-0612-01 «Программная инженерия»
Составитель:
Бумай Андрей Юрьевич, ассистент
Минск
БНТУ
2024
СИСТЕМНОЕ
ПРОГРАММИРОВАНИЕ
2
Перечень материалов
Конспект лекций, материалы для лабораторных занятий и контрольных работ, вспомогательный раздел.
Пояснительная записка
Цели данного ЭУМК – повышение эффективности организации учебного процесса с использованием дистанционных технологий; предоставление возможности студентам заниматься самообразованием, пользуясь комплектом учебно-методических материалов по дисциплине «Системное программирование».
ЭУМК содержит четыре раздела: теоретический, практический, контроля знаний и вспомогательный.
Теоретический раздел представлен конспектом лекций. Лекционный материал подготовлен в соответствии с основными разделами и темами учебной программы.
Практический раздел представлен лабораторными работами, которые помогут освоить теоретический материал дисциплины.
Раздел контроля знаний включает контрольную работу, содержащую индивидуальные варианты заданий, требования к оформлению контрольной работы, вопросы к экзамену. Вспомогательный раздел представлен учебной программой. Данное ЭУМК в первую очередь разработано для студентов МИДО дистанционной (заочной) формы получения образования, однако ЭУМК также может быть полезным студентам дневной формы получения образования и всем, кто заинтересован в освоении дисциплины «Системное прогаммирование».
3
СОДЕРЖАНИЕ
СОДЕРЖАНИЕ ........................................................................................................... |
4 |
РАЗДЕЛ 1 ТЕОРЕТИЧЕСКИЙ .................................................................................. |
8 |
ВВЕДЕНИЕ.............................................................................................................. |
8 |
1.1 ОБЗОР ЯЗЫКА ПРОГРАММИРОВАНИЯ C ................................................ |
9 |
1.1.1 Характеристика языка С............................................................................ |
9 |
1.1.2 Основные сведения о синтаксисе языка C ............................................ |
10 |
1.1.3 Структура программ на языке С............................................................. |
11 |
1.1.4 Функции и библиотеки функций языка С ............................................. |
12 |
1.2 ДЕКЛАРАЦИЯ ОБЪЕКТОВ ПРОГРАММЫ НА ЯЗЫКЕ C...................... |
14 |
1.2.1 Операционные объекты в языке C ......................................................... |
14 |
1.2.2 Понятие типа объекта в языке С............................................................. |
15 |
1.2.3 Базовые типы данных в языке С............................................................. |
16 |
1.2.4 Массивы в языке С ................................................................................... |
17 |
1.2.5 Структуры и объединения в языке C ..................................................... |
17 |
1.2.6 Перечисления............................................................................................ |
21 |
1.2.7 Оператор переопределения типа ............................................................ |
22 |
1.2.8 Константы в программах на языке C ..................................................... |
24 |
1.3 ОПЕРАТОРЫ И ВЫРАЖЕНИЯ.................................................................... |
26 |
1.3.1 Обзор операций языка С.......................................................................... |
26 |
1.3.2 Операции присваивания .......................................................................... |
26 |
1.3.3 Арифметические операции ..................................................................... |
29 |
1.3.4 Операции отношений............................................................................... |
30 |
1.3.5 Логические операции............................................................................... |
32 |
1.3.6 Операции над битами............................................................................... |
33 |
1.3.7 Условное вычисление .............................................................................. |
35 |
1.3.8 Определение размера объекта................................................................. |
36 |
1.3.9 Операция приведения типа ..................................................................... |
37 |
1.3.10 Последовательное вычисление выражений......................................... |
40 |
1.3.11 Операции над указателями.................................................................... |
40 |
1.3.12 Операция вызова функции .................................................................... |
47 |
4 |
|
1.3.13 Приоритет и порядок выполнения операций ...................................... |
50 |
1.4 УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ ................................................................. |
52 |
1.4.1 Условные операторы................................................................................ |
52 |
1.4.2 Операторы цикла ...................................................................................... |
53 |
1.4.3 Оператор выбора альтернатив (переключатель)................................... |
56 |
1.4.4 Операторы передачи управления ........................................................... |
58 |
1.5 СТРУКТУРИЗАЦИЯ ПРОГРАММ И ДАННЫХ........................................ |
59 |
1.5.1 Области действия объектов программ................................................... |
59 |
1.5.2 Классы памяти объектов программ........................................................ |
60 |
1.5.3 Инициализации объектов программ ...................................................... |
62 |
1.5.4 Управляемая память................................................................................. |
64 |
1.6 ПРЕПРОЦЕССОР ЯЗЫКА C ......................................................................... |
67 |
1.6.1 Возможности препроцессора и его вызов ............................................. |
67 |
1.6.2 Операторы лексемного замещения идентификаторов ......................... |
67 |
1.6.3 Макрозамещение ...................................................................................... |
68 |
1.6.4 Оператор включения файлов исходного текста.................................... |
70 |
1.6.5 Условная компиляция.............................................................................. |
71 |
1.6.6 Изменение нумерации строк и имени файла......................................... |
73 |
1.6.7 Расширенные возможности современных процессоров ...................... |
73 |
1.7 ЗАПУСК И ЗАВЕРШЕНИЕ ПРОГРАММ ................................................... |
75 |
1.7.1 Головная функция программ на языке C............................................... |
75 |
1.7.2 Порождение и идентификация задач ..................................................... |
77 |
1.7.3 Завершение программ.............................................................................. |
80 |
1.7.4 Идентификация задач и виды межзадачных взаимодействий ............ |
80 |
1.8 СИСТЕМНО ЗАВИСИМЫЕ КОНСТРУКЦИИ ЯЗЫКА С ........................ |
81 |
1.8.1 Системно зависимые расширения языка C ........................................... |
81 |
1.8.2 Понятие псевдо-регистров ...................................................................... |
81 |
1.8.3 Функции - обработчики прерываний ..................................................... |
82 |
1.8.4 Дополнительные атрибуты указателей .................................................. |
83 |
1.8.5 Модификаторы типа объектов ................................................................ |
85 |
1.8.6 Использование ассемблера...................................................................... |
86 |
5 |
|
1.9 ВВОД-ВЫВОД ДАННЫХ ............................................................................. |
87 |
1.9.1 Организация ввода-вывода данных в C ................................................. |
87 |
1.9.2 Бесформатный ввод-вывод...................................................................... |
92 |
1.9.3 Форматный ввод-вывод ........................................................................... |
93 |
1.10 СТРУКТУРЫ ДАННЫХ .............................................................................. |
99 |
1.10.1 Виды организации хранения данных в памяти ................................... |
99 |
1.10.2 Абстрактные структуры данных......................................................... |
101 |
1.10.3 Отображение структур данных в памяти........................................... |
102 |
1.10.4 Примеры представления структур данных........................................ |
104 |
1.11 СОРТИРОВКА И ПОИСК ДАННЫХ....................................................... |
107 |
1.11.1 Характеристика проблемы сортировки ............................................. |
107 |
1.11.2 Методы внутренней сортировки......................................................... |
108 |
1.11.3 Поиск данных ....................................................................................... |
111 |
1.11.4 Cтандартные процедуры сортировки и поиска данных ................... |
114 |
1.12ПРИМЕРЫ РЕШЕНИЯ ЗАДАЧ СИСТЕМНОГО
ПРОГРАММИРОВАНИЯ .................................................................................. |
116 |
1.12.1 Анализ схемы распределения памяти в MS-DOS ............................. |
116 |
1.12.2 Вывод списка установленных драйверов устройств ........................ |
119 |
1.12.3 Получение информации о системных ресурсах................................ |
121 |
1.12.4 Обработка прерываний в ПЭВМ типа IBM PC/XT/AT.................... |
126 |
1.12.5 Понятие системы типа "клиент-сервер" ............................................ |
130 |
1.12.6 Пример построения системы "клиент-сервер" в QNX ..................... |
131 |
1.12.7 Защита файлов от копирования .......................................................... |
138 |
1.13 ИНТЕРПРЕТАЦИЯ СИСТЕМ ПРОДУКЦИЙ НА ЯЗЫКЕ С ................ |
142 |
1.13.1 Сетевое представление системы продукций ..................................... |
142 |
1.13.2 Входное описание систем продукций ................................................ |
144 |
1.13.3 Интерпретация систем продукций ..................................................... |
148 |
ЗАКЛЮЧЕНИЕ ................................................................................................... |
149 |
РАЗДЕЛ 2 ПРАКТИЧЕСКИЙ................................................................................ |
151 |
ЛАБОРАТОРНЫЙ ПРАКТИКУМ ПО КУРСУ СИСТЕМНОЕ
ПРОГРАММИРОВАНИЕ................................................................................... |
151 |
ЛАБОРАТОРНАЯ РАБОТА №1 ОБЗОР ЯЗЫКА ПРОГРАММИРОВАНИЯ С .................................... |
151 |
6 |
|
ЛАБОРАТОРНАЯ РАБОТА №2 ФУНКЦИИ В ЯЗЫКЕ С.................................................................... |
167 |
ЛАБОРАТОРНАЯ РАБОТА №3 АДРЕСНАЯ АРИФМЕТИКА И УПРАВЛЕНИЕ ПАМЯТЬЮ .............. |
174 |
ЛАБОРАТОРНАЯ РАБОТА №4 ОБРАБОТКА СТРУКТУРИРОВАННЫХ ДАННЫХ............................ |
186 |
ЛАБОРАТОРНАЯ РАБОТА №5 РАБОТА С ФАЙЛАМИ ................................................................... |
193 |
ЛАБОРАТОРНАЯ РАБОТА №6 ДИНАМИЧЕСКИ ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ..................... |
204 |
ЛАБОРАТОРНАЯ РАБОТА №7 ПРОЦЕССЫ И ПОТОКИ ................................................................. |
215 |
ЛАБОРАТОРНАЯ РАБОТА №8 СИНХРОНИЗАЦИЯ ПРОЦЕССОВ И ПОТОКОВ.............................. |
229 |
РАЗДЕЛ 3 КОНТРОЛЬ ЗНАНИЙ ......................................................................... |
236 |
ОБЩИЕ ТРЕБОВАНИЯ К КОНТРОЛЬНОЙ РАБОТЕ .................................. |
236 |
ВАРИАНТЫ ЗАДАНИЯ НА КОНТРОЛЬНУЮ РАБОТУ ............................. |
242 |
ВОПРОСЫ ДЛЯ КОНТРОЛЯ ЗНАНИЙ .......................................................... |
259 |
РАЗДЕЛ 4 ВСПОМОГАТЕЛЬНЫЙ ...................................................................... |
261 |
УЧЕБНАЯ ПРОГРАММА 1-40 01 01 ............................................................... |
261 |
УЧЕБНАЯ ПРОГРАММА 6-05-0612-01........................................................... |
275 |
ОБЩИЕ ТРЕБОВАНИЯ К КУРСОВОМУ ПРОЕКТУ ................................... |
287 |
ПРИЛОЖЕНИЕ А Титульный лист (пример) .................................................. |
292 |
ПРИЛОЖЕНИЕ Б Лист-задания (пример) ....................................................... |
293 |
ПРИЛОЖЕНИЕ В Примерный образец структуры и содержания |
|
пояснительной записки к курсовому проекту.................................................. |
296 |
СПИСОК ЛИТЕРАТУРНЫХ ИСТОЧНИКОВ ................................................ |
297 |
7
РАЗДЕЛ 1 ТЕОРЕТИЧЕСКИЙ
ВВЕДЕНИЕ
Системными программами называют набор программ, используемых в процессе подготовки прикладных программ на этапах от постановки задачи до выполнения на ЭВМ. Примеры системных программ - трансляторы, редакторы связей, текстовые редакторы, загрузчики, отладчики, канальные программы, драйверы.
Системное программирование - разработка, настройка и прагматическое использование системных программ в конкретной вычислительной среде.
Принципиальное отличие системного программирования от прикладного - зависимость от вычислительной системы. Системное програмирование непосредственно связано с особенностями аппаратуры ЭВМ и механизмов операционной системы.
Основные вопросы системного программиста по архитектуре ЭВМ, построенной на идее совместно запоминаемых программы и данных (Дж.фон Нейман):
память - минимальная адресуемая единица памяти, объем памяти, схема адресации;
регистры - количество регистров, их размер, функция и взаимосвязь;
данные - обрабатываемые типы и формат представления в памяти арифметических, символьных и логических данных;
команды - классы команд ЭВМ, набор команд обработки арифметических, логических и символьных данных, команд управления, формат команд и схема их хранения в памяти;
специальные средства - структура системы прерываний, механизмы защиты и их доступность для пользователя, организация ввода-вывода.
Современные вычислительные системы, как правило, представляются наслоением программного обеспечения на аппаратуру. Работа в вычислительной среде конкретной операционной системы требует знания спецификации интерфейсов связи с ее модулями на разных уровнях детализации. В последнее время наблюдается тенденция смещения массовых задач системного программирования на программный уровень.
Внастоящее время задачи системного программирования решаются с использованием чаще всего языка ассемблера либо языка С.
Под ассемблером (автокодом, системой символического кодирования) понимают систему программирования, включающую: язык символического кодирования программы на машинном уровне в терминах мнемонических
8
обозначений команд и символических обозначений операндов; транслятор программ на языке ассемблера в перемещаемые (объектные) модули. Функции ассемблера: отображение символических объектов исходного текста программы на память с учетом формата команд, форм представления данных и системы адресации; подготовка объектного модуля программы стандартного вида; предоставление программисту высокоуровневых услуг по автоматизации кодирования программы (вычислительные операции, макросредства, диагностика ошибок).
Ассемблер применяют после убедительного обоснования в редких классах задач: создание базовых элементов системного программного обеспечения; решение задач со специальными требованиями по вычислительной эффективности либо методам использования вычислительных ресурсов; комплексирование разнородных программных продуктов. Языком ассемблера представляют: заключительный уровень детализации результатов транслятором языка высокого уровня либо генератором прикладных программ; элементы настройки операционных систем и сложных пакетов прикладных программ на конкретные условия применения; фрагменты адаптируемых посредством дизассемблирования чужих программ при отсутствии исходного текста. Язык C, в отличие от языка ассемблера, ориентирован на переносимость программ, по крайней мере, на уровне исходного текста с одной вычислительной системы на другую. Это обеспечивается наличием трансляторов языка С практически на всех современных вычислительных системах.
1.1 ОБЗОР ЯЗЫКА ПРОГРАММИРОВАНИЯ C
1.1.1 Характеристика языка С
Язык C первоначально доминировал в среде мини-ЭВМ, работающих под управлением ОС UNIX, но в дальнейшем получил широкое распространение и в других классах вычислительных систем. Сейчас трудно найти вычислительную систему без поддержки такого языка.
Достоинства языка С:
это современный, эффективный, переносимый, мощный и гибкий, удобный и обладающий рядом присущих ассемблеру управляющих конструкций язык.
наиболее важное положительное качество языка С - переносимость (мобильность), обеспечиваемая наличием стандарта языка и, следовательно, совместимых на уровне исходного текста систем программирования.
Недостаток языка C - относительно плохая "читаемость" текста программ из-за неоднозначности синтаксиса.
9
Области применения языка C - системное программирование и прикладные задачи с жесткими требованиями по скорости и памяти.
Язык С относится к классу языков процедурного типа с адресной арифметикой и формально является подмножеством языка объектноориентированного программирования C++. Освоение языка C создает фундамент для изучения языка C++ [1].
1.1.2 Основные сведения о синтаксисе языка C
Начальные сведения о синтаксисе любого языка программирования включают элементарные правила записи исходного текста программы - идентификация объектов программы, комментарии, формат исходного текста.
Идентификаторы объектов программы на языке C могут включать:
цифры 0...9;
латинские прописные и строчные буквы A...Z, a...z;
символ подчеркивания _.
Первый символ идентификатора не может быть цифрой. Длина
идентификатора определяется реализацией транслятора C и редактора связей (компоновщика). Современная тенденция - снятие ограничений длины идентификатора.
Разделители идентификаторов объектов программы:
пробелы;
символы табуляции, перевода строки и страницы;
комментарии (играют роль пробелов).
Комментарий - любая последовательность символов, начинающаяся парой
символов /* и заканчивающаяся парой символов */.
Формат записи исходного текста программ на языке C – свободный [1].
/* ПРИМЕР ПРОГРАММЫ ТЕСТА ГЕНЕРАТОРА СЛУЧАЙНЫХ ЧИСЕЛ */
#include <stdio.h> #include <stdlib.h>
#define RANGE 100
void main() { int i,j,k,s;
/* Запрос объема выборки */
while (printf("\n K-? "), !scanf(" %d",&k); /* Генерация случайных чисел */
printf("\n Значения %d случайных чисел:\n",k);
10
