본문 바로가기

Swift

Concurrency Programming - Intro

728x90

오늘은 Concurrency Programming에 대해서 알아보겠습니다. 애플 공식 문서를 통해서 알아보도록 할게요 !!

원문은 <Concurrency Programming Guide> 을 참고해주세요. 😈

 

원문에 들어가기 전, 프로세스와 쓰레드에 대한 개념을 정리하고 가도록 하겠습니다.

프로세스

프로세스란, 운영체제로부터 시스템 자원을 할당 받는 작업의 단위를 말합니다. 프로세스들은 각각의 독립된 메모리 영역을 할당 받습니다. 따라서, 프로세스들끼리는 서로의 변수, 자료구조에 절대 접근할 수 없습니다.

-> 만약, 서로 다른 프로세스가 각 프로세스의 자원에 접근하려고 한다면? 프로세스 간의 통신 (= 파일, 소켓) 등을 해야합니다. 

 

멀티 프로세스

위에서 말한 프로세스가 다수로 구성되는 것을 말합니다.

하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스마다 하나의 작업을 하도록 처리하는 것을 멀티 프로세스라고 합니다.

 

알람 앱을 예로 하여 설명하자면,

알람 시각을 맞추는 프로세스 + 알람 시간이 울리기까지 시간을 계산하는 프로세스 + 해당 시각에 알람이 울리는 프롯세스 

.. 등 알람이라는 하나의 프로그램에서 여러 개의 작업을 여러 개의 프로세스로 나누어서 하나씩 처리하도록 하는 것을 말합니다.

 

✔️ 멀티 프로세스의 장/단점에 대해서 알아보자면,

⭕️ 안정성이 높다

- 프로세스들은 서로의 자원에 침투할 수 없으므로 독립된 구조입니다. 그러므로 안정성이 높습니다.

CPU의 부담이 커지고 오버헤드가 발생하게 됩니다.

- 하나의 목표 작업을 위해 프로세스를 왔다 갔다 하는 과정에서 각 프로세스를 실행할 때, 각 프로세스들은 메모리에 올라가게 됩니다. 이 때 메모리가 독립적으로 존재하므로 문맥 교환 시, CPU의 부담이 커지게 되고 이는 오버헤드를 발생시킵니다. 

❌ 프로세스 간 자원 공유가 어렵습니다. 

 

앞서 말한 알람 앱의 상황으로 보자면, 1초 후 알람이 울리게 설정을 할 때, 등록 후에 바로 알람이 울려 앞서 말한 프로세스가 동시에 실행되는 것처럼 보이지만 실제로는 각 프로세스들이 빠르게 실행되면서 과정이 진행되는 것입니다.

 

쓰레드

쓰레드란, 하나의 프로세스 내에서 동작하는 여러 실행의 흐름을 말합니다.즉, 쓰레드는 프로세스가 아닌, 프로세스 내에서 동작되므로 메모리 영역을 독립적으로 할당받지 못합니다. 

-> 그래서 코드, 데이터, 힙 영역은 공유하고 스택 영역만 독립적으로 할당 받을 수 있습니다. 쓰레드끼리는 힙 영역을 공유해서 같은 자원을 접근할 수 있지만, 각 스택 영역은 접근할 수 없습니다.

 

멀티 쓰레드

하나의 프로그램을 여러 개의 쓰레드로 구성해서 각 쓰레드마다 하나의 작업씩 처리하도록 하는 것을 말합니다. 

 

✔️ 멀티 쓰레드의 장/단점에 대해 알아보자면,

⭕️ 쓰레드 간 Code, Data, Heap 영역을 공유하기 때문에 Context Switching이 빠릅니다.

⭕️ 프로세스를 생성해서 자원을 할당 하는 것이 아니기 때문에 생성, 종료 시간도 프로세스보다 빠릅니다.

⭕️ 프로세스 간 통신은 영역을 공유하지 않기 때문에 까다롭지만, 쓰레들의 경우 stack 영역을 제외하고 나머지 영역을 공유하므로 통신 방법이 보다 간단합니다.

❌ 설계가 까다롭습니다.

- 쓰레드의 경우 stack 영역을 제외하고 공유를 하기 때문에 자원 공유의 문제가 생길 수 있습니다. (동기화 문제) 또한 독립적이지 않기 때문에 하나의 쓰레드에서 생긴 문제가 전체 쓰레드의 문제가 될 수 있습니다.

 

Concurrency Programming Guide

Introduction

동시성은 동시에 발생하는 것들의 개념입니다. 멀티 코어 CPU의 확산과 각 프로세서의 코어 개수가 증가할 것이라는 예측으로, 소프트웨어 개발자는 코어를 활용할 수 있는 새로운 방법을 모색해야 합니다. 

OS X 및 iOS와 같은 운영체제는 여러 프로그램을 동시에 실행할 수 있지만, 대부분의 프로그램은 back ground 에서 실행되며, 연속으로 프로세서 시간이 필요하지 않는 작업을 수행합니다. 컴퓨터를 계속 사용하고 사용자와 인터랙션을 하는 것은 현재 foreground 앱 입니다. 앱이 수행해야 할 작업은 많지만, 사용 가능한 코어의 일부만 사용 중인 경우, 사용할 수 있는 코어가 더 있음에도 불구하고 사용하지 않기 때문에 리소스가 낭비됩니다. 

 

과거에는 앱에 동시시성을 도입할 때, 하나 이상의 추가 쓰레드가 필요했습니다. 그러나, 쓰레드 코드를 작성하는 것은 어렵습니다. 쓰레드는 수동으로 관리해야하는 하위의 도구입니다.

앱의 최적의 쓰레드 수는 현재 시스템 부하 및 기본 하드웨어를 기반으로 동적으로 변경될 수 있으므로 올바른 쓰레드 구현 자체가 불가능한 것은 아니지만, 매우 어려워집니다. 또한 일반적으로 쓰레드와 함께 사용되는 동기화 메커니즘은 성능 향상이 보장되지 않고 소프트웨어 설계에 복잡성과 위험을 추가합니다.

 

OS X와 iOS는 전통적으로 쓰레드 기반의 앱보다 비동기적인 동시 테스크 실행 방식을 사용하고 있습니다. 직접 쓰레드를 작성하는 대신 앱은 특정 테스크를 정의한 다음 시스템이 이를 수행하도록 해야합니다. 

시스테이 쓰레드를 관리하게 함으로써 원시 쓰레드에서 불가능한 수준의 확장성을 얻을 수 있습니다. 그리고 앱 개발자는 더 간단하고 효율적인 프로그래밍 모델을 얻게 됩니다. 

 

Organization of This Document

이 문서에는 다음 컨텐츠가 포함되어 있습니다.

- Concurrency and Application Design : 비동기식 앱 설계의 기초와 사용자 정의 작업을 비동기적으로 수행하기 위한 기술

- Operation Queues : Objective-C 객체를 사용하여 작업을 캡슐화하고 수행하는 방법

- Dispatch Queues : C 기반 앱에서 동시에 작업을 실행하는 방법

- Dispatch Sources : 시스템 이벤트를 비동기적으로 처리하는 방법

- Migrating Away from Thread :  기존 스레드 기반 코드를 새로운 기술로 마이그레이션하는 데 필요한 기술 

 

 

 

순서대로 정리해보겠습니다. 이 글에서는 인트로 영역만 보겠습니다.

본격적으로 문서를 읽어보기 전에, 용어에 대한 참고사항을 정리하고 가겠습니다.

 

A Note About Terminology

동시성에 대한 이야기를 하기 전에 헷갈리지 않기 위해서는 관련 용어를 제대로 알아야합니다.

유닉스 시스템 또는 구현 OS X 기술에 익숙한 개발자는 이 문서에서 task, process, thread 라는 용어가 조금 다르게 사용된다는 것을 알 수 있습니다. 이 문서에서는 이 용어를 다음과 같은 의미로 사용하고 있습니다.


- task : 작업, 수행해야 할 추상적인 작업 개념을 의미합니다.

- process : 프로세스, 실행 중인 실행 파일(running executable)을 의미하며, 여러 쓰레드를 포함할 수 있습니다.

- thread : 쓰레드, 코드 실행을 위한 별도의 실행 경로를 지칭하기 위해 사용됩니다. OS X의 쓰레드에 대한 기본 구현은 POSIX 쓰레드 API를 기반으로 합니다.

 

여기까지가 Introduction 부분이었습니다. 다음 글에서는 이어서 Concurrency and Application Design(동시성과 앱 설계)에 대해 알아보도록 하겠습니다 !!

'Swift' 카테고리의 다른 글

Initialization - 상속과 초기화  (0) 2022.04.20
Initialization - 무엇인가  (0) 2022.04.20
Hashable  (0) 2022.04.14
MVVM+RxSwift  (0) 2022.04.07
Type Casting  (0) 2022.04.01