Механизмы синхронизации в операционных системах

50 оттенков синхронизации потоков и процессов в операционных системах
#МГТУ кафедра ИУ9
#operatingsystem #операционнаясистема

Пікірлер: 131

  • @saitaro
    @saitaro2 ай бұрын

    Алексей Владимирович моргает в отдельных потоках.

  • @u2bear377

    @u2bear377

    2 ай бұрын

    Теперь надо присмотреться, одновременно ли моргают оба глаза.

  • @lycan9590
    @lycan959023 күн бұрын

    Мощь и трепет!!!! Мое почтение и преклонение. Очень крутой чел!!!

  • @nikzav211
    @nikzav21112 күн бұрын

    Мне скоро экзамен по ОС сдавать. Спасибо вам большое, очень доступно объяснете!)

  • @Lazarforce
    @Lazarforce2 ай бұрын

    Подскажите, после Оппенгеймера какой следующий фильм будете снимать?

  • @user-rg8pt1kk4i
    @user-rg8pt1kk4i2 ай бұрын

    Случайно наткнулся на один из роликов с данного канала месяц назад, теперь смотрю каждый выпуск в свободное от работы время с огромным удовольствием несмотря на то, что каждый день работаю с кодом. Базы много не бывает, ребята, а с такой подачей материала так вообще красота, подогревает интерес к любимому делу. Спасибо вам огромное за ваш труд!

  • @Dr33mway
    @Dr33mway2 ай бұрын

    Вот уже с примерами кода, это прям в разы интереснее! 👍

  • @bdick8136
    @bdick81362 ай бұрын

    Автору можно верить. У него такие же фингалы под глазами от загара перед монитором как и у меня.

  • @Sky-pg8ot

    @Sky-pg8ot

    2 ай бұрын

    Там кожа истоничилась, глаза много напрягает, зрение плохое, тёр много

  • @Dimoniada
    @Dimoniada2 ай бұрын

    Насколько помню, в Pascal/Delphi/C++Builder-е тот же самый Motitor под капотом synchronized(), т.е. как и в С#. Пауза в конце как всегда на высоте, спасибо!)

  • @user-jx8zx8uk2m
    @user-jx8zx8uk2m2 ай бұрын

    KZread плохого не посоветует. Если показывает в 4 ночи в рекомендованных, значит надо смотреть :)

  • @SuperArt1st
    @SuperArt1st2 ай бұрын

    Съезд любителей поездов и железных дорог объявляется открытым! Have a railbuff!

  • @golosbezdoka
    @golosbezdoka2 ай бұрын

    Кликнул случайно. Офигел от качества. Подписался))

  • @3955006
    @39550062 ай бұрын

    Человек снял весь материал за один дубль, потом нарезал и выкладывает нам по одному видосу ))

  • @artemzakharov8961

    @artemzakharov8961

    2 ай бұрын

    Так это нормальная практика)

  • @ghaydn

    @ghaydn

    2 ай бұрын

    И за всё это время ни разу не моргнул.

  • @jordanmessi1
    @jordanmessi12 ай бұрын

    Очень доступно и не нудно. Спасибо за полезный контент!

  • @TimLaizaR228
    @TimLaizaR2282 ай бұрын

    В шарпе так же существует слово lock, которое является сахаром для монитора, прям как synchronized в жабе. В примере можно было например написать так: lock(cm) { counter++; }

  • @user-fw3kx2ix3p
    @user-fw3kx2ix3p2 ай бұрын

    Это база. Благодарю. Лайк и комментарий для поддержки и продвижения канала!

  • @madplayer5
    @madplayer52 ай бұрын

    Очень интересно. Надеюсь что когда-нибудь смогу это понять.

  • @user-xz9se8mr8s
    @user-xz9se8mr8sАй бұрын

    Чел мега хорош, продолжай пожалуйста. Это просто бомба! Очень круто и качественно объясняешь на тем более в ру сегменте

  • @sterd0
    @sterd02 ай бұрын

    Отлично, выпуск ждал. Вот реально интересно.

  • @TheMrGlobus
    @TheMrGlobus2 ай бұрын

    Спасибо за лекцию. Очень классно и познавательно. Теперь я знаю немного больше и больше понимаю как это всё работает.

  • @artemzakharov8961
    @artemzakharov89612 ай бұрын

    Огромное спасибо Вам за эти видео! Я Java-разработчик, который сам учил программирование с 0, сейчас вот собираюсь поступать в магистратуру на Computer Science и вы невероятно помогаете освоить материалы!

  • @freestylerveevo

    @freestylerveevo

    2 ай бұрын

    привет, по каким материалам учился сам? или все так же с нуля (ютубы, stepik, metaint какой-нибудь)? 😊

  • @artemzakharov8961

    @artemzakharov8961

    2 ай бұрын

    @@freestylerveevo привет! Я читал книгу Хорцмана "Java. Библиотека профессионала", смотрел Ютуб видео в самом начале, а когда стал крепче понимать прочитал Блинова "Java методы программирования" (она уже есть новая с Java 17 если не ошибаюсь)

  • @justcurious1397
    @justcurious13972 ай бұрын

    Превьюха космос)

  • @Andrew_Shadrin
    @Andrew_Shadrin2 ай бұрын

    Много слышал о необходимой осторожности при применении общих переменных, теперь понял суть. Спасибо!

  • @user-fi2vo5rg7y
    @user-fi2vo5rg7y2 ай бұрын

    "Необходимо и достаточно". Чистые данные. Спасибо автору!

  • @AlexAlex-jk2tn
    @AlexAlex-jk2tn2 ай бұрын

    Спасибо за видео, долго просидел над примером и не мог понять где ошибка. Я не разработчик С#, я разработчик С++ и конечно бы использовал std::atomic переменные, собственно я не смог найти ошибку, но в конце когда вы объяснили в чём ошибка, я понял, как я её избежал правильно используя C++.

  • @MrCter
    @MrCter2 ай бұрын

    динамические превьюшки к видео 😊 как мило... син-хро-ни.... 🙃 син-за-хро-ци-ни-я 😏

  • @dimontools
    @dimontools2 ай бұрын

    Огромное спасибо за видео! Очень интересно ❤

  • @artorios5192
    @artorios51922 ай бұрын

    Большое спасибо! Очень интересно и полезно) Буду пересматривать)

  • @alexlm2598
    @alexlm25982 ай бұрын

    в том примере что Вы в начале показали, со счетчиком, это не Race condition, а Data race. Разница в том что сделав операцию инкремента счетчика атомарной мы эту проблему решим, а при Race condition так не получится. Например если бы мы не инкрементили счетчик, а в каждом потоке присваивали ему некое значение, то даже защитив счетчик мютексом была бы недетерминированность из за того что неясно в какой очередности отработают потоки. Советую читать англоязычную Википедию, там это все достаточно подробно описано, зато в русской пол статьи про то как американцы налажали с этим Тераком))) А так спасибо за ролики, очень познавательно

  • @abragin

    @abragin

    2 ай бұрын

    Кстати про Терак, на самом деле 99% рассказчиков повторяют одно и тоже про пользовательскую сторону проблемы (ввели X, стёрли, ввели E, и т.п.) и отсутствие аппаратных интерлоков, а вот информацию конкретно про саму операционку, которая там работала, и про сами ошибки мне удалось найти только в официальных отчётах и немногочисленных других документах.

  • @abragin

    @abragin

    2 ай бұрын

    Про data race несомненно верно!

  • @user-mz2zb9cq9s
    @user-mz2zb9cq9s2 ай бұрын

    Классная видяшка. Нормально так знаний насыпали.

  • @dimakof
    @dimakof2 ай бұрын

    Замечательные ролики

  • @user-sz3fo3yc7g
    @user-sz3fo3yc7g2 ай бұрын

    Молоток!! Давай еще!!! Контент в кайф! Дельно.

  • @wasd6461
    @wasd64612 ай бұрын

    я один всё время смотрел на цветные треугольники в мониторе сзади ?

  • @u2bear377

    @u2bear377

    2 ай бұрын

    Кстати, да, отвлекают.

  • @MotorBorg
    @MotorBorg2 ай бұрын

    Лучший клбеикйт, что я видел!

  • @melkiy582

    @melkiy582

    2 ай бұрын

    Согласен

  • @xikkn
    @xikkn2 ай бұрын

    продолжай, интересно слушать тебя, автор

  • @danielmilyutin9914
    @danielmilyutin99142 ай бұрын

    Привет ИУ от ФН! В С++ есть lock_guard (их там несколько). Они помогают захватить ресурс один раз и отпускают его автоматически при выходе из блока. Принцип известный как RAII - resource aquisition is initialization. Поэтому не надо бояться забыть V. С точки зрения художественной. Я бы в начало и в конец добавил "Здравствуйте!" и "До встречи!". А то видео кончилось просто внезапными 3 секундами молчания.

  • @johnjohnson8818

    @johnjohnson8818

    2 ай бұрын

    Это его фишечка.

  • @Eustrop
    @Eustrop2 ай бұрын

    Интересно. Но я в этой теме ожидал в конце описания синхронизации между unix процессами через операции с файловой системой. Ну, чтобы показать, как в реальном мире приходится выкручиваться ;) P.S. За PDP-11 - отдельное спасибо! Сентиментальная слеза Катилась По Его Щеке.. 2024-03-29 10:38 UTC алгоритмам

  • @mndtr0
    @mndtr02 ай бұрын

    Вы, как человек, знающий низкоуровневые основы программирования, можете ли сказать что-то по поводу развития ИИ, и может ли он в будущем заменить разработчиков?

  • @abragin

    @abragin

    2 ай бұрын

    Тут не получится сказать "да" или "нет". Во-первых, смотря насколько далёкое будущее. Во-вторых, смотря каких разработчиков. Быдлокодеров можно заменить хоть сейчас. А стоит задать ChatGPT нешаблонное задание, и оно ничего не сделает путного. Попробуйте попросить его написать парсер CSS на C# без использования сторонних библиотек. Будет ходить вокруг да около, предлагая классы с методами-заглушками. Тоже самое и с разработчиками. Те, кто способен делать нестандартные решения будут всегда нужны.

  • @mndtr0

    @mndtr0

    2 ай бұрын

    ​@@abragin спасибо за ответ! Почему я спросил: на англоязычных форумах, посвящённых программированию, на реддите все время спрашивают про это и опасаются, а я, как студент IT направления, вследствие этого тоже стал задаваться таким вопросом и даже раздумывать "а там ли я учусь, хоть мне и нравится моё направление"

  • @ARLX-yo1wr
    @ARLX-yo1wr2 ай бұрын

    Класс!

  • @Kolemag
    @Kolemag2 ай бұрын

    Вот прям Factorio со своим дискретным принципом

  • @azerqgaming
    @azerqgaming2 ай бұрын

    Спасибо за объяснение на языке c#, пробовал до этого Java, но .net мне больше понравился, сколько туда сейчас фишек завезли)

  • @non5309
    @non5309Ай бұрын

    ставь лайк, если пришел с курса по многопоточному программированию!

  • @skybladeby
    @skybladeby2 ай бұрын

    Этот взгляд в конце как бы говорит мне, что стоит вот такими штуками заниматься, а не тратить жизнь на ерунду :)

  • @ilovebobrov88
    @ilovebobrov882 ай бұрын

    Вы прям по темам книжки Танненбаума по ОСям идете))

  • @broken_beyond_belief

    @broken_beyond_belief

    2 ай бұрын

    разве что танембаум показывает примеры на линуксовых pthread'ах на языке С. в видео примеры с кодом получше, но это имхо

  • @Lhander07
    @Lhander072 ай бұрын

    Отличное видео! Привет с РК6)

  • @abragin

    @abragin

    2 ай бұрын

    Оо, РК! )

  • @rkc137
    @rkc1372 ай бұрын

    куда делся флаг реактоса с фона 😭😭😭😭

  • @BeDb_MeDb
    @BeDb_MeDb2 ай бұрын

    Блин, круто)

  • @mobilafilm
    @mobilafilm2 ай бұрын

    Супер

  • @TheMicstep
    @TheMicstep2 ай бұрын

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

  • @abragin

    @abragin

    2 ай бұрын

    Напортачили, в общем

  • @YouSitePro
    @YouSitePro2 ай бұрын

    В превью можно было написать СИН ЗА ХРО ЦИ НИ Я :D

  • @abragin

    @abragin

    2 ай бұрын

    Отличная идея, пробую!

  • @MSaidu-sj6vx

    @MSaidu-sj6vx

    2 ай бұрын

    О! Название для метода подсказал!

  • @u2bear377

    @u2bear377

    2 ай бұрын

    Звучит как название живого организма. "Cинзахроциния многопоточная"

  • @BeDb_MeDb
    @BeDb_MeDb2 ай бұрын

    Кстати, не знаю как в C#, но вообще есть еще всякие atomic-типы/классы. Где-то гарантируется атомарное чтение/присвоение, а где-то даже простенькие операции. Но наверное да, это уже сахар всякий...

  • @AEF23C20
    @AEF23C202 ай бұрын

    в конце видосика про тред-берриер это не всегда так можно заюзать глобальную переменную в конце метода, а она volatile и фиг компилятор [и процессор] в методе чего переставит, но есть нюансы в интеле работает [и тоже есть нюансы, но их мало] а на авна-арме не работает [нюансов нет, на арме вменяемо ничего не работает, это же арм]

  • @dr1n
    @dr1n2 ай бұрын

    Выходит, что примитивы синхронизации в ОС используют активное ожидание? Т.е нагружают процессор проверкой флага? Есть ли механизм синхронизации основанный на планировщике потоков, например, поток не получает процессорного времени пока не получит сигнал, что можно входить в критическую секцию. Тем самым не нагружая процессор?

  • @tree-service
    @tree-service2 ай бұрын

    А если вместо монитора lock использовать?он тоже требует обьекта, коим каунтер не является, но можно создать произвольный объект в чем отличие от монитора?и как реализованы блокировки на субд,и если ли разница в операционных системах например мсскуэль на виндовс и на линукс и зависят ли от железа?

  • @Ssilki_V_Profile
    @Ssilki_V_Profile2 ай бұрын

    Удивило то, что в начале видео вы... специально моргнули. Отладка модуля имитации бессознательных людских рефлексов идёт своим чередом). Пауза в конце была коротковата на мой взгляд.

  • @jopawhand3190
    @jopawhand31902 ай бұрын

    а вы лекции не будете выкладывать больше? интересно про архитектуру NT узнать

  • @abragin

    @abragin

    2 ай бұрын

    Планирую ещё много

  • @semenkovalev4988
    @semenkovalev49882 ай бұрын

    А volitile поставить для переменных, которые используются в нескольких потоках? Оно же автоматически memory barrier создает и не дает кэш пробить. В данном примере, скорее всего пробитие кэша не сыграет, но в реальных случаях вполне. Про lock вместо голого Monitor тут уже писали.

  • @abragin

    @abragin

    2 ай бұрын

    Да, пойдёт! Надо было мне про этот способ сказать 😊

  • @bdick8136

    @bdick8136

    2 ай бұрын

    @@abraginЯ не особо знаком с C#, но в C++ volatile всего лишь говорит компилятору(процессору) читать данные из памяти, а не из кэшей. Это полезно для memory mapped io. Во многопотоке все равно нужны барьеры, т.к. никто не мешает другому потоку наломать дров так как volatile не делает доступ к этой переменной атомарной. В общем я бы эту глупость не рекомендовал юзать.

  • @artemzakharov8961

    @artemzakharov8961

    2 ай бұрын

    @@bdick8136 Скорее всего завсисит от платформы, потому что в Java volatile даёт доступ напрямую из памяти процессора + ставит баръер

  • @RusLSystems
    @RusLSystems2 ай бұрын

    В многопотоке всегда использую флаг проверки выполнения, причем в зависимости от задачи может быть как bool, так и int с указанием конкретного этапа. В некоторых ситуациях приходится использовать "по обе стороны".

  • @abragin

    @abragin

    2 ай бұрын

    А что значит флаг проверки выполнения?

  • @RusLSystems

    @RusLSystems

    2 ай бұрын

    @@abragin Выделение любой переменной для конкретной задачи под операционку, либо reg - регистр для программирования непосредственно в железе.

  • @baltasar9547
    @baltasar95472 ай бұрын

    Ух ты, про MemoryBarrier не подозревал, а это, оказывается важная штука, лайк

  • @999poll
    @999poll2 ай бұрын

    Кажется я только что понял, что означает страшное слово "прерывания"

  • @user-hp7pc3lv3v
    @user-hp7pc3lv3v2 ай бұрын

    Огонь. Но моргайте хоть иногда.

  • @tart_meidep

    @tart_meidep

    2 ай бұрын

    все-так он человек. моргнул на 8:15

  • @mikhaililin3033
    @mikhaililin30332 ай бұрын

    Спасибо автору, очень интересный контент и хорошая подача, но возникла пара вопросов; Может ли возникнуть ситуация в которой несколько потоков ждущих разлок мутекса/семафора/другого примитива одновременно преодолеть вайл когда это произойдет? Они ведь вроде как друг от друга не зависят. И ещё, у всех примитивов в недостатках упоминается активное ожидание, значит есть варианты как без него обойтись и просто в видео нет?

  • @abragin

    @abragin

    2 ай бұрын

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

  • @gooseob
    @gooseobАй бұрын

    я только щас заметил что на превьюшке написано синзахроциния)

  • @user-sv3dc5nz8w
    @user-sv3dc5nz8w2 ай бұрын

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

  • @abragin

    @abragin

    2 ай бұрын

    Совершенно верно!

  • @homka122
    @homka1222 ай бұрын

    А не подскажите, пожалуйста, как вы добились этого эффекта на 4:48? Очень интересно выглядит. Что это за софт?

  • @abragin

    @abragin

    2 ай бұрын

    cool-retro-term, там куча различных настроек, можно по вкусу настраивать

  • @homka122

    @homka122

    2 ай бұрын

    @@abragin спасибо большое!

  • @awwarez
    @awwarez2 ай бұрын

    Смотрю на некоторые алгоритмы и думаю, бедный процессор. Я бы применял бы эти локи, но в купе с паттерном Unit Of Work. Я понимаю что увеличение переменной на 1 из 2 потоков это абстрактный пример, но можно было бы увеличивать локальную переменную в потоке на 1, а каждые 100 итераций брать блокировку и увеличивать разделяемый ресурс на эту локальную переменную. После чего её сбрасывать, отпускать блокировку и продолжать.

  • @abragin

    @abragin

    2 ай бұрын

    Ну тут как в анекдоте, что плац лучше метлой подметать, но поставлена задача сделать это зубной щёткой

  • @evgur4
    @evgur42 ай бұрын

    Спасибо очень понятно объясняете , но я походу туповат и под конец уже потерял нить повествования😅

  • @jopa19991
    @jopa199912 ай бұрын

    Ну на представленном примере монитор так себе освобождает от ошибок типа "забыл отпустить мьютекс" :) Всё равно нужно написать enter и leave. Тут скорее подошёл бы пример с C++ным unique_lock/scoped_lock

  • @semenkovalev4988

    @semenkovalev4988

    2 ай бұрын

    Согласен. В C# Monitor редко используется напрямую, как раз из-за возможных ошибок, описанных в видео. Для блокировки используется оператор lock, который содержит внутри себя перехват исключений и освобождает монитор в секции finally.

  • @Vorono4ka
    @Vorono4ka2 ай бұрын

    Очень, нет. ОЧЕНЬ крутое видео!

  • @abragin

    @abragin

    2 ай бұрын

    Спасибо 😀

  • @UchebavGermanii
    @UchebavGermanii2 ай бұрын

    Отличное видео и объяснение. Думал, что пример на C++, тк counter++; и хотел спросить зачем потоки стартовать, тк в STL C++ потоки стартуются сами в конструкторе после создания, но потом понял, что это C#😊

  • @Typeofundefined-mq8pj
    @Typeofundefined-mq8pj2 ай бұрын

    А зачем нужна атомарность если на момент когда мы начнем взаимодействие с ресурсом спинлок уже будет установлен?

  • @albion_faults
    @albion_faults2 ай бұрын

    Подписался, очень круто

  • @xibodohls9469
    @xibodohls94692 ай бұрын

    Много неточностей. Например, что мешает забыть вызвать Monitor.Exit() в примере? Еще порядок исполнения инструкций меняет не только компилятор, но и процессор. Про работу памяти вообще ничего не сказано - пишем в одном потоке, когда запись видно в другом?

  • @abragin

    @abragin

    2 ай бұрын

    Про забыть вызвать - верно, это я про поддержку ключевых слов synchronized и lock имел в виду, а пример показал с явным вызовом. Про процессор так и сказал же: "а современные процессоры и среды выполнения типа dotnet..." 12:18. У потоков одно адресное пространство, когда пишем, тогда и видно.

  • @xibodohls9469

    @xibodohls9469

    2 ай бұрын

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

  • @sheffield85rus
    @sheffield85rus2 ай бұрын

    Скажите, ну похож ведь на Алекса Мёрфи из Робокопа?

  • @vechnonedovolen666
    @vechnonedovolen6662 ай бұрын

    Как правильно пишется этот 1:43 медицинский аппарат ?

  • @abragin

    @abragin

    2 ай бұрын

    Therac-25

  • @brothers_pilots
    @brothers_pilots2 ай бұрын

    Почему, объясните мне почему. Я попадаюсь на это видео 3 раз, и тема мне интересна, все окей, но почему я читаю название как "мемы синхронизации..."

  • @user-ch1df4fs8p
    @user-ch1df4fs8p2 ай бұрын

    "непонятные ошибки решаются непонятными методами"

  • @user-fu9ix6xh7x
    @user-fu9ix6xh7x2 ай бұрын

    я в этом ни чего не понимаю но то что вы говорите чтото понимаю продолжение дорлжно не минуемо следовать

  • @user-si3vc8my8t
    @user-si3vc8my8t2 ай бұрын

    Класс! но звук "пш-пш"... напрягает...

  • @abragin

    @abragin

    2 ай бұрын

    Что за звук? Скажите таймкод послушать

  • @user-si3vc8my8t

    @user-si3vc8my8t

    2 ай бұрын

    @@abragin весь ролик... шипящие свистящие прут)

  • @TheMicstep
    @TheMicstep2 ай бұрын

    Автор ты не думал озвучивать антагонистов в фильмах?

  • @abragin

    @abragin

    2 ай бұрын

    Мне протагонисты больше нравятся

  • @leonardodavinci3737
    @leonardodavinci37372 ай бұрын

    Джек Степлтон?!

  • @krotov_play
    @krotov_play2 ай бұрын

    Походу надо удалять весь мой код, и писать всё ядро с \0.

  • @user-ly6sv1zj7b
    @user-ly6sv1zj7b2 ай бұрын

    Хорошо быть роботом

  • @abragin

    @abragin

    2 ай бұрын

    Мне тоже нравится

  • @AEF23C20
    @AEF23C202 ай бұрын

    ээээ... друзья! автор главного не сказал) это у автора уже предельная проф.деформация поток - это такая штука, за которой следить не нужно поток сделал что либо - и должен закрыться, всё! и поток не должен использовать разделяемые ресурсы, что бы это не значило

  • @user-zd7oi5ko1b
    @user-zd7oi5ko1b2 ай бұрын

    а asinc await в си нет? чё-т какой-то примитивный язык для программирования медицинского оборудования (шутка, я знаю, что сама операционка написана на си) :)

  • @pompei2
    @pompei22 ай бұрын

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

  • @u2bear377

    @u2bear377

    2 ай бұрын

    Это не работает прямо вот так "в лоб", на уровне букв. Приведённый текcт получилcя практичеcки нечитаемым.

  • @kykyshka138
    @kykyshka1382 ай бұрын

    Это всё хорошо, но очень старые подходы. Вот аккурат 60-х годов прошлого века. В окно смотрели? Там 2024 год уже. Синхронизацию данных в потоках так никто уже не делает лет 15 - 20.

  • @abragin

    @abragin

    2 ай бұрын

    Так расскажите нам, как надо)

  • @Gengzu
    @Gengzu2 ай бұрын

    С таким голосом невозможно слушать

  • @vladislove1337
    @vladislove13372 ай бұрын

    Если бы G-Man был программистом: