25일차 수업에서 배운 내용을 정리한 글입니다.
Learned
프로세스(Process)
1) 프로그램
- 특정 작업을 수행할 수 있고 컴퓨터가 실행시킬 수 있는 코드
- 프로그래밍 언어로 짜여진 코드는 컴파일러에 의해 컴퓨터가
이해할 수 있는 언어로 번역된다.
2) 프로세스
- 컴퓨터에 의해 실행되어 메모리에 올라간 프로그램
- 프로세스는 최소 한 개의 스레드(메인 스레드)를 갖는다.
- 프로세스마다 독립적인 메모리 공간을 가지기 때문에 다른 프로세스의
메모리에 접근할 수 없다.
멀티 스레드
1) 개념
- 스레드란 프로세스에서 수행되는 작업의 단위
- 멀티 스레드란 하나의 프로세스에 여러 스레드가 존재해서
각 스레드마다 여러 작업들이 동시에 수행되는 것을 의미함. - 동시에 여러 작업을 수행하기 때문에 빠르게 처리할 수 있다는 장점이 있지만
어떤 작업이 먼저 수행되고 종료되는지 알기 어렵다는 단점이 있음.
2) GCD (Grand Central Dispatch)
- 멀티 코어 시스템에서 멀티 스레딩(동시성 실행) 기능을 지원하는 애플의 기술을 말함.
- GCD 기술을 이용해 멀티 스레딩을 구현할 수 있는 스위프트의 API가 DispatchQueue이다.
- 기존에 스레드를 생성하고 각 스레드에 대한 작업 할당 필요없이
Queue에 작업을 넘겨주는 것만으로 멀티 스레딩 구현이 가능하다. - Queue의 종류
- DispatchQueue
- 보통 GCD를 DispatchQueue로 지칭하며 비교적 구현이 간단함.
- 스레드에서 수행할 작업을 클로저로 표현
- 일반적으로 DispatchQueue를 많이 사용하지만 상황에 따라
OperationQueue를 사용하기도 함.
- OperationQueue
- DispatchQueue에 여러 기능이 추가된 형태
- 작업의 취소, 일시정지, 재개 등 DispatchQueue보다
복잡한 기능을 구현할 수 있음.
- DispatchQueue
3) Dispatch Queue
- main, global, custom 3가지 종류의 Queue가 존재함.
- DispatchQueue.main
- Serial(직렬) 특성을 가지기 때문에 큐에 들어온 작업을
일렬로 나열하여 하나씩 순서대로 처리함. - 만약 먼저 들어온 작업이 처리되지 않으면 이후에 들어온
모든 작업들은 수행되지 않음. - 즉, 여러 스레드를 사용해 작업을 분산하지 않고 메인 스레드에서만
모든 작업을 순서대로 처리함. - 모든 UI 관련 작업은 메인 스레드에서 담당함.
- Serial(직렬) 특성을 가지기 때문에 큐에 들어온 작업을
- DispatchQueue.custom
- 기본적으로 Serial 특성을 가지지만 Concurrent로 바꿀 수 있음.
- 이름과 특성을 설정하여 커스터마이징된 DispatchQueue
- DispatchQueue.global
- Concurrent(동시) 특성을 가지기 때문에 큐에 들어오는 모든 작업을
여러 스레드에 분산시켜 할당함. - 각 작업들은 여러 스레드에서 동시에 수행됨.
- QOS가 지정된 큐를 사용해서 작업 우선 순위를 정하고 리소스를 효율적으로 사용할 수 있음.
- Concurrent(동시) 특성을 가지기 때문에 큐에 들어오는 모든 작업을
QOS (Quality Of Service)
1. userInteractive
유저 상호작용과 관련된 작업을 처리하며 우선 순위가 가장 높음
ex) UI의 업데이트, 이벤트 처리, 애니메이션 등
2. userInitiate
사용자에게 즉각적으로 결과를 전달해야하는 작업을 처리하며 두번째로 우선 순위가 높음
ex) 유저에게 보여줄 이메일 정보를 불러오기, 저장된 문서 불러오기
3. utility
즉각적인 결과를 요구하지 않거나 시간이 오래 걸리는 작업을 처리하며 위 2가지보다 우선 순위가 낮음.
ex) 데이터 내보내기, 다운로드 (진행 상황 표시)
4. background
앱이 백그라운드 상태일때 진행되는 작업을 처리하며 가장 우선 순위가 낮음.
ex) 데이터 백업 등 유저에게 보여지지 않는 대부분의 작업
동기와 비동기
1) 동기 (Synchronous)
- 진행중인 작업이 완료될때까지 다른 작업을 하지 않고 기다림.
- 작업의 순서가 중요하거나 결과를 받아야하는 경우 동기 코드 작성
2) 비동기 (Asynchronous)
- 진행중인 작업을 기다리지 않고 다음 작업을 수행함.
- 동시에 여러 작업을 수행할 수 있다는 장점이 있지만 작업 순서가 보장되지 않음.
메인 스레드에서 Global Queue로 동기적 작업을 보낼 경우
메인 스레드가 다른 스레드에서 수행되는 해당 작업이 완료될 때 까지 기다려야 하기 때문에
실질적으로 메인 스레드에서 직접 작업을 처리한다.
고차함수
1) 개요
- 매개 변수로 함수(클로저)를 받거나 함수를 반환하는 함수
- 함수는 1급 객체이기 때문에 매개변수, 반환값, 변수 또는 상수로 사용 가능
- 반복문, 조건문을 사용하는 것보다 간단하고 효율적으로 연산할 수 있음.
실제 시간을 계산해보면 데이터 크기가 클 때 고차함수의 연산이 더 빠르다.
2) 대표적인 고차함수
- filter
- 각 원소를 매개변수로 받아서 조건을 반환하는 클로저 실행
- 특정한 조건을 만족시키는 데이터만 추출할 때 사용
- 클로저 내부에서 조건을 만족시키는 원소만 반환
// 1부터 100 사이의 정수 중 짝수만 추출
let evenNumber = [Int](1...100).filter { $0/2 == 0 }
- map
- 각 원소를 매개변수로 받아서 특정 값을 반환하는 클로저 실행
- 기존의 데이터를 사용해서 새로운 데이터를 만들고 싶을 때 사용
- 기존 데이터를 변경하지 않고 새로운 데이터를 반환함.
// 1부터 100 사이의 정수를 2배해서 반환
let doubleNumber = [Int](1...100).map { $0*2 }
- reduce
- 2개의 매개변수를 받아서 연산한 값을 반환하는 클로저 실행
- 기존 데이터를 하나의 값으로 합치고 싶을 때 사용
- 메서드의 매개변수로 초기값이 필요하다.
// 1부터 100 사이의 모든 정수에 대한 평균
let average = [Int](1...100).reduce(0){ $0+$1 } / 100
참고 자료
https://jeonyeohun.tistory.com/279
https://velog.io/@zeke/whatsDispatchQueueQoS
'TIL' 카테고리의 다른 글
[Sesac IOS] 28일차 TIL (0) | 2022.08.11 |
---|---|
[Sesac IOS] 26~27일차 TIL (0) | 2022.08.09 |
[Sesac IOS] 24일차 TIL (0) | 2022.08.05 |
[Sesac IOS] 23일차 TIL (0) | 2022.08.04 |
[Sesac IOS] 22일차 TIL (0) | 2022.08.03 |