Search
🌊

스레드란?

안녕하세요 iOS 개발자 워너비 루크라고 합니다
오늘은 스레드에 대해서 정리해보는 시간을 가지려고 해요!
설명시작하겠습니다!

스레드란?

스레드란 CPU 이용의 기본 단위이면서, 프로세스를 구성하는 단위.
프로그램이 실행되는 하나의 흐름이라고 생각하면 된다.
한 프로세스가 하나의 스레드만을 가진다면(하나의 흐름만이 존재한다면) 이 프로세스는 한번에 한가지 일 밖에 수행하지 못하기 때문에 여러 불편함이 발생합니다.

왜 멀티스레드 프로그래밍이 필요한가?

1.
Responsiveness : 응답성
싱글스레드 환경에서는 시간이 오래걸리는 작업을 시작시 이 작업이 완료될 때 까지 프로세스가 다른일을 못하게돼요...
즉, 유튜브를 예로들면 영상을 시청하면서 댓글을 작성할 수 없게 되는거죠...
하지만 오래걸리는 연산이 async 한 스레드에서 실행된다면, 프로세스는 연산을 실행하는 도중에도 사용자에게 응답할 수 있기 때문에 응답성이 좋아집니다.
2.
Resource Sharing : 자원 공유
프로세스간의 통신은
a.
message passing
b.
shared memory
이 두가지 기법으로 이루어지며 이는 프로그래머가 명시적으로 구현해야합니다
하지만 스레드는 자동으로 그들이 속한 프로세스의 자원과 메모리를 공유하기때문에, 그럴 필요가 없죠 :).
3.
Economy : 경제성
일반적으로 프로세스의 생성은 스레드의 생성보다 시간과 메모리를 더 소비한다.
이는 한 프로세스내에서 새로 생성되는 스레드는 이미 여러 자원들을 공유하고 있기 때문이죠.
또한 context switch 과정이 프로세스간에 이루어지는 것보다 스레드간에 이루어지는 것이 더 빠르다.
4.
Scalability : 규모 적응성
단일 스레드 프로세스는 코어가 많은 환경에서도 하나의 코어밖에 활용하지 못합니다.
요새 CPU 코어수가 많아지고 있죠. 그만큼 동시에 수행 가능한 연산의 흐름이 많아졌는데, 싱글스레드만을 활용한다면,,,, CPU 코어수의 증가는 의미가 없겠죠? ( 뽕을 뽑아야,,,)
멀티 스레드는 이처럼 멀티코어환경에서 효율을 보장해줍니다.
멀티스레딩이 이제 왜 필요한지,, 감이 좀 오시나요? ㅎㅎ
그럼 이제 우리가 해야할 일은 뭘지 알아 봅시다.

멀티스레딩 어떻게 하는건데?

프로그래머들은 멀티스레딩 과정에서 몇가지 과제를 해결해야하는데요.
여러 흐름이 생겨서 이러한 작업간에 독립성, 자율성이 보장해주려면,,,
서로간의 충돌이 생기는 경우도 많을 거에요,,, 그만큼 문제도 복잡해지고
이러한 문제들을 관리하기위해 우리가 해결해야할 과제는 5가지 정도랍니다.
1.
Dividing activities - 작업 선별
비동기적으로 실행이 가능한 task 들을 선별해야한다.
2.
Balance - 작업 N분의 1
비동기적으로 실행가능한 task 들은 그 퍼포먼스를 균등하게 분배받아야한다.
3.
Data Splitting - 데이터 분할
병렬실행을 위해 데이터를 분할해서 각 task 에 전달해야한다.
4.
Data dependency - 데이터 의존성 (synchronize)
병렬실행 후에는 데이터들이 병합(동기화) 되어야한다.
5.
testing and debugging - 테스트, 디버깅
동시성에 의해 스레드들의 실행 순서, 완료 순서의 가지수는 무궁무진하다. 이러한 모든 case 들을 test 하는 것은 어려운 일이며 이에 대해 디버깅을 하는것도 어려운일이다.
오늘은 스레딩이 무엇이고 왜 필요한지 구현시 어떤점들을 고려해주어야 하는지에 대해서 알아봤습니다