Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция №6. Инверсия приоритетов




 

Инверсия приоритетов

Наличие приоритетов может привести к неявной рокировке, когда более высокоприоритетный поток ждет сигнал от менее приоритетного потока.

  1. Поток T1 выполняет код в критической секции.
  2. Появляется поток T3 с наивысшим приоритетом в готовом состоянии поток T1 вытесняется.
  3. Поток T3, ожидая событие, отдает управление потоку T1, потому что в данный момент поток T1 наиболее приоритетный поток в готовом состоянии.
  4. Если в системе появляется готовый поток T2 в то время, как T1 не успел выйти из критической секции, то он (T2) блокирует более приоритетный поток T3, т.о. происходит инверсия приоритета.

Решение проблемы Win 2000 и Win 98:

В Win 2000 планировщик учитывает время простоя готовых потоков и случайным образом повышает их динамический приоритет.

В Win 98 диспетчер обнаруживает зависимости более приоритетного потока от менее приоритетного потока через объект ядра и повышает приоритет менее приоритетного потока до уровня приоритета более приоритетного потока.

 

Управление несколькими процессорами

Распределение потоков между процессорами.

  1. ThreadAffinity (соответствие потока определенному процессору). Указание данного свойства вынуждает поток исполняться на указанном подмножестве процессоров.

SetProcessAffinityMask() GetProcessAffinityMask()

SetThreadAffinityMask() GetThreadAffinityMask()

Установка аффинности может использоваться в двух случаях:

· Отладка многозадачного приложения (при отладке можно наблюдать за активностью каждой отдельной нити);

· Оптимизация под архитектуры с неоднородным доступом к памяти (NUMA).

 

Если зависимые нити поместить на один процессор, то они будут выполняться быстрее, так как будут обрабатываться через один внутренний КЭШ процессора, а не внешний, как в противном случае.

MSDN: назначение (жесткое) нитей на процессора может снизить производительность.

  1. Thread Ideal Processor (это не жесткая привязка, а “рекомендация” диспетчеру назначать поток на данный процессор).

SetIdealProcessor() GetProcessIdealProcessor()

 

Оптимизация в режиме пользователя

Указатели на функции/методы/классы.

  1. Указатель на функцию, возвращающую значение Int.

int (*f)(); – объявление указателя на функцию, возвращающую целое значение.

При этом: *f() – сама функция, f() – указатель.

На этот указатель выделяется память в статической области.

 

int *f(); – функция, возвращает указатель на int.

 

int f(int (*f1)()); – прототип функции, принимающей указатель на функцию в качестве аргумента.

Также можно записать следующим образом:

typedef int (*F1)();

int f(F1 f1); – прототип функции, принимающей в качестве аргумента f1 указатель на функцию (возвращающую целое значение), имеющий тип F1, описанный ранее оператором typedef.

 

  1. Обращение к методам:

Для вызова метода meth() объекта obj можно воспользоваться одной из следующих записей:

obj meth();

obj.meth();

(*obj).meth();

 

class Std_interface {

public: virtual void start() = 0;

virtual void suspend() = 0;

}

 

typedef void (Std_interface::* Pstd_mem)(); //Оператор:: – разрешение области

// видимости класса

 

void f(Std_interfece *p) {

Pstd_mem S = &Std_interface::suspend;//возвращает смещение до метода

//suspend() в таблице виртуальных

//методов Std_interface

(p *S)();

p suspend();

}

 

Данные указатели являются смещениями указателей в таблице Виртуальных методов.

 

Синхронизации в пользовательском режиме

Типы синхронизации:

  1. Совместное использование разделяемого ресурса (конкурентное взаимодействие);
  2. Уведомление потоков о завершении какой-либо операции (кооперативное взаимодействие).

 

Иллюстрация условия Гонки (race condition):

long g_x = 0;

DWORD WINAPI Thr1(PVOID) {

g_x++;

return 0;

}

DWORD WINAPI Thr2(PVOID) {

g_x++;

return 0;

}

LPTHREAD_START_ROUTINE thr_arr [2] = {Thr1, Thr2}

HANDLE trh_hnd [2];

Int main(…) {

DWORD id;

g_x = 0;

for (int i=0; i<2; i++) {

thr_hnd [i] = CreateThread (NULL, 0, thr_arr [i], NULL, 0, &id);

if (thr_hnd [i] = = NULL) ExitProcess(-1);

}

WaitForMultipleObjects(2, thr_hnd, TRUE, INFINITE)

}

 

 




Поделиться с друзьями:


Дата добавления: 2014-12-07; Просмотров: 875; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.