개발을 시작하는 이야기

Multi Thread를 구현해보자 (1) 본문

개발 이야기/우리동네 문화유산 :: JHeritage

Multi Thread를 구현해보자 (1)

Teiresias 2022. 4. 26. 21:24

지금의 내 앱은 싱글스레드만 사용하고 있다. 하나의 스레드만 사용해서 덜 복잡하고, 단순하게 작성할 수 있었지만 앱의 사용자 경험은 더 낮아졌다. 앱의 최초 실행 시 데이터를 저장하는데 소요되는 시간은 1분 정도 걸리는 것이 무척 불편한 편이고, 포트폴리오로 제출할 때 심각한 마이너스 요소라고 생각해서 이를 멀티스레드로 변경하려고 한다. 

그럼 일단 싱글 스레드, 멀티 스레드 라고 하는데 스레드가 뭘까?

일단 모르는 건 공식문서부터 보라고 배웠으니 공식문서를 살펴보자.

[공식문서 : Thread]

A thread of execution.

 스레드는 긴 작업을 수행해야 하지만 애플리케이션의 나머지 실행을 차단하고 싶지 않을 때 특히 유용하다. 특히 스레드를 사용하여 사용자 인터페이스 및 이벤트 관련 작업을 처리하는 응용 프로그램의 기본 스레드를 차단하지 않도록 할 수 있다. 스레드는 큰 작업을 여러 개의 작은 작업으로 나누는 데도 사용할 수 있으며, 이는 멀티 코어 컴퓨터에서 성능을 향상할 수 있다. 

 

그럼 스레드를 사용하면 어떻게 나머지 실행을 차단하지 않고 사용이 되는 걸까?

스레드를 좀 더 파 해쳐 보기 위해 Thread의 상위 카테고리인 Processes and Thread로 올라가 보자

[공식문서 : Processes and Thread]

Manage your app's interaction with the host operating system and other processes, and implement low-level concurrency features.

그러면 또 Process는 뭐지?

[공식문서 : Process]

An object that represents a subprocess of the current process.

프로그램의 하위 프로세스로 실행할 수 있으며 해당 프로그램의 실행을 모니터링할 수 있다. Process 개체는 별도의 실행 가능한 엔터티를 만든다. Thread 메모리 공간을 생성하는 프로세스와 공유하지 않기 때문에 다릅니다.

Important
In a sandboxed app, child processes you create with the Process class inherit the sandbox of the parent app. Instead, write helper apps as XPC Services because it allows you to specify different sandbox entitlements for helper apps. For more information, see Daemons and Services Programming Guide and XPC.

 

프로세스와 스레드

정리하자면 프로세스는 프로그램이 구동되어 메모리 상에서 실행되는 작업의 단위를 말하고, 프로그램이 실행되기 위해서는 운영체제로부터 독립된 메모리 영역을 할당받아야 한다. CPU는 한 번에 한 개의 명령어만 실행할 수 있다고 한다. CPU는 재빠르게 여러 프로세스들을 번갈아가며 실행하고 관리하고 있는 것이다.

 

Code: 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장되는 영역이다. CPU는 코드 영역에 저장된 명령어들을 하나씩 처리한다.

Data: 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역이다. 프로그램이 실행되면서 할당되고 종료되면서 소멸된다.

Stack: 함수 안에서 선언된 지역변수, 매개변수, 리턴 값 등이 저장된다. 함수 호출 시 기록되고 종료되면 제거된다.

Heap: 관리가 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 자유 공간이다.

 

스레드는 프로세스 내에서 실행되는 흐름의 단위이다. 스레드는 운영체제의 스케쥴러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다. 보통 프로그램은 하나 이상의 프로세스를 갖고 있으며 하나의 프로세스는 반드시 하나 이상의 스레드를 갖고 있다. 프로세스를 생성하면 기본적으로 하나의 메인 스레드가 생성된다.