Open womyo opened 1 week ago
프로세스와 스레드는 컴퓨터 시스템에서 실행되는 작업의 기본 단위 | 프로세스 (Process) | 스레드 (Thread) |
---|---|---|
운영 체제에서 실행 중인 프로그램의 인스턴스 | 프로세스 내에서 실행되는 작은 실행 단위 | |
독립적인 메모리 공간을 가짐. 다른 프로세스의 데이터에 직접 접근할 수 없음 | 한 프로세스 내에서 여러 스레드가 공유하는 메모리 공간이 있어 스레드 간 데이터 공유 가능 | |
다른 프로세스와 통신하려면 IPC(Inter-Process Communication)와 같은 별도의 메커니즘 필요 | 같은 프로세스 내 스레드 간 통신은 간단히 이루어짐 | |
독립된 실행 환경 제공으로 안정성이 높음 | 자원을 공유하기 때문에 동기화와 충돌 방지에 주의 필요 | |
프로세스 간 전환(컨텍스트 스위칭) 시 높은 오버헤드 발생 | 스레드 간 전환 시 낮은 오버헤드 발생 |
프로세스와 스레드의 차이점에 대해 설명해주세요.
멀티스레딩이 필요한 이유는 무엇인가요? 하나의 서버 스레드가 블록 상태인 동안에도 같은 태스크 내의 다른 스레드가 실행되어 빠른 처리가 가능함. 같은 일을 수행하는 멀티 스레드가 협력하여 높은 처리율 및 성능 향상을 얻을 수 있음. 비동기식 입출력이 가능하여 병렬성 높일 수 있음. (응답성 증가, 자원 공유, 경제적, 멀티프로세서 구조 활용 가능)
멀티스레딩 과정에서 Race Condition을 방지하는 방법은 무엇인가요? Race Condition: 여러 스레드가 동시에 공유 데이터에 접근하면서 실행 순서에 따라 결과값에 영향을 줄 수 있는 상황. 이를 방지하기 위해서는 concurrent process가 동기화되어야 하며 다음 조건을 충족해야 함. -Mutual Exclusion(상호 배제): 한 스레드가 critical section을 실행 중이면 다른 스레드가 해당 영역에 들어갈 수 없어야 함. -Progress: critical section에 아무도 없는 상태에서 해당 영역에 들어가고자 하는 스레드가 있으면 들어가게 해줘야 함. -Bounded Waiting(유한 대기): critical section에 들어가려고 요청한 후부터 그 요청이 허용될 때까지, 다른 스레드가 critical section에 들어가는 횟수에 한계가 있어야 함 ex) Mutex(하나의 스레드만 공유 리소스에 접근할 수 있도록 제한), Semaphore(특정 리소스에 접근할 수 있는 스레드의 개수를 제한)
iOS 앱에서 멀티스레딩을 구현하는 방법은 무엇인가요? -GCD(Grand Central Dispatch): 큐 기반 작업 관리, 비동기 및 동기 작업 실행 가능(DispatchQueue) -OperationQueue: 작업을 Operation 객체로 추상화하고 OperationQueue에서 작업을 관리하고 실행함. -async/await 이나 Combine을 활용해 멀티스레드 환경에서 작업을 단순화하고 동시성 문제를 쉽게 해결할 수 있음.
프로세스는 프로그램이 실행될때 생성되는 독립적인 실행 단위. 스레드는 프로세스 내에서 실행되는 작업의 실행 단위.
하나의 프로세스 내에서 여러 작업을 동시에 수행하기 위해
공유 리소스 스레드를 안전하게 만들거나 두 개의 스레드가 동시에 리소스를 업데이트하지 않도록 한다.
프로세스는 독립적인 프로그램 실행 단위 스레드는 프로세스 내부 작업 단위
멀티 스레딩은 앱의 성능을 높이고 동시에 여러 작업을 처리 가능하게 하기에 필요해요
동기화 , Serial Queue등을 사용해 방지할 수 있음
iOS에서 GCD와 OperationQueue를 주로 사용해 멀티 스레딩 구현
프로세스: 독립적인 실행 단위, 자체 메모리 공간 스레드: 프로세스 내의 실행 흐름, 메모리 공유
UI 응답성 향상 긴 작업 처리 (네트워크, 파일 IO) CPU 자원 효율적 사용 동시성 처리
// Serial Queue 사용
let serialQueue = DispatchQueue(label: "com.app.serial")
serialQueue.sync {
// 안전한 데이터 접근
}
// Lock 사용
let lock = NSLock()
lock.lock()
// 작업
lock.unlock()
실행 중인 프로그램의 인스턴스
구성요소
- 코드 영역 (텍스트 섹션)
- 데이터 영역 (전역 변수/정적 변수)
- 힙 영역 (동적 할당 메모리)
- 스택 영역 (지역 변수, 함수 호출 정보)
특징
- 독립된 메모리 공간
- 각각의 프로세스는 별도의 주소 공간 할당
- 다른 프로세스와 완전히 독립적
장단점:
- 장점: 안정성이 높음, 한 프로세스가 죽어도 다른 프로세스에 영향 없음
- 단점: 생성 비용이 큼, 컨텍스트 스위칭 비용이 큼
스레드
프로세스 내에서 실행되는 작업의 단위
구성요소
- 스레드 ID
- 프로그램 카운터
- 레지스터 셋
- 스택
특징
- 프로세스의 자원을 공유
- 같은 프로세스 내의 다른 스레드와 메모리 공유
- 독립적인 스택만 가짐
- 가볍고 생성 비용이 적음
장단점:
- 장점: 생성 비용이 적음, 컨텍스트 스위칭이 빠름
- 단점: 동기화 이슈 발생 가능, 한 스레드의 문제가 전체 프로세스에 영향
멀티스레딩이 필요한 이유는 무엇인가요?
멀티스레딩: 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것
- CPU 자원을 효율적으로 활용할 수 있습니다. 한 스레드가 대기 상태일 때 다른 스레드가 실행될 수 있어 전체적인 프로그램 실행 속도가 향상됨
- 사용자 인터페이스를 처리하는 메인 스레드는 계속 반응할 수 있고, 시간이 오래 걸리는 작업은 별도의 스레드에서 처리하여 응답성을 향상할 수 있음
- 웹 서버에서 여러 클라이언트의 요청을 동시에 처리하는 등의 독립적인 작업들을 동시에 처리할 수 있음
스레드 간 동기화 문제, 데드락이나 레이스 컨디션과 같은 동시성 문제, 너무 많은 스레드를 생성시 성능 저하될 수 있음
멀티스레딩 과정에서 Race Condition을 방지하는 방법은 무엇인가요?
- GCD (Grand Central Dispatch) 사용
- Barrier Flag 사용
- NSLock 사용
- synchronized 블록 사용
- Atomic Properties 사용
- OperationQueue 사용
- Actor 사용 (iOS 13 이상)
고려사항
- 성능 최적화
- 적절한 동기화 메커니즘 선택
- 불필요한 동기화 피하기
- 동기화 범위를 최소화
- 데드락 방지
- 동기화 순서 일관성 유지
- 중첩된 락 사용 주의
- 메인 스레드 고려
- UI 업데이트는 반드시 메인 스레드에서 수행
iOS 앱에서 멀티스레딩을 구현하는 방법은 무엇인가요?
- 가장 일반적인 방법 - GCD(Grand Central Dispatch)
// 비동기 실행 DispatchQueue.global().async { // 백그라운드 작업 DispatchQueue.main.async { // UI 업데이트 } }
- async/await (iOS 13 이상)
func fetchData() async throws -> Data { let (data, _) = try await URLSession.shared.data(from: URL(string: "testURL"))
return data
}
Task { let data = try await fetchData()
}
3. Operation과 OperationQueue - 복잡한 작업에 적합
```Swift
let operationQueue = OperationQueue()
let operation = BlockOperation {
// 작업 내용
}
operationQueue.addOperation(operation)
Race Condition은 여러 스레드가 공유 자원에 동시에 접근할 때 발생할 수 있는 문제. 이를 방지하기 위한 방법들은 다음과 같습니다:
synchronized
키워드나 락(lock)을 사용하여 공유 자원에 대한 접근을 제어.Grand Central Dispatch (GCD): Apple의 저수준 API로, 작업을 큐에 제출하여 동시성을 관리.
DispatchQueue.global().async {
// 백그라운드 작업 수행
DispatchQueue.main.async {
// UI 업데이트
}
}
Operation과 OperationQueue: 더 높은 수준의 추상화를 제공하며, 작업 간의 의존성을 쉽게 관리할 수 있음.
let operation = BlockOperation {
// 작업 수행
}
OperationQueue.main.addOperation(operation)
NSThread: 저수준의 스레드 관리를 위한 클래스입니다. 하지만 GCD나 Operation을 사용하는 것이 더 권장.
Async/Await: Swift 5.5부터 도입된 구조화된 동시성 모델로, 비동기 코드를 동기 코드처럼 작성할 수 있게 해줌.
꼬리질문