Bloomberg: Apple показала AR/VR-гарнитуру на последнем совете директоров
– Члена СД представили новую гарнитуру смешанной реальности
– AR/VR-гарнитуру показали составу из 8 независимых директоров
– Также Apple направила больше ресурсов на разработку rOS
– Предполагается, что так может называться ОС для гарнитуры
– Дебют нового продукта может состояться в ближайшие месяцы
– Старт продаж нового устройства запланирован на 2023 год
– На бизнес по продаже девайсов приходится 80% выручки Apple
– Члена СД представили новую гарнитуру смешанной реальности
– AR/VR-гарнитуру показали составу из 8 независимых директоров
– Также Apple направила больше ресурсов на разработку rOS
– Предполагается, что так может называться ОС для гарнитуры
– Дебют нового продукта может состояться в ближайшие месяцы
– Старт продаж нового устройства запланирован на 2023 год
– На бизнес по продаже девайсов приходится 80% выручки Apple
Bloomberg.com
Apple Shows AR/VR Headset to Board in Sign of Progress on Key Project
Apple Inc. executives previewed its upcoming mixed-reality headset to the company’s board last week, indicating that development of the device has reached an advanced stage, according to people with knowledge of the matter.
🔥6👍1
Многопоточность: Процесс и Поток
Многопоточка входит в блок обязательных вопросов. По мне он самый сложный из всех. Я сам могу путаться. Сейчас подтягиваю и углубляю знания. Начну с общей теории и перейду в глубь.
И начнем с самой базы.
Process выполняет действия, указанные в памяти программы. ОС помогает создавать, планировать и завершать процессы, используемые процессором.
Thread — небольшой фрагмент процесса. Процесс может иметь несколько потоков, и все они выполняются одновременно.
Ключевые отличия:
- Процесс — это выполнение программы
- Поток — это часть процесса.
- Процессы не легковесные, тогда как потоки легки.
- Для создания и завершения процесса нужно больше времени, а для потока — меньше.
- Процессу требуется больше времени для переключения контекста
- Процессы изолированы и не делятся данными между собой, а потоки делятся
- Потоки совместно используют инструкции, глобальные области и области кучи. Однако у него есть свой регистр и стек.
Многопоточка входит в блок обязательных вопросов. По мне он самый сложный из всех. Я сам могу путаться. Сейчас подтягиваю и углубляю знания. Начну с общей теории и перейду в глубь.
И начнем с самой базы.
Process выполняет действия, указанные в памяти программы. ОС помогает создавать, планировать и завершать процессы, используемые процессором.
Thread — небольшой фрагмент процесса. Процесс может иметь несколько потоков, и все они выполняются одновременно.
Ключевые отличия:
- Процесс — это выполнение программы
- Поток — это часть процесса.
- Процессы не легковесные, тогда как потоки легки.
- Для создания и завершения процесса нужно больше времени, а для потока — меньше.
- Процессу требуется больше времени для переключения контекста
- Процессы изолированы и не делятся данными между собой, а потоки делятся
- Потоки совместно используют инструкции, глобальные области и области кучи. Однако у него есть свой регистр и стек.
🔥15
Многопоточность: Конкурентность и Параллелизм
Мы уже знаем о процессе и потоке.
Процесс выделяется на одно ядро, а поток — это маленькие фрагменты нашего процесса
Но как назвать мультизадачность и мультипоточность? Ответ — Конкурентность и Параллелизм. Их часто путаем между собой, поэтому стоит определиться.
Конкурентность - это возможность разбивать алгоритм или компьютерную программу на отдельные блоки, которые могут выполняться независимо и коммуницировать между собой. Конкурентность может быть на одном ядре и будет казаться, что все выполняется одновременно.
Представим что вы пишите код и слушаете музыку, работая на одноядерном процессоре. На уровне операционной системы, эти задачи разбиваются на отдельные блоки, которые выполняются процессором по очереди, а переключение между этими блоками происходит настолько быстро, что создается впечатление, будь-то эти процессы выполняются одновременно. Однако это не так.
Конкурентность - это способность компьютера справляться с множеством задач одновременно, в то время как параллелизм - способность компьютера выполнять несколько задач одновременно. Это про то, как мы структурируем логику выполнения программы, как мы делим ее на логические блоки, которые могут выполняться параллельно или поочередно.
Параллелизм — это одновременное выполнение разных частей одной задачи. Параллелизм требует многоядерный процессор. Многоядерный процессор способен обрабатывать несколько инструкций в единицу времени, по одной инструкции на ядро. Соответственно, многоядерные процессоры умеют выполнять несколько задач одновременно, за счет чего достигается параллелизм.
https://www.youtube.com/watch?v=oV9rvDllKEg
Мы уже знаем о процессе и потоке.
Процесс выделяется на одно ядро, а поток — это маленькие фрагменты нашего процесса
Но как назвать мультизадачность и мультипоточность? Ответ — Конкурентность и Параллелизм. Их часто путаем между собой, поэтому стоит определиться.
Конкурентность - это возможность разбивать алгоритм или компьютерную программу на отдельные блоки, которые могут выполняться независимо и коммуницировать между собой. Конкурентность может быть на одном ядре и будет казаться, что все выполняется одновременно.
Представим что вы пишите код и слушаете музыку, работая на одноядерном процессоре. На уровне операционной системы, эти задачи разбиваются на отдельные блоки, которые выполняются процессором по очереди, а переключение между этими блоками происходит настолько быстро, что создается впечатление, будь-то эти процессы выполняются одновременно. Однако это не так.
Конкурентность - это способность компьютера справляться с множеством задач одновременно, в то время как параллелизм - способность компьютера выполнять несколько задач одновременно. Это про то, как мы структурируем логику выполнения программы, как мы делим ее на логические блоки, которые могут выполняться параллельно или поочередно.
Параллелизм — это одновременное выполнение разных частей одной задачи. Параллелизм требует многоядерный процессор. Многоядерный процессор способен обрабатывать несколько инструкций в единицу времени, по одной инструкции на ядро. Соответственно, многоядерные процессоры умеют выполнять несколько задач одновременно, за счет чего достигается параллелизм.
https://www.youtube.com/watch?v=oV9rvDllKEg
YouTube
Concurrency is not Parallelism by Rob Pike
Slides:
https://talks.golang.org/2012/waza.slide
https://talks.golang.org/2012/waza.slide
🔥8
Что выведется в консоли?
Anonymous Quiz
7%
200002
2%
20002
10%
200000
11%
0
56%
Ответ всегда будет разный
15%
Будет ошибка
🤔6😁5💩5
Самый распространенный вопрос от новичков: "А должен ли я учить swiftUI?".
Очевидный спойлер: Нам нужно учить и то, и другое
https://www.hackingwithswift.com/quick-start/swiftui/answering-the-big-question-should-you-learn-swiftui-uikit-or-both
Очевидный спойлер: Нам нужно учить и то, и другое
https://www.hackingwithswift.com/quick-start/swiftui/answering-the-big-question-should-you-learn-swiftui-uikit-or-both
Hacking with Swift
Answering the big question: should you learn SwiftUI, UIKit, or both? - a free SwiftUI by Example tutorial
Learn Swift coding for iOS with these free tutorials
👍1
Проблемы многопоточки: Race Condition vs Data Race
Как все знают многопоточка нужна для ускорения задач и их фрагментов на устройствах. Но все не так просто и любой инструмент дает свои проблемы. Выше, в опросе, мы уже столкнулись с гонкой.
Race condition и data race — две разные проблемы многопоточности, которые часто путают.
Эти проблемы очень похожи, но есть различия:
Race Condition — это недостаток, возникающий, когда время или порядок событий влияют на правильность программы.
Data Race — это состояние когда разные потоки обращаются к одной ячейке памяти без какой-либо синхронизации и как минимум один из потоков осуществляет запись.
Как все знают многопоточка нужна для ускорения задач и их фрагментов на устройствах. Но все не так просто и любой инструмент дает свои проблемы. Выше, в опросе, мы уже столкнулись с гонкой.
Race condition и data race — две разные проблемы многопоточности, которые часто путают.
Эти проблемы очень похожи, но есть различия:
Race Condition — это недостаток, возникающий, когда время или порядок событий влияют на правильность программы.
Data Race — это состояние когда разные потоки обращаются к одной ячейке памяти без какой-либо синхронизации и как минимум один из потоков осуществляет запись.
👍11
Примитивы синхронизации: NSLock, NSRecursiveLock, NSCondition
Для решения проблемы синхронизации данных в iOS есть множество решений. Начнем с базовых типов.
NSLock
Когда поток пытается заблокировать объект возможно два варианта, поток либо сможет это сделать и продолжит работу, либо будет ожидать пока другой поток, успевший раньше заблокировать объект, не вызовет unlock() тем самым освободив блокировку.
NSLock и другие блокировки Foundation несправедливы, в том смысле, что когда несколько потоков ожидает освобождения объекта блокировки, они не получат его в том порядке в каком они пытались наложить блокировку. При большом количестве потоков это может служить проблемой, когда один из потоков никогда не получит доступ в положенное время.
Для решения проблемы синхронизации данных в iOS есть множество решений. Начнем с базовых типов.
NSLock
Когда поток пытается заблокировать объект возможно два варианта, поток либо сможет это сделать и продолжит работу, либо будет ожидать пока другой поток, успевший раньше заблокировать объект, не вызовет unlock() тем самым освободив блокировку.
NSLock и другие блокировки Foundation несправедливы, в том смысле, что когда несколько потоков ожидает освобождения объекта блокировки, они не получат его в том порядке в каком они пытались наложить блокировку. При большом количестве потоков это может служить проблемой, когда один из потоков никогда не получит доступ в положенное время.
🔥5
NSRecursiveLock
Рекурсивные блокировки могут быть получены несколько раз из потока, который уже держит эту блокировку. Это полезно в рекурсивной функции или при вызове нескольких функций, которые проверяют одну и ту же блокировку в последовательности.
Если заменить NSRecursiveLock на NSLock, выполнение, хотя и внутри одного потока, встанет на вызове rlock.lock() метода callMe()
Рекурсивные блокировки могут быть получены несколько раз из потока, который уже держит эту блокировку. Это полезно в рекурсивной функции или при вызове нескольких функций, которые проверяют одну и ту же блокировку в последовательности.
Если заменить NSRecursiveLock на NSLock, выполнение, хотя и внутри одного потока, встанет на вызове rlock.lock() метода callMe()
🔥5
NSCondition
NSCondition обеспечивают простой способ ждать выполнения условия.
Когда заблокируемый поток, понимает, что требуемое ему условие пока не выполнено, то ему нужен способ удержаться и продолжиться свою работу пока условие будет не выполнено.
Это может быть реализовано путем непрерывной или периодической проверки этого условия (ожидание занятости), но при этом, что произойдет с блокировками потока? Должны ли мы держать их, пока мы ждем или освободим их в надежде, что мы сможем их снова приобрести, когда условие будет выполнено?
NSCondition обеспечивают чистое решение этой проблемы, как только поток поставил блокировку (вызвал lock()) он может быть помещен в лист ожидания для этого условия и проснуться, как только другой поток сигнализирует о том, что условие выполнено.
NSCondition обеспечивают простой способ ждать выполнения условия.
Когда заблокируемый поток, понимает, что требуемое ему условие пока не выполнено, то ему нужен способ удержаться и продолжиться свою работу пока условие будет не выполнено.
Это может быть реализовано путем непрерывной или периодической проверки этого условия (ожидание занятости), но при этом, что произойдет с блокировками потока? Должны ли мы держать их, пока мы ждем или освободим их в надежде, что мы сможем их снова приобрести, когда условие будет выполнено?
NSCondition обеспечивают чистое решение этой проблемы, как только поток поставил блокировку (вызвал lock()) он может быть помещен в лист ожидания для этого условия и проснуться, как только другой поток сигнализирует о том, что условие выполнено.
🔥7
Многопоточное vs асинхронное программирование
Многопоточное программирование подразумевает, что код приложения выполняется в разных потоках. Например, есть главный поток UI, и несколько рабочих потоков, которые выполняют тяжелые вычисления, результаты которых затем выводятся на UI.
Асинхронное программирование подразумевает инициацию некоторой операцию, об окончании которой главный поток узнает спустя некоторое время. Обычно это применяется для работы с системой ввода-вывода: диски, сеть и т.д. При этом, если это все сделано правильно, никакого потока нет.
https://habr.com/ru/post/216659/
Многопоточное программирование подразумевает, что код приложения выполняется в разных потоках. Например, есть главный поток UI, и несколько рабочих потоков, которые выполняют тяжелые вычисления, результаты которых затем выводятся на UI.
Асинхронное программирование подразумевает инициацию некоторой операцию, об окончании которой главный поток узнает спустя некоторое время. Обычно это применяется для работы с системой ввода-вывода: диски, сеть и т.д. При этом, если это все сделано правильно, никакого потока нет.
https://habr.com/ru/post/216659/
Хабр
Нет никакого потока
Важная правда об асинхронности в своей первозданной форме: нет никакого потока. Тех, кто возразит, несть числа. «Нет», кричат они, «если я ожидаю операцию, долж...
🔥8
Сколько потоков необходимо для ассинхронного кода?
Anonymous Quiz
20%
Два
14%
Ни одного
58%
Один
8%
Два ядра
Клевая статья о карьерном росте в качестве техлида. С хорошими ориентирами и рекомендациями о чем почитать
https://habr.com/ru/company/oleg-bunin/blog/668206/
https://habr.com/ru/company/oleg-bunin/blog/668206/
Хабр
Как стать хорошим техлидом
В 2006 году Яндекс и Google приехали в Петербург в Borland, который сокращал команду. Обе компании одновременно открывали в Петербурге свои офисы на его базе. Тогда к нам пришли замечательные ребята....
👍4
Многопоточность: программа и процесс
Разница между программой и процессом тонкая, но мы попробуем ее нащупать.
Программа - это набор инструкций, которые выполняют определенную задачу при выполнении компьютером, в то время как процесс является экземпляром выполняемой компьютерной программы. Таким образом, в этом главное отличие программы и процесса.
Кроме того, время жизни - еще одно важное различие между программой и процессом. Программа имеет более длительный срок службы, чем процесс.
На жестком диске хранятся программы, и этим программам не требуются ресурсы, в то время как процессам требуются такие ресурсы, как память, устройства ввода-вывода и процессор.
Программа и процесс - это два термина в операционных системах, таких как Linux и Windows. Основное различие между программой и процессом состоит в том, что программа - это набор инструкций, который позволяет ЦПУ выполнять определенную задачу, в то время как процесс - это исполняемая программа.
Разница между программой и процессом тонкая, но мы попробуем ее нащупать.
Программа - это набор инструкций, которые выполняют определенную задачу при выполнении компьютером, в то время как процесс является экземпляром выполняемой компьютерной программы. Таким образом, в этом главное отличие программы и процесса.
Кроме того, время жизни - еще одно важное различие между программой и процессом. Программа имеет более длительный срок службы, чем процесс.
На жестком диске хранятся программы, и этим программам не требуются ресурсы, в то время как процессам требуются такие ресурсы, как память, устройства ввода-вывода и процессор.
Программа и процесс - это два термина в операционных системах, таких как Linux и Windows. Основное различие между программой и процессом состоит в том, что программа - это набор инструкций, который позволяет ЦПУ выполнять определенную задачу, в то время как процесс - это исполняемая программа.
🔥6👍2
Многопоточность: InterProcess Communication (IPC)
Как я уже писал выше — процессы не могут взаимодействовать друг с другом. Но это не совсем верно.
InterProcess Communication — это механизм операционной системы, который позволяет процессам взаимодействовать друг с другом. Это взаимодействие может включать в себя процесс, сообщающий другому процессу, что произошло какое-то событие, или передачу данных от одного процесса к другому.
Во многих операционных системах он используется для большинства коммуникаций:
- сокеты общаются с другими процессами.
- Все POSIX ситемы делятся общей памятью
- Почти все операционные системы могут в запись на диск, или запись, синтезируемая по запросу файловым сервером, к которой могут обращаться несколько процессов.
https://www.tutorialspoint.com/what-is-inter-process-communication-ipc
Как я уже писал выше — процессы не могут взаимодействовать друг с другом. Но это не совсем верно.
InterProcess Communication — это механизм операционной системы, который позволяет процессам взаимодействовать друг с другом. Это взаимодействие может включать в себя процесс, сообщающий другому процессу, что произошло какое-то событие, или передачу данных от одного процесса к другому.
Во многих операционных системах он используется для большинства коммуникаций:
- сокеты общаются с другими процессами.
- Все POSIX ситемы делятся общей памятью
- Почти все операционные системы могут в запись на диск, или запись, синтезируемая по запросу файловым сервером, к которой могут обращаться несколько процессов.
https://www.tutorialspoint.com/what-is-inter-process-communication-ipc
👍5
Многопоточность: Проблема производителя и потребителя
Проблема «производитель-потребитель» — это классическая проблема синхронизации
Два процесса используют общий буфер фиксированного размера. Один из них, производитель, помещает информацию в буфер, а другой, потребитель, извлекает ее оттуда.
Проблемы возникают в тот момент, когда производителю требуется поместить новую запись в уже заполненный буфер.
Проблема «производитель-потребитель» — это классическая проблема синхронизации
Два процесса используют общий буфер фиксированного размера. Один из них, производитель, помещает информацию в буфер, а другой, потребитель, извлекает ее оттуда.
Проблемы возникают в тот момент, когда производителю требуется поместить новую запись в уже заполненный буфер.
👍2🔥1
Код выше добавляет и удаляет целое число 10 раз в массиве. Поскольку все эти вызовы выполняются параллельно, невозможно предсказать порядок их выполнения. Поскольку добавление и удаление происходят одновременно может быть сбой
Рассмотрим следующий сценарий:
1. Девять блоков add уже выполнены, осталось выполнить только один блок
2. Принимая во внимание, что все 8 блоков удаления выполняются, и в настоящее время выполняются последние два. Таким образом, в этот момент количество элементов будет равно 1
3. Из-за состояния гонки предположим, что последний блок добавления выполняется после двух блоков удаления.
В приведенном выше сценарии, поскольку количество элементов равно 1 и два блока удаления выполняются одновременно, вызов remove два раза для массива со значением 1 приведет к сбою.
Рассмотрим следующий сценарий:
1. Девять блоков add уже выполнены, осталось выполнить только один блок
2. Принимая во внимание, что все 8 блоков удаления выполняются, и в настоящее время выполняются последние два. Таким образом, в этот момент количество элементов будет равно 1
3. Из-за состояния гонки предположим, что последний блок добавления выполняется после двух блоков удаления.
В приведенном выше сценарии, поскольку количество элементов равно 1 и два блока удаления выполняются одновременно, вызов remove два раза для массива со значением 1 приведет к сбою.
👍5🔥2❤1
«Атомные привычки»
Уровень воды: 40%
Оценка: 4/5
Буду иногда публиковать сюда рецензии на книги, которые читаю для профессионального развития.
Трудно заметить, что книга не про иос. И ты не ошибёшься. Она о процессе развития. «Атомные привычки» — книга популярная не только в бизнес индустрии, но и можно встретить рекомендацию у ит инфлюенсеров.
Все мы состоим из привычек. Унаследовали их от семьи, коллег, друзей. Эти привычки и определяют наше развитие.
В книге много советов как выработать свою систему по их формированию. Делать привлекательней полезные, и избавляться от вредных.
Подойдёт для укрепления дисциплины ежедневно решать литкод задачи 🙂
Уровень воды: 40%
Оценка: 4/5
Буду иногда публиковать сюда рецензии на книги, которые читаю для профессионального развития.
Трудно заметить, что книга не про иос. И ты не ошибёшься. Она о процессе развития. «Атомные привычки» — книга популярная не только в бизнес индустрии, но и можно встретить рекомендацию у ит инфлюенсеров.
Все мы состоим из привычек. Унаследовали их от семьи, коллег, друзей. Эти привычки и определяют наше развитие.
В книге много советов как выработать свою систему по их формированию. Делать привлекательней полезные, и избавляться от вредных.
Подойдёт для укрепления дисциплины ежедневно решать литкод задачи 🙂
👍16
Многопоточность: Решение проблемы производителя и потребителя с помощью NSLock
Приведенный выше код блокирует выполнение других потоков всякий раз, когда элементы изменяются. Таким образом, всякий раз, когда блок выполняется, блокировка гарантирует, что ни один другой блок не будет задействован для выполнения, и, следовательно, делает приведенный выше код потокобезопасным.
Приведенный выше код использует
Приведенный выше код блокирует выполнение других потоков всякий раз, когда элементы изменяются. Таким образом, всякий раз, когда блок выполняется, блокировка гарантирует, что ни один другой блок не будет задействован для выполнения, и, следовательно, делает приведенный выше код потокобезопасным.
Приведенный выше код использует
defer
в remove
. Он используется, потому что defer вызывается перед выходом из функции. Поскольку remove имеет два пути выхода, репликация lock.unlock() в двух местах не рекомендуется. Следовательно, в этом случае defer полезен.👍5
Многопоточность: Примитив синхронизации Semaphore🚦
Семафоры помогают управлять доступом к общему ресурсу нескольким потокам.
Семафор состоит из очереди потоков и значения счетчика.
ℹ️Очередь потоков используется семафором для отслеживания ожидающих потоков в порядке FIFO
ℹ️Значение счетчика используется семафором, чтобы решить, должен ли поток получить доступ к общему ресурсу или нет. Значение счетчика изменяется, когда мы вызываем функцию signal() или wait().
Когда мы должны вызывать функции wait() и signal()?
- Вызов wait() нужен каждый раз перед использованием общего ресурса. По сути, мы спрашиваем семафор, доступен ли общий ресурс или нет. Если нет, будем ждать.
- Вызов signal() нужен каждый раз после использования общего ресурса. По сути, мы сигнализируем семафору, что закончили взаимодействие с общим ресурсом.
🚧 НИКОГДА не запускайте функцию семафора wait() в основном потоке, так как это приведет к зависанию вашего приложения.
Семафоры помогают управлять доступом к общему ресурсу нескольким потокам.
Семафор состоит из очереди потоков и значения счетчика.
ℹ️Очередь потоков используется семафором для отслеживания ожидающих потоков в порядке FIFO
ℹ️Значение счетчика используется семафором, чтобы решить, должен ли поток получить доступ к общему ресурсу или нет. Значение счетчика изменяется, когда мы вызываем функцию signal() или wait().
Когда мы должны вызывать функции wait() и signal()?
- Вызов wait() нужен каждый раз перед использованием общего ресурса. По сути, мы спрашиваем семафор, доступен ли общий ресурс или нет. Если нет, будем ждать.
- Вызов signal() нужен каждый раз после использования общего ресурса. По сути, мы сигнализируем семафору, что закончили взаимодействие с общим ресурсом.
🚧 НИКОГДА не запускайте функцию семафора wait() в основном потоке, так как это приведет к зависанию вашего приложения.
👍8