Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

동시성 프로그래밍의 개념과 iOS에서의 동시성 처리 방식에 대해 설명해주세요. #9

Open
ujhong7 opened this issue Sep 29, 2024 · 0 comments

Comments

@ujhong7
Copy link
Owner

ujhong7 commented Sep 29, 2024

동시성 프로그래밍(Concurrency) 개념

동시성 프로그래밍(Concurrency)은 여러 작업이 동시에 실행되는 것처럼 보이도록 처리하는 기법입니다.

프로세서가 여러 작업을 적절하게 분배하면서 시간 단위로 작업을 번갈아 실행해,

실제로는 순차적으로 실행되지만 사용자가 보기에는 동시에 실행되는 것처럼 느낄 수 있습니다.

iOS에서 동시성 프로그래밍을 구현할 때는 주로

GCD(Grand Central Dispatch)와 OperationQueue 같은 API를 사용하여 비동기 작업을 관리합니다.

이를 통해 메인 스레드에서 시간이 오래 걸리는 작업을 백그라운드에서 처리하면서도 UI가 멈추지 않도록 합니다.


iOS에서의 동시성 처리 방식

iOS는 다양한 동시성 처리 방식을 지원하며, 주로 다음과 같은 방법들이 사용됩니다.

GCD (Grand Central Dispatch)

GCD는 저수준의 C 기반 API로, 작업을 큐(queue)에 보내고 시스템에서 스레드 관리를 알아서 처리하도록 하는 방식입니다.
GCD는 매우 가볍고, 비동기 작업을 손쉽게 처리할 수 있어 iOS에서 널리 사용됩니다.
예시: 비동기 작업을 백그라운드 스레드에서 처리한 후, 메인 스레드에서 UI 업데이트.

DispatchQueue.global(qos: .background).async {
    // 백그라운드에서 작업 수행
    let result = heavyTask()
    
    DispatchQueue.main.async {
        // 메인 스레드에서 UI 업데이트
        updateUI(with: result)
    }
}

OperationQueue

OperationQueue는 GCD보다 더 고수준의 API로,
작업을 객체로 관리할 수 있어 작업 간의 의존성이나 취소가 필요한 경우 유용합니다.
예시: 백그라운드에서 작업을 처리하고 UI 업데이트.

let operationQueue = OperationQueue()
let operation = BlockOperation {
    let result = heavyTask()
    OperationQueue.main.addOperation {
        updateUI(with: result)
    }
}
operationQueue.addOperation(operation)

Swift의 Async/Await (Swift Concurrency)

Swift 5.5부터 도입된 async와 await는 비동기 코드를 순차적 코드처럼 작성할 수 있도록 도와줍니다.
코드 가독성을 높이면서도 비동기 동작을 처리하는 데 유용합니다.
예시: async/await를 사용한 비동기 네트워크 호출.

func fetchData() async -> Data {
    let url = URL(string: "https://example.com/data")!
    let (data, _) = try! await URLSession.shared.data(from: url)
    return data
}

async {
    let data = await fetchData()
    updateUI(with: data)
}

병렬 처리와 동시 처리의 차이

  • 동시 처리(Concurrency):
    여러 작업이 교대로 실행되지만, 사용자에게는 동시에 실행되는 것처럼 보입니다.
    실제로는 하나의 프로세서가 시간 분할을 통해 각 작업을 번갈아 실행합니다.
    예시: 여러 네트워크 요청을 비동기로 처리할 때, 작업들이 차례대로 실행되며, 특정 작업이 완료되지 않아도 다른 작업이 실행될 수 있습니다.

  • 병렬 처리(Parallelism):
    실제로 여러 작업이 동시에 실행됩니다.
    멀티코어 시스템에서 각 코어가 서로 다른 작업을 동시에 처리하는 경우 병렬 처리가 이루어집니다.
    예시: 4개의 코어가 있다면 각각의 코어가 다른 작업을 동시에 처리하여 성능을 극대화합니다.


iOS에서의 멀티코어 활용 방안

iOS는 멀티코어 장치에서 성능을 최대화하기 위해 GCD나 OperationQueue를 활용하여 병렬 처리를 지원합니다.
멀티코어 활용의 주요 방법들은 다음과 같습니다.

  1. GCD를 통한 멀티코어 작업 분배
    GCD는 시스템이 자동으로 스레드를 적절히 배분해 각 코어에서 병렬로 작업을 처리할 수 있게 합니다.
    DispatchQueue.global을 사용하면, 작업을 여러 코어에 분산시켜 병렬 처리할 수 있습니다.
    예시: 여러 이미지 파일을 동시에 처리하여 성능을 향상시키는 작업.
DispatchQueue.concurrentPerform(iterations: 4) { index in
    processImage(at: index)
}
  1. OperationQueue에서 maxConcurrentOperationCount 설정
    OperationQueue는 동시에 실행될 작업의 최대 개수를 설정하여 멀티코어를 활용할 수 있습니다.
    예를 들어, 4개의 코어에서 동시에 작업을 수행하도록 설정 가능합니다.
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperationCount = 4  // 4개의 작업을 동시에 처리
  1. 비동기 작업을 이용한 CPU와 I/O 작업 분리
    CPU 집약적인 작업은 백그라운드 스레드에서 실행하고,
    I/O 작업(예: 네트워크 요청)은 다른 스레드에서 실행하여 효율성을 높일 수 있습니다.
    이렇게 하면 CPU 사용률을 극대화하면서도 I/O 작업이 완료될 때까지 기다릴 필요가 없습니다.

  2. Swift Concurrency의 Actor 모델
    Swift의 동시성 기능인 actor를 활용하면,
    멀티스레드 환경에서 데이터 경쟁(data race)을 방지하면서 안전하게 데이터를 공유할 수 있습니다.
    actor는 멀티코어 시스템에서 동시성 처리를 더 안전하게 처리할 수 있게 도와줍니다.

actor DataManager {
    private var data: [String] = []
    
    func addData(_ newData: String) {
        data.append(newData)
    }
    
    func fetchData() -> [String] {
        return data
    }
}

정리

동시성은 여러 작업이 동시에 실행되는 것처럼 처리되는 것이고,

병렬성은 실제로 여러 작업이 동시에 실행되는 것을 말합니다.

iOS에서 동시성 프로그래밍은 GCD, OperationQueue, Swift의 async/await 등을 통해 구현됩니다.

멀티코어 활용을 위해 GCDOperationQueue를 사용하여 작업을 코어에 분배하고, 병렬로 처리할 수 있습니다.

Swift Concurrencyactor 모델은 멀티스레드 환경에서 안전한 데이터 공유를 돕고, 성능을 최적화하는 데 유용합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant