Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
!1-25.doc
Скачиваний:
11
Добавлен:
28.10.2018
Размер:
2.62 Mб
Скачать

13.4 Дан файл, компоненты которого являются действительными числами. Сформировать линейный список и

найти наибольшее из значений компонент.

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

struct list

{

int info;

list *prev;

list *next;

list() { prev=NULL; next=0; info=0; }

};

void insert_post(list *, int);

void printList(list *);

int findMax(list *);

list *first=0;

list *last=0;

char buffer[100];

void main( void )

{

int fh;

unsigned int i, nbytes = 100, bytesread;

char digit[10];

list *p;

/* Open file for input: */

if((fh = _open("file.dat", _O_RDONLY)) == -1)

{

perror("open failed on input file");

exit(1);

}

/* Read in input: */

if((bytesread = _read(fh, buffer, nbytes)) <= 0) {

perror("Problem reading file");

exit(1);

}

for(i=0; i<bytesread; i++) {

if(buffer[i]==0x0a) continue;

p=last;

sprintf(digit, "%c", buffer[i]);

insert_post(p, atoi(digit));

}

printList(first);

printf("The max item in the list is %d\n", findMax(first));

_close(fh);

}

/* Tставка элемента после текуего */

void insert_post(list *q, int value)

{

list *p = new list;

if (q != 0)

{

p->next = q->next;

p->prev = q;

}

p->info = value;

if (q == 0)

{

first = p;

last = p;

}

else

{

if (q->next == 0) last = p;

else q->next->prev = p;

q->next = p;

}

}

/* find max item in the list */

int findMax(list *q)

{

int max=-9999;

while(q!=NULL) {

if(q->info > max) max = q->info;

q = q->next;

}

return max;

}

/* Print the list */

void printList(list *q)

{

if (q == 0)

printf("List is empty.\n\n");

else

{

printf("The list is:\n");

while (q != 0)

{

printf("%d-> ", q->info);

q = q->next;

}

printf("NULL\n\n");

}

}

13.5

CREATE DATA BASE Нагрузка_преподав

USE Нагрузка_преподав

CREATE TABLE Преподаватель{Табельный_номер INT NOT NULL PRIMARY KEY,

ФИО varchar{50}, Должность varchar{15}, звание varchar{15}, Адрес varchar{40}, телефон INT, кафедра varchar{20} }

CREATE TABLE Предмет{Код INT NOT NULL PRIMARY KEY,

Название varchar{20}, Семестр INT, Кол-во_лекций INT, Кол-во_практик INT, Кол-во_л/р INT }

CREATE TABLE Начитка{номер_записи INT NOT NULL PRIMARY KEY,

Код INT FOREING KEY REFERENCES Предмет , Табельный_номер INT FOREING KEY REFERENCES Преподаватель, Номер_группы INT }

14.1 Потоки. Функция CreateThread. Завершение потока. Распределение процессорного времени между потоками. Изменение класса приоритета процесса. Установка относительного приоритета потока.

Потоки. Процессы инертны. Отвечают же за исполнение кода, содержащегося в адресном пространстве процесса, потоки. Поток (thread) - некая сущность внутри процесса, получающая процессорное время для выполнения. В каждом процессе есть min 1 поток- первичный. Далее этот поток может породить другие потоки, те в свою очередь новые и т.д. Т.о., один процесс может владеть несколькими потоками, и тогда они одновременно исполняют код в адресном пространстве процесса. Каждый поток имеет:1)Уникальный идентификатор потока;2)Содержимое набора регистров процессора, отражающих состояние процессора; 3)Два стека, один из которых используется потоком при выполнении в режиме ядра, а другой - в пользовательском режиме; 4)Закрытую область памяти, называемую локальной памятью потока (thread local storage, TLS) и используемую подсистемами, run-time библиотеками и DLL.

Создание потоков. Первичный поток создается автоматически при создании процесса. Остальные потоки создаются функциями CreateThread и CreateRemoteThread (только в Win NT/2000/XP).Поток (thread) определяет последовательность выполнения кода в процессе. При инициализации процесса система создает первичный поток. Большинство приложений обходятся этим единственным первичным потоком. В более сложных приложениях потоков несколько.

HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибуты защиты потока    DWORD dwStackSize, // какую часть адресного пространства поток может использовать под свой стек    LPTHREAD_START_ROUTINE lpStartAddress,// адрес ф-ии потока, с кот нач работу создаваемый поток     LPVOID lpParameter, // позволяет передавать функции потока какое-либо инициализирующее значение.     DWORD dwCreationFlags, // определяет дополнительные флаги, управляющие созданием потока     LPDWORD lpThreadId  );// адрес переменной типа DWORD,в которой функция вернет идентификатор, приписанный системой новому потоку

Завершение потока.Поток можно завершить тремя способами: 1)поток самоуничтожается вызовом функции ExitThread; 2)один из потоков данного или другого процесса вызывает функцию TerminateThread; 3)завершается процесс, содержащий данный поток.

Распределение процессорного времени между потоками. В Win95 и WinNT применяется такой алгоритм: Система выделяет процессорное время всем активным потока, исходя из их уровней приоритета, которые варьируются от 0 (низший) и до 31 (высший). Нулевой уровень присваивается в системе особому потоку обнуления страниц, обнуляющий свободные страницы при отсутствии потоков. Ни один поток, кроме него, не может иметь нулевой уровень приоритета. Когда система подключает поток к процессору, он обрабатывает потоки с одинаковым приоритетом как равноправные. Иначе говоря, на процессор передается первый поток с приоритетом 31, а по истечении его кванта времени подключается следующий поток с тем же приоритетом 31. При отсутствии потоков с приоритетом 31 система переходит к потокам с приоритетом 30.

Планирование потоков. В Windows реализована система вытесняющего планирования на основе приоритетов, в которой всегда выполняется поток с наибольшим приоритетом, готовый к выполнению. Выбранный для выполнения поток работает в течение некоторого периода, называемого квантом. Квант определяет, сколько времени будет выполняться поток, пока ОС не прервет его. По окончании кванта ОС проверяет, готов ли к выполнению другой поток с таким же (или большим) уровнем приоритета. Если таких потоков не оказалось, текущему потоку выделяется еще один квант. Однако поток может не полностью использовать свой квант. Как только другой поток с более высоким приоритетом готов к выполнению, текущий поток вытесняется, даже если его квант еще не истек.

Приоритеты. В Windows существует 32 уровня приоритета(0-31). Они группируются так: 31 - 16 уровни реального времени; 15 - 1 динамические уровни; 0 - системный уровень, зарезервированный для потока обнуления страниц (zero-page thread).Уровни приоритета присваивает сама система в 2 этапа:1) процессу присваивается опр класс приоритета. 2) потокам, принадлежащим этому процессу присваивается относит ур приоритета.При создании процесса, ему назначается один из шести классов приоритетов:Real time class (значение 24), High class (значение 13), Above normal class (значение 10), Normal class (значение 8), Below normal class (значение 6), Idle class (значение 4).

Приоритет каждого потока (базовый приоритет потока) складывается из приоритета его процесса и относительного приоритета самого потока. Есть семь относительных приоритетов потоков: Normal: такой же как и у процесса; Above normal: +1 к приоритету процесса; Below normal: -1; Highest: +2; Lowest: -2; Time critical: устанавливает базовый приоритет потока для Real time класса в 31, для остальных классов в 15. Idle: устанавливает базовый приоритет потока для Real time класса в 16, для остальных классов в 1.

Класс приоритета моно изменить BOOL_SetPriority Class(HANDLE hProcess, DWORD fdwPriority);

Относит приоритет потока в пределах одного процесса можно изменить: BOOL_SetThreadPriority(HANDLE hThread_PRIORITY_OWEST)