21.07.03
공부한 것을 정리하는 용도의 글이므로 100% 정확하지 않을 수 있습니다.
참고용으로만 봐주시고, 내용이 부족하다고 느끼신다면 다른 글도 보시는 것이 좋습니다.
+ 틀린 부분, 수정해야 할 부분은 언제든지 피드백 주세요. 😊
by. ryalya
들어가기 전
Program : 어떤 문제를 해결하기 위하여 그 처리 방법과 순서를 기술하여 컴퓨터에 주어지는 일련의 명령문 집합체
Process : OS로부터 자원을 할당받는 독립적인 작업의 단위
Thread : process가 할당받은 자원을 이용하는 실행의 단위
프로세스(process)란 연속적으로 실행중인 프로그램(program)을 의미한다. (= job / task)
process는 여러 가지 자원을 사용하게 되는데, 해당 명령을 수행하기 위해 운영체제에 따라 CPU를 점유 할 수 있으며 명령어와 데이터를 저장하기 위해 물리적인 메모리를 사용한다.
이러한 process는 program에 사용되는 데이터와 메모리 등의 자원 그리고 스레드(thread)로 구성된다.
process는 각각의 독립된 메모리 영역을 할당 받는데, 그 메모리 영역은 아래와 같다.
각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용
는 하나의 프로그램을 여러 개의 프로세스로 구성하여,각 프로세스마다 하나의 작업(Task)씩 처리하도록 하는 것을 말한다.
스레드(Thread)는 프로세스 내의 독립적인 순차흐름 또는 제어를 말한다.
멀티 스레드(Multi-Thread) : 하나의 프로세스에서 여러 개의 스레드가 병행적으로 처리
❓ 다른 자원들은 공유하면서 스택은 분리해서 사용하는 이유
→ LIFO(Last In First Out) / 후입 선출이라는 스택의 특성과도 연관이 있다.
왜냐하면? 코드와 데이터 힙 영역을 공유하는 것에는 큰 문제가 없지만,
스택 영역은 스택이 쌓이면 위에서부터 프로세스가 섞인 채로 순서대로 나오게 되므로
더 복잡해지기 때문에 원활한 실행 흐름을 위해 스택은 따로 독립적으로 존재하게 되는 것.
스레드란 개념은 프로세스 안에 포함되어 있다. 프로세스는 실행중인 프로그램 객체 자체를 말하고, 하나의 실행흐름 자체를 스레드라고 한다.
또한, 하나의 프로세스안에 스레드가 여러개 있는 것을 멀티 스레드라고 한다.
네트워크 프로그래밍을 할때에는 멀티 쓰레딩이 필요하며, 특히 게임프로그래밍에서 많이 사용한다.
예를 들어 사용자가 게임을 하려면 크게 1.사용자의 input, 2.네트워크로부터 전송되는 input 두개의 input이 있게 되며 1,2는 동시에 병렬적으로 일어나야 한다.
네트워크 프로그래밍에서는 반드시 필요하다. 예를 들면, 가장 간단한 네트워크 프로그래밍인 채팅 프로그램에서는 채팅메시지에서 채팅을 쓰는 부분(키보드 input), 상대방의 채팅메시지를 전달받는 부분(network input) 결과적으로 single thread에서는 부자연스럽기 때문이다.
하나의 실행중인 프로세스 안에 여러개의 태스킹을 동시에 실행하고 싶을때 스레드를 이용할 수 있다.
간단 요약
1. Multi-Process
→ 하나의 컴퓨터에 여러 CPU 장착하여 하나 이상의 프로세스들을 동시에 처리(병렬)
- 장점 : 독립된 구조 → 안전성이 높음
- 단점 : 각각 독립된 메모리 영역을 갖고 있어, 작업량 많을수록 오버헤드 발생.
Context Switching으로 인한 성능 저하.
2. Multi-thread
- 장점 : 프로그램의 응답 시간 단축.
시스템의 처리율이 향상.
시스템의 자원 소모 감소.
프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 간단함.- 단점 : 여러 개의 스레드를 이용하는 경우, 미묘한 시간차나 잘못된 변수를 공유함으로써 오류 발생 가능
따라서 스레드 간에 통신할 경우에는 충돌 문제가 발생하지 않도록 동기화 문제를 해결해야 함.
프로그램 디버깅이 어려움.
단일 프로세스 시스템에서는 효과를 기대하기 어려움.
요약
- iOS에서는 멀티쓰레드를 지원한다.
- UI업데이트에 관한 작업들은 메인 스레드(main thread)에서 구현되어야 한다.
- 스레드에 안전하지 않은(Thread-unsafe)변수는 서로 다른 스레드에서 동시에 접근하면 위험하기 때문에 신경을 많이 써야 한다.
1. Mutable, Immutable
Immutable한 인스턴스는 스레드에 안전(Thread-safe)하다.
즉, 여러 스레드에서 한번에 접근해도 문제가 되지 않는다.
Mutable한 인스턴스는 스레드에 안전(Thread-safe)하지 않지만 읽기 전용으로만 사용한다면 문제가 되지 않는다.
하지만 Mutable한 인스턴스를 하나 이상의 스레드에서 변경이 이루어진다면 문제가 발생한다.2. 프로퍼티 속성
프로퍼티 속성에는 atomic, nonatomic이 있다.
어떤 프로퍼티를 두 개의 스레드가 참조하고 있는 상황에서 해당 프로퍼티 접근자 메서드가 atomic하지 않는다면 값에 대한 싱크가 맞지 않아 문제가 발생할 수 있다. 이런 경우에 atomic으로 설정되어야 한다.
하지만, Mutable한 인스턴스가 변경 중에 동시 접근할 경우가 없다면 nonatomic으로 사용해도 무방합니다.3. Synchronized
메소드를 실행할 때 동시에 접근할 수 없도록 막고 싶을 때 해당 부분을 Lock을 걸 수 있다.
Lock을 걸어줌으로써 한 스레드에서 해당 부분이 끝낼 때 까지 다른 스레드에서 접근할 수 없게 된다.4. GCD (Grand Central Dispatch)
Swift에서 스레드 관련 작업은 Grand Central Dispatch API를 통해 처리한다.
GCD는 클로저 블록 안에 있는 특정 작업을 큐에 올리고, 해당 큐를 특정 스레드에 실행하는 방식이다.
애플이 스레드 프로그래밍을 효율적으로 할 수 있게 만들어준 만큼 적절하게 사용하여 Thread-safe하게 구현하는 것이 중요하다.5. Class, Struct
클래스는 레퍼런스 타입, 구조체는 값 타입이다.
즉, 구조체가 파라미터로 전달될 때 스레드에 안전(Thread-safe)하다.
Process & Thread 개념 출처 1
Process & Thread 개념 출처 2
Process & Thread 개념 출처 3
Process & Thread 개념 출처 4
멀티 프로세스 & 멀티 스레드 표 출처