Фибры души?

Тема в разделе "WASM.BEGINNERS", создана пользователем asmlamo, 13 май 2020.

  1. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.729
    Кроме потоков в винде есть еще Fiber (Волокна).
    Зачем они нужны и какой в них смысл ?
    С потоками понятно .. есть 8 ядер распаралелили на 8 потоков ..и профит.
    А фибры что дают на практике ?
     
    Последнее редактирование: 13 май 2020
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Переключение между фиберами - легковесная операция, в отличие от создания новых потоков или переключения между ними.
    Например, ты выполняешь некую асинхронную операцию (пусть будет чтение большого файла). Если поток может выполнять какую-то полезную работу в это время, ты можешь создать два фибера: в одном отдать команду на чтение, в другом - делать что-то постороннее, и переключаться на первый фибер для проверки, прочитался файл или нет. И всё это с минимальными накладными расходами.

    Ключевой момент: операции, выполняемые фиберами, должны быть асинхронными (не должны блокировать поток на время их выполнения), иначе на другой фибер ты переключиться не сможешь (т.е., например, делать в одном фибере Sleep, а в другом что-то ещё - нельзя).
     
    Mikl___ нравится это.
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    Я бы не был бы так в этом уверен))
     
  4. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.729
    В смысле ?
    Если задача хорощо паралелится то рост почти кратный.
     
  5. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    В прямом. То, что ты создал 8 потоков, не означает, что они все будут исполняться параллельно на всех 8 ядрах. Как шедулер решит, так они и будут исполняться. Есть там всякие аффинити маски и тд.
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    хорошо. а если у тебя 1024 потока?
     
  7. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Да, вообще, никаких проблем - покупаем себе 1024 ядерный проц, ну или ждем пока такие появятся в продаже. :)
     
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin,

    > Ключевой момент: операции, выполняемые фиберами, должны быть асинхронными

    Что за бред ?

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

    asmlamo,

    Это никакого отношения к многопоточности не имеет. Скорее подобие аппаратной многозадачности - переключений контекста. Устроено просто, когда создаётся фибер - создаётся новый стек и настраивается среда для дальнейших переключений контекста(в юзермод разумеется). Когда вызывается апи переключения, то текущий контекст потока переключается(те текущий выгружается в тлс(GPR), загружается связанный с фибером). Контекст это в основном стек, остальное врядле нужно. Это просто смена контекста, юзермод его части, главное стека.

    Смена стека и создаёт видимость нового потока, так как у каждого треда свой стек. Хитрый трюк. Есть один интересный нюанс - переключение стека на произвольный адрес не допустимо, это OP-атака и такое прибивает ядро, проверяя базу стека которая была при инит треда. Этот механизм позволяет это легально обойти :yes:

    В дий(юзер визор) не использовалось переключение стека именно из за защиты, он смещался вниз. Думаю нужно для транслятора использовать именно эту фишку с фиберами. Хотя с другой стороны не встречал семплов которые чексумму снимают со всего стека.
     
  9. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.729
    Тут фибры не помогут !
     
  10. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Что значит "не могут"? Кто помешает вызвать асинхронное чтение из одного фибера, переключиться на другой, затем обратно - и получить прочитанный буфер? Чем это отличается от асинхронного чтения в одном потоке?

    Асинхронный (overlapped) ReadFile вернёт управление сразу же, и ты свободно можешь переключиться на другой фибер, пока в фоне читается файл.
     
    Rel и TermoSINteZ нравится это.
  11. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.242
    Вот это новости, стало быть эти ваши Ерланги и Нодеджэсы на чистой магии работают.
     
  12. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    фибры - это уже артефакт, юзайте тредпулы и да пребудет с вами будда
     
  13. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.422
    Адрес:
    Россия, Нижний Новгород
    Это мы ещё до UMS-потоков не добрались
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin,

    Блоки кода последовательно выполняются в одном потоке, а значит синхронно для фиберов одного треда. Асинхронно было бы для двух потоков. Ядерная апи которая сама по себе асинхронна к теме отношения не имеет. Даже если это синхрон IO, то для фидеров одного потока вызовы будут последовательны, какая разница синхрон или нет.
     
    UbIvItS нравится это.