Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Давайте все заблокируем

Давайте все заблокируем

Очевидности про потоки :)

Polina Gurtovaya

June 16, 2023
Tweet

More Decks by Polina Gurtovaya

Other Decks in Programming

Transcript

  1. Очень плохо блокировать основной поток! • Все анимации замирают •

    Кнопочки не нажимаются • Запросы не уходят 🙀 2
  2. 4

  3. 5

  4. 8 Concurrency – есть несколько задач, они выполняются Parallelism –

    есть несколько задач, они одновременно выполняются
  5. Потоки и процессы • ОS ставит таймер • Срабатывает таймер

    - генерируется прерывание • Выполняются другие команды • Что выполняется решает планировщик OS • IO – тоже прерывание 10
  6. Как общаются процессы? • Пошарить ресурс • Пошарить память •

    Послать сигнал • Естественно это все обернуто в 10 оберток :) 12
  7. Физические и зеленые потоки • OS может создавать процессы и

    потоки. Их называют физическими • Runtime вашего языка, тоже может создавать потоки • 1 Runtime thread : 1 Physical thread • N Rutnime threads: M Physical threads – green 15
  8. Multi-process application • Каждая вкладка заботливо упакована в свой процесс

    (rendering process) • Есть основной процесс с которым общаются вкладочки • В каждом rendering - process есть несколько потоков 18
  9. Все очень безопасно и сложно Браузер должен предоставлять гарантии того

    что злобный код с одной странички не начнет портить другие. Для этого есть куча политик, CSP, Same Origin Policy и все в этом духе. Посадить сайт в песочницу не только сложно но и затратно по ресурсам. Прибавьте к этому существование iframe и браузерных расширений. 22
  10. Rendering процесс • Там все в прошлом докладе уже рассказали

    :) • Чем же занимается Rendering процесс – Практически всем! 23
  11. -> разбираем и собираем • Распарсить • Вырастить дерево (DOM)

    • Разобрать CSS • Подружить CSS в DOM (привязать правила к узлу) • Нарисовать красивое -> 24
  12. -> строим красивое • layout - разместить элементы на странице

    • pre-paint • paint - сгенерировать структуры для рисования • commit - отправить в compositor • layerize - попилить на слои 25
  13. -> рисуем красивое • rasterize - распилить на клетки •

    activate - собрать frame • aggregate - собрать все frames • рисование тяжелый процесс, поэтому он выполняется параллельно в отдельном GPU- процессе. Команды кушает Skia 26
  14. 30

  15. 31

  16. 33

  17. Но хочется же параллельно! • WebWorkers - системный поток внутри

    rendering- процесса • Внутри инициализируется JS движок (Isolate) 35
  18. 36 // main thread const array = new Float32Array(1000 **

    100000).fill(Math.random()) const worker = new Worker(new URL('./workerScript.ts', import.meta.url)) worker.onmessage = e => { if (e.data === 'ready') { console.log('worker is ready') worker.postMessage(array) console.log(array) // transferable! worker.postMessage(array, [array.buffer]) console.log(array) } else { setSum(e.data) } } // worker thread postMessage('ready') onmessage = function (event) { const data = event.data const result = data.reduce((acc: number, item: number) => acc + item, 0) postMessage(result) } export {}
  19. 38 // main thread const array = new Float32Array(1000 **

    100000).fill(Math.random()) const worker = new Worker(new URL('./workerScript.ts', import.meta.url)) worker.onmessage = e => { if (e.data === 'ready') { console.log('worker is ready') worker.postMessage(array) console.log(array) // transferable! worker.postMessage(array, [array.buffer]) console.log(array) } else { setSum(e.data) } }
  20. Так значит можно надолго блокировать основной поток? • Блокируется не

    все • Сначала измеряйте, потом оптимизируйте • Проанализируйте ваш алгоритм • Берите пример с браузера 42