- •Учебно-методический комплекс дисциплины «Системное программирование»
- •Алматы, 2016
- •Опись содержания учебно-методического комплекса дисциплины
- •1. Цели и задачи дисциплины.
- •2. Содержание дисциплины
- •2.1.Лекционный курс
- •2.3. Лабораторные занятия
- •2.4. Самостоятельная работа студентов под руководством преподавателя
- •2.5. Самостоятельная работа студентов
- •3. Учебно-методические материалы по дисциплине
- •3.1.Список рекомендуемой литературы
- •3.2. Вопросы для подготовки к экзамену
- •1. Информация о дисциплине
- •2. Краткое описание дисциплины
- •4. Литература для изучения
- •5. Критерии оценки
- •Карта учебно-методической обеспеченности
- •Тезисы лекций
- •Лекция 2. Базовые конструкции структурного программирования
- •Лекция 3. Указатели и массивы
- •Лекция 4. Типы данных, определяемые пользователем
- •Лекция 5. Модульное программирование
- •Лекция 6. Объектно-ориентированное программирование
- •Лекция 7. Операционные системы и их интерфейсы
- •Лекция 8. Управление потоками и процессами
- •Лекция 9. Синхронизация потоков и процессов
- •Лекция 10. Обмен данными между параллельными процессами
- •Лекция 11. Структурная обработка исключений
- •Лекция 12. Работа с виртуальной памятью
- •Лекция 13. Динамически подключаемые библиотеки
- •Планы семинарских, практических, лабораторных и студийных занятий
- •4.1. Индивидуальное задание:
- •4.2. Описание метода решения
- •4.3. Описание логической структуры
- •4.4. Данные для тестирования
- •4.5. Текст программы
- •5.1. Описание методов решения
- •5.1.1. Представление в памяти
- •5.1.2. Модульная структура программного изделия
- •5.2. Описание логической структуры
- •5.2.1. Общие переменные
- •5.3. Программа пользователя
- •5.4. Тексты программных модулей
- •5.5. Варианты.
- •5. Варианты индивидуальных заданий
- •6. Пример решения задачи
- •6.1. Индивидуальное задание:
- •6.2. Описание методов решения
- •6.3. Описание логической структуры
- •6.4. Текст программы
- •5.1. Структура данных программы
- •5.2. Структура программы
- •5.3. Описание переменных
- •5.4. Описание алгоритма программы
- •5.5. Текст программы
- •5.6. Результаты работы программы
- •5.1. Индивидуальное задание.
- •5.2. Разработка алгоритма
- •5.3. Текст программы
- •5.4. Результаты работы программы
- •4. Порядок выполнения
- •5. Индивидуальные задания
- •6. Пример решения задачи
- •6.3. Индивидуальное задание.
- •6.4. Разработка алгоритма решения
- •6.4.1. Структура программы
- •6.5. Текст программы
- •6.6. Результаты работы программы
- •4. Порядок выполнения
- •5. Пример решения задачи
- •5.1. Индивидуальное задание.
- •5.4. Разработка алгоритм решения
- •5.5. Текст программы
- •5.6. Результаты работы программы
- •5.1. Разработка алгоритма решения
- •5.2. Текст программы
- •5.3. Результаты работы программы
- •5.1. Разработка алгоритма решения
- •5.1.1. Структура программы
- •5.1.2. Описание переменных
- •5.1.3. Описание алгоритм программы
- •5.2. Текст программы
- •5.3. Результаты работы программы
- •5.1. Разработка алгоритма решения
- •5.1.1. Структура программы
- •5.1.2. Описание переменных
- •5.1.3. Описание алгоритма программы
- •5.2. Текст программы
- •5.6. Результаты работы программы
- •5.1. Разработка алгоритма решения
- •5.1.1. Структура программы
- •5.1.2. Описание переменных
- •5.1.3. Описание алгоритма программы
- •5.2. Текст программы
- •5.3. Результаты работы программы
- •5.1. Разработка алгоритма решения
- •5.1.3. Описание алгоритма программы
- •5.2. Текст программы
- •5.1. Разработка алгоритма решения
- •5.1.1. Структура программы
- •5.1.2. Описание переменных
- •5.3. Результаты работы программы
- •5.1.3. Описание алгоритма программы
- •5.2 Текст программы
- •5.3. Результаты работы программы
- •Материалы для мониторинга и контроля образованности обучающихся (уровня сформированности предметных компетенций):
- •Методические разработки (рекомендации)
- •Официально изданные преподавателями учебные и учебно-методические пособия (при условии публикации)
- •Перечень:
- •Учебная литература и/или материалы на электронных носителях
5.3. Результаты работы программы
В процессе работы программы на экран была выведена таблица векторов прерываний, просматривать которую можно с помощью клавиш управления:
-----------------------------------------------------------------------------
------------ Лабораторная работа N13 ---------------
------------ Управление памятью. ---------------
Таблица векторов прерывания.
Номер - Адрес - Чем_занят
INT 00h - 0BB0:0125 - TC_LAB13
INT 01h - 0070:06F4 - Занят Bios/Dos
INT 02h - 03DA:0016 - Занят Bios/Dos
INT 03h - 0070:06F4 - Занят Bios/Dos
INT 04h - 0070:06F4 - Занят Bios/Dos
INT 05h - F000:FF54 - Занят Bios/Dos
INT 06h - F000:EB43 - Занят Bios/Dos
INT 07h - F000:EAEB - Занят Bios/Dos
INT 08h - 0ACF:013D - COPY_ECR
INT 09h - 0ACF:0117 - COPY_ECR
INT 0Ah - 03DA:0057 - Занят Bios/Dos
INT 0Bh - 03DA:006F - Занят Bios/Dos
INT 0Ch - 03DA:0087 - Занят Bios/Dos
INT 0Dh - 03DA:009F - Занят Bios/Dos
INT 0Eh - 03DA:00B7 - Занят Bios/Dos
INT 0Fh - 0070:06F4 - Занят Bios/Dos
INT 10h - 057A:035B - KEYRUS
Клавиши управления: <Up>,<Dn>,<Home>,<End>,<PgUp>,<PgDn>,<Esc>
МАТЕРИАЛЫ ДЛЯ ОРГАНИЗАЦИИ И УПРАВЛЕНИЯ САМОСТОЯТЕЛЬНОЙ РАБОТОЙ ОБУЧАЮЩИХСЯ:
Задания для СРСП
Задание для СРСП №1 (1-3 неделя, 7часов)
№ |
Вариант |
1 |
Функция - Copies(s,s1,n). Назначение - копирование строки s в строку s1 n раз |
2 |
Функция - Words(s). Назначение - подсчет слов в строке s |
3 |
Функция - Concat(s1,s2). Назначение - конкатенация строк s1 и s2 (аналогичная библиотечная функция C - strcat) |
4 |
Функция - Parse(s,t). Назначение - разделение строки s на две части: до первого вхождения символа t и после него |
5 |
Функция - Center(s1,s2,l). Назначение - центрирование - размещение строки s1 в середине строки s2 длиной l |
6 |
Функция - Delete(s,n,l). Назначение - удаление из строки s подстроки, начиная с позиции n, длиной l (аналогичная библиотечная Функция есть в Pascal). |
7 |
Функция - Left(s,l). Назначение - выравнивание строки s по левому краю до длины l. |
8 |
Функция - Right(s,l) Назначение - выравнивание строки s по правому краю до длины l. |
9 |
Функция - Insert(s,s1,n). Назначение - вставка в строку s подстроки s1, начиная с позиции n (аналогичная библиотечная функция есть в Pascal). |
10 |
Функция - Reverse(s). Назначение - изменение порядка символов в строке s на противоположный. |
11 |
Функция - Pos(s,s1). Назначение - поиск первого вхождения подстроки s1 в строку s (аналогичная функция C - strstr). |
12 |
Функция - LastPos(s,s1). Назначение - поиск последнего вхождения подстроки s1 в строку s. |
13 |
Функция - WordIndex(s,n). Назначение - определение позиции начала в строке s слова с номером n. |
14 |
Функция - WordLength(s,n). Назначение - определение длины слова с номером n в строке s. |
15 |
Функция - SubWord(s,n,l). Назначение - выделение из строки s l слов, начиная со слова с номером n. |
16 |
Функция - WordCmp(s1,s2). Назначение - сравнение строк (с игнорированием множественных пробелов). |
17 |
Функция - StrSpn(s,s1). Назначение - определение длины той части строки s, которая содержит только символы из строки s1. |
18 |
Функция - StrCSpn(s,s1). Назначение - определение длины той части строки s, которая не содержит символы из строки s1. |
19 |
Функция - Overlay(s,s1,n). Назначение - перекрытие части строки s, начиная с позиции n, строкой s1. |
20 |
Функция - Replace(s,s1,s2). Назначение - замена в строке s комбинации символов s1 на s2. |
21 |
Функция - Compress(s,t). Назначение - замена в строке s множественных вхождений символа t на одно. |
22 |
Функция - Trim(s). Назначение - удаление начальных и конечных пробелов в строке s. |
23 |
Функция - StrSet(s,n,l,t). Назначение - установка l символов строки s, начиная с позиции n, в значение t. |
23 |
Функция - Space(s,l). Назначение - доведение строки s до длины l путем вставки пробелов между словами. |
24 |
Функция - Findwords(s,s1). Назначение - поиск вхождения в строку s заданной фразы (последовательности слов) s1. |
25 |
Функция - StrType(s). Назначение - определение типа строки s (возможные типы - строка букв, десятичное число, 16-ричное число, двоичное число и т.д.). |
26 |
Функция - Compul(s1,s2). Назначение - сравнение строк s1 и та s2 с игнорированием различий в регистрах. |
27 |
Функция - Translate(s,s1,s2). Назначение - перевод в строке s символов, которые входят в алфавит s1, в символы, которые входят в алфавит s2. |
28 |
Функция - Word(s). Назначение - выделение первого слова из строки s. |
Примечание: под "словом" везде понимается последовательность символов, которая не содержит пробелов. |
|
Задание для СРСП №2 (3-5 неделя, 8часов)
№ |
Вид матрицы |
1 |
все нулевые элементы размещены в левой части матрицы |
2 |
все нулевые элементы размещены в правой части матрицы |
3 |
все нулевые элементы размещены выше главной диагонали |
4 |
все нулевые элементы размещены в верхней части матрицы |
5 |
все нулевые элементы размещены в нижней части матрицы |
6 |
все элементы нечетных строк - нулевые |
7 |
все элементы четных строк - нулевые |
8 |
все элементы нечетных столбцов - нулевые |
9 |
все элементы четных столбцов - нулевые |
10 |
все нулевые элементы размещены в шахматном порядке, начиная с 1-го элемента 1-й строки |
11 |
все нулевые элементы размещены в шахматном порядке, начиная со-2го элемента 1-й строки |
12 |
все нулевые элементы размещены на местах с четными индексами строк и столбцов |
13 |
все нулевые элементы размещены на местах с нечетными индексами строк и столбцов |
14 |
все нулевые элементы размещены выше главной диагонали на нечетных строках и ниже главной диагонали - на четных |
15 |
все нулевые элементы размещены ниже главной диагонали на нечетных строках и выше главной диагонали - на четных |
16 |
все нулевые элементы размещены на главной диагонали, в первых 3 строках выше диагонали и в последних 3 строках ниже диагонали |
17 |
все нулевые элементы размещены на главной диагонали и в верхней половине участка выше диагонали |
18 |
все нулевые элементы размещены на главной диагонали и в нижней половине участка ниже диагонали |
19 |
все нулевые элементы размещены в верхней и нижней четвертях матрицы (главная и побочная диагонали делят матрицу на четверти) |
20 |
все нулевые элементы размещены в левой и правой четвертях матрицы (главная и побочная диагонали делят матрицу на четверти) |
21 |
все нулевые элементы размещены в левой и верхней четвертях матрицы (главная и побочная диагонали делят матрицу на четверти) |
22 |
все нулевые элементы размещены на строках, индексы которых кратны 3 |
23 |
все нулевые элементы размещены на столбцах, индексы которых кратны 3 |
24 |
все нулевые элементы размещены на строках, индексы которых кратны 4 |
25 |
все нулевые элементы размещены на столбцах, индексы которых кратны 4 |
26 |
все нулевые элементы размещены попарно в шахматном порядке (сначала 2 нулевых) |
27 |
матрица поделена диагоналями на 4 треугольники, элементы верхнего и нижнего треугольников нулевые |
28 |
матрица поделена диагоналями на 4 треугольники, элементы левого и правого треугольников нулевые |
29 |
матрица поделена диагоналями на 4 треугольника, элементы правого и нижнего треугольников нулевые |
30 |
все нулевые элементы размещены квадратами 2х2 в шахматном порядке |
Исполнителю самому надлежит выбрать, будут ли начинаться индексы в матрице с 0 или с 1.
матрица содержит нули ниже главной диагонали;
индексация начинается с 0.
Задание для СРСП №3 (6-7 неделя, 7часов)
№ |
Прикладная область |
Атрибуты информации |
1 |
Отдел кадров |
фамилия сотрудника, имя, отчество, должность, стаж работы, оклад |
2 |
Красная книга |
вид животного, род, семейство, место обитания, численность популяции |
3 |
Производство |
обозначение изделия, группа к которой оно относится, год выпуска, объем выпуска, расход металла |
4 |
Персональные ЭВМ |
фирма-изготовитель, тип процессора, тактовая частота, емкость ОЗУ, емкость жесткого диска |
5 |
Библиотека |
автор книги, название, год издания, код УДК, цена, количество в библиотеке |
6 |
Спутники планет |
название, название планеты-хозяина, год открытия, диаметр, период обращения |
7 |
Радиодетали |
обозначение, тип, номинал, количество на схеме, обозначение возможного заменителя |
8 |
Текстовые редакторы |
наименование, фирма-изготовитель, количество окон, количество шрифтов, стоимость |
9 |
Телефонная станция |
номер абонента, фамилия, адрес, наличие блокиратора, задолженность |
10 |
Быт студентов |
фамилия студента, имя, отчество, факультет, размер стипендии, число членов семьи |
11 |
Спортивные соревнования |
фамилия спортсмена, имя, команда, вид спорта, зачетный результат, штрафные очки |
12 |
Соревнование факультетов по успеваемости |
факультет,количество студентов, средний балл по факультету, число отличников, число двоечников |
13 |
С/х работы |
фамилия студента, имя, отчество, факультет, вид работ, заработок |
14 |
Сельхозработы |
наименование с/х предприятия, вид собственности, число работающих, основной вид продукции, прибыль |
15 |
Сведения о семье |
фамилия студента, имя, отчество, факультет, специальность отца, специальность матери, количество братьев и сестер |
16 |
Скотоводство |
вид животных, количество особей в стаде в возрасте до 1 года, количество особей 1 - 3 лет, свыше 3 лет, смертность в каждой группе, рождаемость |
17 |
Микросхемы памяти |
обозначение, разрядность, емкость, время доступа, количество на схеме, стоимость |
18 |
Описание изображения |
тип фигуры (квадрат, окружность и т.п.), координаты на плоскости, числовые характеристики (длина строрны, радиус и т.п.). |
19 |
Лесное хозяйство |
наименование зеленого массива, площадь, основная порода, средний возраст, плотность деревьев на кв.км |
20 |
Городской транспорт |
вид транспорта, номер маршрута, начальная остановка, конечная остановка, время в пути |
21 |
Университет |
ФИО и должность преподавателя, названиепредмета, количество часов, тип контроля |
22 |
Оптовая база |
название товара, количество на складе, стоимость единицы, название поставщика, срок поставки |
23 |
Сеть магазинов |
номер, название, адрес, телефон магазина, ФИО, адрес, капитал владельцев магазина. |
24 |
Авторемонтные мастерские |
номер, марка, мощность и цвет автомобиля, ФИО и квалификация механика, тип работ |
253 |
Зоопарк |
вид животного, кличка, возраст, категория редкости, вес, суточный рацион мяса, овощей, молока |
26 |
Договорная деятельность организации |
шифр договора, наименование организации, наименование контрагента сроки выполнения, сумма договора, вид договора. |
27 |
Поликлиника |
ФИО и дата рождения пациента, ФИО, должность и специализация лечащего врача, диагноз |
28 |
Домоуправление |
номер квартиры, общая площадь, полезная площадь, количество комнат, фамилия квартиросъемщика, количество членов семьи, количество детей в семье, есть ли задолженность по квартплате |
29 |
Аэропорт |
номер рейса, пункт назначения, день рейса, тип самолета, время вылета, время в пути, является ли маршрут международным, |
30 |
Шахматы |
ФИО спортсмена, дата рождения, страна, спортивный разряд, участвовал ли в борьбе за звание чемпиона мира, рейтинг, |
31 |
Ипподром |
кличка лошади, масть, возраст, рейтинг, вид забега, фамилия наездника, занятое место |
32 |
Малые планеты |
Название, название планеты-хозяина (для спутников), дата открытия, диаметр, период обращения |
33 |
Автотранспортное предприятие |
номерной знак автомобиля, марка, техническое состояние, грузоподъемность, расход топлива, табельный номер и ФИО закрепленного водителя водителя |
Задание для СРСП №4 (8-10 неделя, 8часов)
Nп/п |
"Горячая" комбинация/ |
Клавиша, которая блокируется |
||||||
Shift |
Ctrl |
Alt |
Fxx |
|||||
Лев. |
Пр. |
Лев. |
Пр. |
Лев. |
Пр. |
|||
1 |
+ |
+ |
|
|
|
|
F1 |
1 |
2 |
+ |
|
+ |
|
|
|
F2 |
2 |
3 |
|
+ |
|
|
+ |
|
F3 |
3 |
4 |
+ |
|
|
|
+ |
|
F4 |
4 |
5 |
+ |
|
|
|
|
+ |
F5 |
5 |
6 |
|
+ |
+ |
|
|
|
F6 |
6 |
7 |
|
+ |
|
|
+ |
|
F7 |
7 |
8 |
|
+ |
|
+ |
|
|
F8 |
8 |
9 |
|
+ |
|
|
|
+ |
F9 |
9 |
10 |
|
|
+ |
|
+ |
|
F10 |
0 |
11 |
|
|
+ |
|
|
+ |
F1 |
q |
12 |
|
|
|
+ |
+ |
|
F2 |
w |
13 |
|
|
|
+ |
|
+ |
F3 |
e |
14 |
+ |
|
+ или + |
|
|
F4 |
r |
|
15 |
|
+ |
|
|
+ или + |
F5 |
t |
|
16 |
|
|
|
|
|
|
F6 |
y |
17 |
+ |
+ |
+ или + |
|
|
F7 |
u |
|
18 |
+ |
+ |
|
|
+ или + |
F8 |
i |
|
19 |
|
|
+ или + |
+ или + |
F9 |
o |
||
20 |
+ |
+ |
+ или + |
+ или + |
F10 |
p |
||
Задание для СРСП №5 (11-13 неделя, 7часов)
N пп |
R |
y = F(x) |
Частота (гц) |
1 |
0 - 10 |
y=((100-x)%100)*0.5+R+100 |
72.7 |
2 |
0 - 10 |
y=((77-x)%200)*0.1+R+150 |
145.5 |
3 |
0 - 10 |
y=40*(cos(x/10)+cos(x/6))+R+100 |
36.4 |
4 |
0 - 2 |
y=50*(cos(x/10)+R*cos(x/5))+150 |
54.5 |
5 |
0 - 2 |
y=50*sin(cos(x/10)+R)+150 |
90.9 |
6 |
0 - 1 |
y=0.5*(x%100)+100*sin(x/5)*R+150 |
72.7 |
7 |
0 - 1 |
y=0.5*(x%100)+50*sin(x/50)*(R+1)+150 |
145.5 |
8 |
0 - 1 |
y=50*sin(x/(10+R))+150 |
36.4 |
9 |
0 - 0.2 |
y=50*(fabs(sin(x/10))+R)+150 |
54.5 |
10 |
0 - 10 |
y=10*-1N*(x/100)+R+150 |
90.9 |
11 |
0 - 10 |
y=-1N*50*sin(x/10)+150+R |
72.7 |
12 |
0 - 10 |
y=0.5*-1N*(x%200)*sin(x/10)+150+R |
145.5 |
13 |
0 - 10 |
y=0.5*-1N*(x%200)+50*sin(x/10)+150+R |
36.4 |
14 |
0 - 10 |
y=50*(sin(x/64)+sin(x/32)+ +0.1*sin(x/4)+0.1*sin(x/2))+R+150 |
54.5 |
15 |
0 - 10 |
y=50*(sin(x/64)+sin(x/32)+ +sin(x/2))+R+150 |
90.9 |
16 |
0 - 10 |
y=0.5*(x%100+-1N*x%200)+150+R |
72.7 |
17 |
0 - 10 |
y=0.5*(-1N*x%100+x%200)+R+150 |
145.5 |
18 |
0 - 0.1 |
y=0.5*(-1N*x%100+200*R*sin(x/10))+150 |
36.4 |
Примечание: R - случайное вещественное число из последовательности, равномерно распределенной в указанном интервале. |
|||
Задание для СРСП №6 (13-15 неделя, 8часов)
Применяя прямую запись в видеопамять получить на экране оригинальный, желательно динамический видеоэффект. Возможны (но не обязательны) такие варианты видеоэффектов:
"теннисный мячик" - шарик, который летает по экрану и отражается от рамок и границ экраны;
"сухой лист" - опадание букв с экрана;
"жук-пожиратель" - фигурка, которая перемещается по экрану по случайной траектории и "съедает" буквы;
"удав" - то же, что и "жук", но к тому же он увеличивается в размерах, по мере "поедания" букв;
и т.д., и т.п.
Задания для СРС (семестровое задание)
Теоретическая часть: Объекты ядра: наследование; права доступа; дескрипторы безопасности. Практическая часть: Заставьте консольный процесс запустить несколько своих копий (и далее рекурсивно). Убедитесь, что порождение процессов не будет бесконечным (остановитесь на 4 уровнях максимум). Перенаправьте консольный вывод в файл и заставьте все дочерние процессы наследовать дескриптор этого файла.
Теоретическая часть: Потоки: порождение; работа с TLS; передача сообщений между потоками; критические секции кода. Практическая часть: Запустить 10 потоков, передав каждому потоку в качестве параметра его номер в коллективе потоков. Каждый поток должен вывести свой номер. Зарегистрировать критическую секцию в главном потоке программы, использовать ее для обрамления секции кода.
Теоретическая часть: Динамические библиотеки: экспорт/импорт функций; работа с TLS. Практическая часть: Описать точку входа в DLL. Описать несколько функций для экспорта из DLL. Зарезервировать TLS-слот и использовать в вашей DLL для хранения приватных данных потока. В программе-примере импортировать функции из DLL статически и динамически.
Теоретическая часть: Обработка исключительных ситуаций; исследование информации о состоянии процесса. Практическая часть: Создать оболочку последней линии обороны вокруг всех функций потоков (для исследования предсмертной информации о процессе). Искусственно породить в программе недопустимую операцию, перехватить ее и вывести на печать содержимое регистров программы.
Теоретическая часть: Кучи: создание; сериализация доступа; оптимизация. Практическая часть: Описать набор функций для работы со списками. Память для объектов каждого списка выделять динамически из приватной кучи без упорядочения обращений.
Теоретическая часть: Виртуальная память: регионы, резервирование, права доступа. Практическая часть: Исследовать адресное пространство процесса, определить местонахождение динамически загруженных библиотек, куч, стеков.
Теоретическая часть: Потоки: порождение, синхронизация, семафоры и мутексы. Практическая часть: Создать объект ядра событие. Запустить 10 потоков, передав каждому потоку в качестве параметра его номер в коллективе потоков. Каждый поток должен выполнить свою часть работы. Процесс должен ожидать завершения всех 10 потоков.
Теоретическая часть: Процессы: порождение; наследование дескрипторов; синхронизация между процессами. Практическая часть: Заставьте консольный процесс запустить несколько своих копий (и далее рекурсивно). Убедитесь, что порождение процессов не будет бесконечным (остановитесь на 4 уровнях максимум). Для каждого процесса создать свое окно консоли с индивидуальными настройками.
Теоретическая часть: Общесистемные ловушки: регистрация; наблюдение; подмена сообщений. Практическая часть: Зарегистрировать ловушку для всех оконных сообщений в системе. Выводить на печать информацию о сообщениях. Корректно завершить процесс наблюдения и убрать ловушку при закрытии программы.
Теоретическая часть: Проецирование файлов в память. Применение проекций файлов для разделения данных между процессами. Практическая часть: Поменять местами две половины большого двоичного файла используя двойное проецирование в память для представления файла.
Теоретическая часть: Совместное использование регионов памяти несколькими процессами. Практическая часть: Разделить регион между двумя процессами с помощью проецирования; синхронизировать с помощью семафора процесс обновления данных в регионе.
Теоретическая часть: Динамические библиотеки: экспорт/импорт функций; работа с TLS. Практическая часть: Описать точку входа в DLL. Описать несколько функций для экспорта из DLL. Зарезервировать TLS-слот и использовать в вашей DLL для хранения приватных данных потока. В программе-примере организовать отложенный (ленивый) импорт функций из DLL по первому запросу программы.
