k-coding
iOS ) Process 와 Thread 본문
iOS ) Process 와 Thread
오늘은 Process 와 Thread에 대하여 알아보고 이 둘의 차이점이 무엇인지에 대하여 정리해보겠습니다.
우선 이 둘의 관계를 하나의 그림으로 표현하면 아마 이해가 제일 빠를 것 같습니다.
음... 가장 위에 있는 Program부터 정리해볼게요
Program은 정의상 한마디로 코드로 만들어진 집합체 입니다.
프로그램은 단순 코드 덩어리로 정적인 상태에서 메모리를 할당 받지않은 상태를 말합니다.
그럼 그 안에 Process와 Thread는 무엇일까요?
Process는 운영체제로부터 시스템 자원을 할당받는 작업의 단위입니다.
프로그램을 실행하게되면 프로세스가 됩니다.
Thread는 한 프로세스 내에서 실행되는 하나의 흐름의 단위로
CPU가 작업을 처리할 때 생각하는 최소단위입니다.
쓰레드는 프로세스가 아닌 프로세스 안에서 동작되는 흐름이기 때문에 메모리 영역을 독립적으로 할당받지 못합니다.
Memory
쓰레드는 메모리를 할당받지 못한다라.. 무슨 말일까요?
메모리의 구조는 4가지로 구성되어있는데 간단하게
Code, Data, Stack, Heap 이 네가지로 구성되어있습니다.
- Code : 코드 자체를 구성하는 메모리 영역
- Data : 전역변수, 정적변수, 배열, 구조체 등이 저장되는 영역
- Stack : 지역변수, 매개변수, 리턴 값 등 잠시 사용되었다가 사라지는 데이터가 저장되는 영역
- Heap : 메모리를 동적 할당하고자 할 때 사용하는 메모리 영역 (동적 메모리 영역)
프로세스는 운영체제로부터 시스템 자원을 할당받는 작업의 단위로써
각각의 독립된 메모리 영역을 할당받습니다.
독립된 메모리 영역을 할당 받기 때문에 프로세스끼리는 서로의 변수나 자료구조에 대하여 접근할 수 가 없습니다.
하지만 쓰레드는 위에서 프로세스 내에서 동작되는것이기에 메모리 영역을 독립적으로 할당받지 못한다고 했죠?
하지만 Stack 영역만 별도로 독립적 할당을 받을 수 있는데, 따라서 Process안에서 데이터 영역을 그림으로 보자면
아래와 같이 됩니다.
따라서 쓰레드는 서로의 Stack영역에는 접근이 불가능하지만, 프로세스의 Heap영역등에는 접근이 가능합니다.
멀티 프로세스 / 멀티쓰레드
멀티프로세스는 흔히 우리가 자주 들었던 멀티태스킹이라고도 합니다.
멀티프로세스를 사용하게 되면 하나의 프로그램에서 발생하는 작업들을 여러개의 프로세스가 각자 하나씩 처리합니다.
프로세스들은 서로간에 메모리영역에 접근할 수 없기 때문에 하나의 프로세스에서 문제가 발생하여도
다른 프로세스는 문제없이 안정적으로 작업을 진행할 수 있습니다.
하지만 작업중에 각 프로세스들의 메모리 영역에 Context Switching을 해주어야하기 때문에
CPU에 부담이 커지고 오버헤드가 발생하게됩니다.
그렇다면 멀티쓰레드는 무슨말일까요?
이 그림처럼 프로그램을 쓰레드로 구성해서 각 쓰레드마다 하나의 작업(Task)씩 처리하도록 하는 것입니다.
이처럼 멀티쓰레드는 사용하면 쓰레드 간 Stack을 제외한 Memory영역을 공유하기 때문에
Context Switching이 빠르고, 통신 방법도 훨씬 간단합니다.
대신 또 반대로 Stack을 제외한 Memory영역을 공유하기 때문에
자원 공유의 문제가 발생하여서 설계가 어렵고, 하나의 쓰레드에서 문제 발생 시 전체에 영향을 준다는 단점이 있습니다.
참조 문헌
https://babbab2.tistory.com/63
iOS) 프로세스(Process) vs 쓰레드(Thread)
안녕하세요! 소들입니다 :) 오늘은 쓰레드 관련해서 공부해볼 거예요!!!! 으으.. 네트워크 통신하다보면 Sync / Async 프로세스 / 쓰레드 Serial / Concurrent Main Thread / Global Thread 등등.... 이런 단어들..
babbab2.tistory.com
'iOS > iOS' 카테고리의 다른 글
iOS ) UIKit (0) | 2022.06.06 |
---|---|
iOS Main / Background Thread (0) | 2022.06.01 |
Scene Delegate , App Delegate (0) | 2022.05.29 |
상태 변화에 따라 동작을 처리하기 위한 델리게이트 메서드 (0) | 2022.05.29 |
App States (foreground / background) (0) | 2022.05.27 |