Обеспечение исключительности в Swift 5
Релиз Swift 5 по умолчанию включает проверку во время выполнения «Эксклюзивного доступа к памяти» в сборках Release, что еще больше расширяет возможности Swift как безопасного языка. Эти проверки времени выполнения были включены только в сборках отладки в Swift 4. Swift автоматически управляет памятью и гарантирует, что множественный доступ к одной и той же области памяти не конфликтует, гарантируя, что код, изменяющий расположение в памяти, имеет исключительную доступ.
Доступ к памяти может быть двух типов:
- Доступ для чтения
- Доступ для записи
В зависимости от продолжительности доступа доступ к памяти бывает двух типов:
- Мгновенный доступ - операция завершается без вмешательства какого-либо другого кода.
- Долгосрочный доступ - доступ охватывает выполнение другого кода. Обычно происходит при использовании
inout
аргументов в функциях или при изменении методов структуры.
Конфликты возникают при доступе к долговременной памяти. Когда доступ к памяти является долгосрочным, другой код может изменить или прочитать эту ячейку памяти, что называется перекрытием. Долгосрочный доступ может перекрываться с другими долгосрочными и мгновенными доступами. Эксклюзивный доступ к памяти ограничивает модификацию памяти в случае перекрытия.
Эксклюзивный доступ
Эксклюзивный доступ ограничивает выполнение нескольких одновременных операций чтения / записи или одновременных операций записи в области памяти.
Доступ к памяти осуществляется каждый раз, когда мы устанавливаем значение переменной, читаем значение из переменной или передаем аргумент функции.
Влияние принудительного соблюдения эксклюзивности в режиме выпуска для проектов Swift
Обеспечение эксклюзивности в Swift 5 может повлиять на существующий проект двумя способами:
- Если исходный код проекта нарушает правила эксклюзивности Swift и при тестировании Debug не удалось проверить недопустимый код, выполнение двоичного файла Release может вызвать ловушку времени выполнения. В случае сбоя будет выведено диагностическое сообщение «Доступы перекрываются к…, но для изменения требуется монопольный доступ». Исправление на уровне исходного кода обычно несложно.
- Накладные расходы на проверки доступа к памяти могут повлиять на производительность двоичного файла Release. В большинстве случаев воздействие должно быть небольшим.
Заключение
Принуждение к исключительности выявляет только однопоточные ошибки. Эксклюзивный доступ к памяти обеспечивает более надежную работу и значительно оптимизирует:
- Библиотеки
- Компилятор
- Написанный пользователем код
Предоставляя полную эксклюзивность, включенную в сборках Release, Swift 5 помогает устранять ошибки и проблемы с безопасностью, обеспечивать двоичную совместимость и обеспечивать будущую оптимизацию и языковые функции.
использованная литература
- Https://swift.org/blog/swift-5-exclustivity/
- Https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html
- Https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md
- Https://developer.apple.com/videos/play/wwdc2017/402/
Вы можете связаться с нами в Twitter, Linkedin, Facebook и Github.