Обновить
41
0.8
Николай Меркин @nickolaym

Пользователь

Отправить сообщение
Ещё в порядке буквоедства.
Линия, проходящая через картинку видимого света — это не синусоида. Её частота убывает, т.е. это какое-то sin(t1/a).
Электромагнитная волна, проходящая через весь спектр — не более, чем художественный образ. В природе это явление тоже существует и называется красным смещением, но к статье оно отношения не имеет.
Вообще, педалировать именно волновую природу света здесь неуместно.

Свет, проходящий через призму — это опыт, показывающий, что белый свет является суммой светового излучения разной частоты (длины волн).
Призма не трансформирует свет, а только разводит пучки по разным направлениям.
Не любой белый свет распадётся на семь цветов. Если взять белый свет от видеопроектора, то получим преимущественно красный, зелёный и синий цвета. Если от люминесцентной лампы — получим кучу узких полос. От лампы накаливания — равномерный спектр.
Но деление на семь — это вопрос культуры, языка и привычки. Опытный художник насчитает в радуге, скажем, двести цветов, а англичанин — шесть (объединит голубой с синим).
Вообще-то, ионизирующее излучение — это ЭМ, начиная с ультрафиолета (иногда УФ не учитывают — тогда начиная с рентгена), и потоки заряженных частиц.
То, что названо ионизирующим в статье — это гамма.
А, понял!
То есть, мы делаем предположение, что, вне зависимости от временной диаграммы, путь обхода одним потоком всех его ресурсов выглядит одинаково.
И на основании этого, построив такие пути для всех потоков, выясняем, могут ли в принципе возникать дедлоки.

Это предположение крайне важно.
Во-первых, оно может давать ложные срабатывания — там, где из-за каких-то обстоятельств временная диаграмма в принципе не может сложиться так, что возникнет дедлок. Но, как говорится, бережёного бог бережёт.
Пример:
void threadA() {
  ResetEvent(flag); // это асимметричная зависимость: очередь сообщений, сокет, условная переменная и т.п.
  Enter(mutex1);
  Enter(mutex2);
  Leave(mutex2);
  Leave(mutex1);
  SetEvent(flag);
}

void threadB() {
  WaitEvent(flag);
  Enter(mutex2);
  Enter(mutex1);
  Leave(mutex1);
  Leave(mutex2);
}

Как мы видим, два потока только делают вид, что готовы схватиться в клинче.

Во-вторых, оно может не давать полноценное покрытие кода — если тот чувствителен ко временной диаграмме.
volatile bool ready; // да, я знаю про неэффективность volatile, но это же псевдокод.
Some data;

void threadA() {
  while(!ready) {
    // возможно, в тестовом прогоне мы сюда просто никогда не попадём
    DoSomeIdleWork(); // с мьютексами и прочим добром
    Sleep(0);
  }
  Consume(data); // пусть там всё защищено и аккуратно
}

void threadB() {
  Sleep(rand());
  Produce(data);
  ready = true;
  if(rand()) // ещё один способ не попасть в сложное положение
    DoAnotherIdleWork(); // чтобы заклинило с DoSomeIdleWork
}

Но опять же, если проблема существует хоть на каком-то варианте развития событий, её там следует убрать, от греха подальше.

В-третьих, если в программе не глобальные ресурсы и мьютексы, а динамически развёртываемая туча активных объектов, то развитие событий может зависеть от внешних причин: от конфигурации, от содержимого файлов, от действий пользователя и т.п.
Поэтому одним прогоном не всегда обойтись. Нужны, хотя бы, тесткейсы.

Резюмирую:
— идея интересная и правильная
— но не является серебряной пулей, и хорошо бы ещё и в реальном времени ловить дедлоки

А, кстати!
Дедлоки возникают ведь не только на мьютексах, но и взаимном ожидании несимметричных объектов (очередей сообщений, семафоров в режиме producer-consumer), и на всяких RPC.
В принципе, метод их ловли примерно такой же: строится граф зависимостей…
Если вашу библиотеку можно дополнить поддержкой таких явлений, это будет вообще здорово.
(о) Иное. Современные технологии эффективны (и даже эффективнее человека) в экстремальных условиях, — но только в штатных экстремальных условиях. Но бывают нештатные условия, — которые не удалось предвидеть или не получается предотвратить.

Как, например, КЗ аккумуляторов в ТУ-154 в Ижме, после чего самолёт остался без электричества. Но пилоты вспомнили дедовский способ, и в качестве навигационного прибора использовали стакан с водой. Вот какая технология нальёт себе воды в стакан?

Или когда у самолёта отказала вся гидравлика, и пилотам пришлось изобрести, отработать и применить технику управления с помощью тяги двигателей, — потом этот метод был автоматизирован, но изобрели его всё-таки люди.
А не слишком ли дорого задействовать BGL для отслеживания циклов?
Критические секции ведь не зря называются критическими. А вмешательство во временную диаграмму может искажать картинку.

Тем более, граф там простейший: двудольный список.
Если мьютексы не создаются на лету, то даже ABA-проблемы не возникнет, как мне кажется, так что несложно lock-free реализацию сделать.
Если создаются, — то lock-based. Операции почти мгновенные, можно себе позволить; а глобальный мьютекс всегда лочится самым последним и очень ненадолго.

Я когда-то такой велосипед для себя делал, без BGL, но с кучей возможностей для отладки: там и имена файлов и функций фиксировались, и точки прерывания были — чтоб можно было в момент дедлока встать и проследить цепочку прямо по-живому, и замена дедлоков на ливлоки, чтобы дебаггер не плакался, что все потоки сидят в ядре.
А в википедию (тм) тоже ваши маркетологи написали?
Очень странно было увидеть в статье «Газовое пожарутушение» рекламу новтека, прямым текстом.
Другое важное свойство фторкетонов — крайне низкая растворимость в воде, которая не позволяет веществу пройти через клеточные мембраны в организм, т.е. обеспечивает их низкую токсичность и высокую теплоемкость паров, приводящую к активному охлаждению пламени и его тушению.

Нерастворимый в воде бензин — очень даже токсичен и прекрасно проникает через клеточные мембраны. Может, имелась в виду низкая жирорастворимость?
И каким образом нерастворимость в воде связана с теплоёмкостью паров?

И ещё, чтобы дважды не вставать: фторкетоны — это, всё-таки, физический агент (охладитель) или химический (ингибитор)? Если химический, то какие вещества получаются вследствие пиролиза? Надышаться каким-нибудь фторфосгеном — радости-то немного.
Warrant canary — это шахтёрская канарейка. Пока чирикает, всё в порядке. Как только сдохла — всем срочно валить из шахты.
Настоящие параноики пользуются эпилептической криптографией!
Хэш-ссылка — как человек, испорченный математикой, думал, что это хэш-функция, применённая к длинному урлу. Ну, типа, hel.lo/w0rLD123. И, только дочитав до href="#имя-секции", понял.

Не француз, конечно, с их калькой le mot diese в пику заимствованию hashtag, но хотелось бы что-то более благозвучное и, одновременно, понятное по-русски найти этой штуковине «hash url»
Ну а зачем использовать заведомо неблагозвучное словообразование.
Что, суффиксов на свете мало? Обязательно нужно было заимствованный из латыни взять? Так ведь и в латыни есть варианты.
Байхуанство, например, вместо байхуизма.

P.S.
Варенье из фейхоа — запомните, дети, — фейхОевое.
A propos: «пусть расцветают сто цветов, пусть соперничают сто школ» — это была прелюдия к «пусть змея высунет голову» господина Цинь Шихуанди, а потом и товарища Мао. В обоих случаях дело кончилось головотяпством.
А ещё был такой достаточно вонючий вирус Dark Avenger.
Правда, распознавался элементарно: создаёшь текстовый файл, переименовываешь в .exe, опаньки, а эвенджер уже в нём.
Кстати, о нём на хабре уже было: habrahabr.ru/post/74132/
А у меня когда-то была книжка Н.Безрукова по компьютерным вирусам, к ней на трёхдюймовой дискетке шли демоверсии всех популярных тогда вирусов. И янки-дудль там был, и всякая другая дребедень. Ну и собственно, аидстест и минус-вэ тоже прилагались. Такая вещ! Эх, пропала куда-то…
На картинке для привлечения внимания — пятидюймовые дискеты :)
С «кавычками» вокруг «имён собственных», пожалуй, перебор.
Лень было лезть в стандарты уточнять, проверил: сделал gcc --std=c++0x, он сожрал. Хотя, возможно, гусь просто немного опережает события, но обычно это опережение идёт как гнутые расширения: --std=gnu++0x
А это не только в баше — во многих языках операции and и or определены таким способом
def __and__ (x, y) :
  if x :
    return y
  else :
    return x

def __or__ (x, y) :
  if x :
    return x
  else :
    return y
</code>
Чуть-чуть имеет. Ибо колдунство и контринтуитивность: в промежуточной базе сигнатура виртуальной функции сокрыта, а в наследнике внезапно переопределена (а не введена новая такая же).
Это в нём повелось ещё с достандартной эпохи, т.е. до 98 года, — VC5 и моложе.
И, то ли их заломало переписывать этот участок компилятора, то ли оставили для совместимости, чтобы не переписывать MFC и прочее наследие.
Варнинг только добавили.

Информация

В рейтинге
1 808-й
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Зарегистрирован
Активность