Портал аспирантов

Портал аспирантов (http://www.aspirantura.spb.ru/forum/index.php)
-   Свободное общение (http://www.aspirantura.spb.ru/forum/forumdisplay.php?f=102)
-   -   Что вижу, о том пою (с). Часть 5 (http://www.aspirantura.spb.ru/forum/showthread.php?t=12558)

4gost 02.08.2014 23:42

Цитата:

Сообщение от Maksimus (Сообщение 464175)
А какая в нем польза?

Скрытый текст
Postman: Надо кошку завести, она будет всех радовать!
Механик: Это бесполезное животное будет от меня получать пендаля
Postman: Ну это будет же тебя радовать?
Механик: Да....
Postman: Значит ее жизнь не будет бессмысленной.
(с)башорг

Домохозяйка 03.08.2014 10:50

Цитата:

Сообщение от Maksimus (Сообщение 464175)
А какая в нем польза?

оно из молока

Maksimus 03.08.2014 12:06

Цитата:

Сообщение от Домохозяйка (Сообщение 464221)
оно из молока

и немеряно сахара.

Дмитрий В. 03.08.2014 13:39

Цитата:

Сообщение от _Tatyana_ (Сообщение 464130)
вы столица, мы родина

С небольшим запозданием - поздравляю уважаемого Havrosh как непосредственно причастного ко дню ВДВ, желаю мирного неба над головой и всегда штатного приземления! :)
http://s004.radikal.ru/i206/1308/43/a1b6ed31ee96.gif

Paul Kellerman 03.08.2014 13:39

kravets, проблема рандомизации доступа к ресурсу с использованием мьютекса решилась.

В классике каждый поток перед доступом к ресурсу пытается захватить мьютекс и если не
получается уходит в спячку, пока мьютекс не освободится и система отдаст мьютекс потоку.
Код:

if WaitForSingleObject(ResMutex,INFINITE) = WAIT_OBJECT_0 then
  begin
    .
    < работа с ресурсом >
    .
    ReleaseMutex(ResMutex);
  end;

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

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

Код:

flag:= False;
while not(flag) do
  begin
    dt:= 10 + 20 * Random;
    if WaitForSingleObject(ResMutex, dt) = WAIT_OBJECT_0 then flag:= True;
  end;
if (flag) then
  begin
    .
    < работа с ресурсом >
    .
    ReleaseMutex(ResMutex);
  end;

Из-за прерывистого ожидания со случайными интервалами системе приходится выбирать наугад.

Минус метода - низкое быстродействие, но мне и не нужно быстро. Потоки в среднем раз в секунду
обращаются к ресурсу. По сути получилась спин-блокировка с ожиданиями в течение случайных dt.

Протестировал в имитационной модели. Статистические показатели отлично сходятся с расчетными.

kravets 03.08.2014 14:21

Цитата:

Сообщение от Paul Kellerman (Сообщение 464243)
kravets, проблема рандомизации доступа к ресурсу с использованием мьютекса решилась.

По сути то же, что и случайные приоритеты.

Paul Kellerman 03.08.2014 15:22

kravets, нет, не то же самое. Шаманство с приоритетами косвенно влияет на остальные потоки,
которые никакого отношения к доступу ресурсу и вообще к процессу моделирования не имеют.

kravets 03.08.2014 15:24

Цитата:

Сообщение от Paul Kellerman (Сообщение 464297)
kravets, нет, не то же самое. Шаманство с приоритетами косвенно влияет на исполняемые потоки,
которые никакого отношения к доступу ресурсу и вообще к процессу моделирования не имеют.

И это правильно - не влиять на процесс моделирования (как предлагаю я), а не вмешиваться в него (как делаете Вы).

Paul Kellerman 03.08.2014 15:40

kravets, вмешательства в моделирование нет, среднее время ожидания доступа к ресурсу
не изменилось. Изменился лишь порядок захвата ресурса - он стал случайным, а не спра-
ведливым, как это реализовано в винде. И это как раз то, что и требовалось. Изменение
приоритетов - внесение искусственной асимметрии совершенно несвойственной модели.

То что делаю я имеет следующую аналогию. Ожидание какого-либо события с поглядыва-
нием на часы через случайные интервалы времени. Можно вообще не смотреть на часы и
просто ждать, а можно поглядывать - на событие и на всех остальных это никак не влияет.

kravets 03.08.2014 16:24

Цитата:

Сообщение от Paul Kellerman (Сообщение 464306)
kravets, вмешательства в моделирование нет, среднее время ожидания доступа к ресурсу
не изменилось. Изменился лишь порядок захвата ресурса - он стал случайным, а не спра-
ведливым, как это реализовано в винде. И это как раз то, что и требовалось. Изменение
приоритетов - внесение искусственной асимметрии совершенно несвойственной модели.

То что делаю я имеет следующую аналогию. Ожидание какого-либо события с поглядыва-
нием на часы через случайные интервалы времени. Можно вообще не смотреть на часы и
просто ждать, а можно поглядывать - на событие и на всех остальных это никак не влияет.

Так устроены системы имитационного моделирования с дискретным временем. Но время тикает снаружи, а Вы пытаетесь управлять им внутри, считая при этом, что Вы моделируете честно.

Paul Kellerman 03.08.2014 16:59

kravets, я никак не управляю временем. Оно и правда тикает снаружи, аппаратно.
Все моделируемые объекты живут в реальном непрерывном времени. Дискретны
и случайны только временные метки, кот. ставятся исключительно только для ОС,
чтобы она выбирала на основе времени ожидания с момента последней случайной
метки ожидающего объекта, а не с момента, когда понадобился ресурс. И главное,
дискретные метки не мешают захватить ресурс в любой момент между метками.

kravets 03.08.2014 18:15

Цитата:

Сообщение от Paul Kellerman (Сообщение 464243)
if WaitForSingleObject(ResMutex, dt) = WAIT_OBJECT_0 then flag:= True;

Говорите, не управляете временем и все отдаете системе?

Paul Kellerman 03.08.2014 19:53

kravets, стандартная функция ожидания объекта синхронизации (мьютекса в моем случае).
Во время ожидания процессорное время не тратится, поток отправляется системой в спячку
до того момента, когда либо мьютекс освободится, либо истечет таймаут dt. За мьютексом и
за таймаутом следит ОС, и программист при всем желании никак вмешаться в это не может.
Пока не произошло ни то, ни другое, ОС предоставляет процессорное время другим потокам.
Средняя загрузка процессора потоками, участвующих в процессе моделировании, менее 1%.
А все потому что даже когда поток захватывает мьютекс и получает доступ к ресурсу, он не
тратит процессорное время, а просто вызывает функцию Sleep с заданным таймаутом, ими-
тируя некоторые действия с ресурсом с некоторой длительностью, а реально просто спит,
мьютекс при этом захвачен этим потоком, а остальные потоки спят, сидя в Wait-функции.
Короче, все потоки практически всё время "спят", включая поток, захвативший мьютекс.

Dr SG 03.08.2014 19:55

все. баста. на сегодня мне хватит (дров)
щас кину курицу в духовку, накопаю картошки с морковкой, помою посуду после обеда, сдерну с веревки шмотки высушенные и буду отдыхать по поводу воскресенья.
(сяду и буду делать бумажную работу ибо ножки подо мной уже подгибаются).

Dukar 03.08.2014 19:59

Цитата:

Сообщение от Dr SG (Сообщение 464395)
все. баста. на сегодня мне хватит (дров)
щас кину курицу в духовку, накопаю картошки с морковкой, помою посуду после обеда, сдерну с веревки шмотки высушенные и буду отдыхать по поводу воскресенья.

Насыщенные выходные :smirk:


Текущее время: 14:58. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
© 2001—2025, «Аспирантура. Портал аспирантов»