Threads in Computer Science: An In-depth Exploration
컴퓨터에서, 스레드는 프로세스의 근본적인 측면 중 하나입니다. 프로세스는 한 마디로 실행되고 있는 프로그램 입니다. 프로세스는 프로그램의 코드와 현재 활동을 포함되며, 스레드는 os내의 실행을 위한 커널 스케줄 내의 entity 입니다. 개념을 제공하기 위해 함수를 스레드의 컨테이너로 생각할 수 있습니다. 가각의 실행은 컨테이너 내에서 실행됩니다
Thread Basics
스레드는 가벼운 프로세스로 언급되기도 합니다. 그들은 os에서 실행되어 질 수 있는 가장 작은 단위의 프로세스 입니다. 모든 스레드는 register들, program counter, 같은 프로레스내에 다른 스레드와 공유할 수 잇는 프로세스의 주소 공간 내의 스택들과 같은 자원들과 연관되어 있습니다. 이것은 스레드 간에 소통하고 같은 데이터 구조와 변수를 읽고 쓸 수 있도록 합니다
Multithreading
하나의 프로세스내에서 복수개의 동시 실행을 지원하기 위한 os의 능력을 multithreading이라 합니다. 멀티스레딩은 프로세스 내에서 같은 데이터 공간을 공유하기 위해 multile thread를 허용합니다. 멀티스레딩은 생산성을 올리기 위한 널리퍼진 기술입니다. 특히 무거운 입/출력을 요하는 어플리케이션에서 그렇습니다. 동시에 하나 이상의 operation을 서버와 컴퓨터에서 수행할 수 있는 이점을 취할 수 있습니다.
Benefits of Using Threads
스레드는 아래와 같은 여러개의 이점으로 유명합니다
1. **Improved responsiveness:** 만약 스레드가 응답을 위해 대기중이라면 어플리케이션은 다른 스레드를 수행할 수 있습니다
2. **Resource sharing:**. 스레드는 메모리와 스레드 간에 소통을 위한 프로세스의 자원을 공유합니다.
3. **Economical:** 프로세스를 만들기 위해 메모리와 자원을 할당하는 것은 비용이 비쌉니다. 스레드는 그들이 속한 프로세스의 자원을 공유하기에 개발과 관리에 있어서 더 경제적입니다.
4. **Utilization of multiprocessor architectures:** 스레드의 장점들은 멀티 프로세서 시스템에서 더 유용합니다. 싱글 스레드 프로세스는 몇 개의 cpu가 더 가능하더라도 하나의 cpu에서만 동작합니다. 복수개의 cpu에서의 멀티스레딩은 병렬성을 증가시키고 시스템의 thoughput을 증가시킵니다.
### Challenges with Threads
많은 장점들에도 불구하고 스레드를 사용하는 것에 있어 몇몇 도전적인 과제들이 있습니다:
1. **Synchronization:** 스레드는 같은 주소 공간을 공유하기 때문에 한 스레드에서의 함수의 실행은 다른 스레드의 성능에 영향을 끼칠 수 있습니다. 이것이 스레드 동기화의 요구사항의 필요성이 나오는 이유입니다.
2. **Deadlocks:** 데드락은 복수개의 스레드들이 같은 잠겨버린 리소스를 필요할 때 발생합니다. 어플리케이션의 멈춤을 유발합니다
3. **Debugging:** 멀티스레드 프로그램의 디버깅은 각 스레드들이 복잡하게 상호작용 하고 의도하지 않은대로 동작할 수 있어 복잡합니다
이러한 단점들에도 불구하고 스레드는 더 높은 성능을 만들기 위한 강력한 도구입니다. 그들은 cs에서 근본적인 개념이고 이를 이해하는 것은 더 나은 프로그래밍을 위해 필요합니다. 특히 분산 컴퓨팅, 동시성, os에서 그렇습니다
## Now that we have a basic understanding of what threads are, let’s delve into threads in the context of React Native
## Deep Dive into Different Threads in React Native
리액트 네이티브에서 자바스크립트는 3개의 주요 스레드를 가집니다
1. **Main (UI) Thread**
2. **JavaScript Thread**
3. **Native Modules Thread**
Render Thread 는 Android 5.0 이상에서 가능합니다. 각 스레드는 React natvie 어플리케이션 기능해서 각자 다른 역할을 수행합니다.
### 1. Main (UI) Thread
모든 네이티브 UI 컴포넌트들이 만들어지고 동작되는 주요한 스레드 입니다. 사용자와의 상호작용을 다루고 화면의 업데이트, UI 요소들의 render를 다룹니다
모든 React Native Ui의 업데이트는 이 스레드에서 발생합니다. 그러므로 상태를 빈번하게 조작한다면 이 스레드는 바빠지고 퍼포먼스 이슈를 유발할 수 있습니다.
### 2. JavaScript Thread
React Native 어플리케이션은 자바스크립트 스레드에서 발생하는 분리된 자바스크립트 엔진에서 자바스크립트 코드를 실행합니다. API call, 터치 이벤트를 다루는 것 그리고 자바스크립트 코드의 실행을 포함합니다.
이 스레드는 React와 자바스크립트 코드가 실제로 실행되는 곳입니다. 이 스레드는 모든 JS-side 로직 예를 들면 API 호출, 터치 핸들링, 비즈니스 로직의 수행을 합니다
### 3. Native Modules Thread
React Native는 자바스크립트 없이 네이티브 동작을 수행해야 할 때 네이티브 언어로 코드를 작성할 수 있습니다. 네이티브 모듈로 알려져 있고 네이티브 코드의 실행은 Native Module 스레드에서 이루어집니다
React Native app에서 네이티브 코드를 쓰고 있다면 native module 스레드가 어플리케이션의 반응을 위해 자바스크립트 스레드로부터 무거운 동작을 수행합니다
### 4. Render Thread (Android 5.0+)
이 스레드는 Android 5.0에서 소개되었습니다. 메인 스레드로 부터 rendering하는 작업을 가져옵니다. 높은 frame의 복잡한 애니메이션들을 수행하는데 이점이 있습니다
## Code Examples
React Native는 몇몇 특별한 메소드들을 통해 별도의 스레드에서 실행할 수 있도록 합니다. 예를 들면
1. **JavaScript Thread**:
대부분의 자바스크립트 코드는 이곳에서 실행됩니다. 예를 들면 API로부터 데이터를 받고 와서 상태를 업데이트 하는 부분입니다
fetchData = async () => {
const response = await fetch("https://api.example.com/data");
const json = await response.json();
this.setState({ data: json }); // this line is executed in the JavaScript thread
}
2. **Main Thread**: UI 컴포넌트들의 상호작용은 이곳에서 이루어집니다. 예를 들면 Animated Api를 사용하여 애니메이션을 수행하는 것입니다:
Animated.timing(this.state.fadeAnim, {
// this executes on the UI thread
toValue: 1,
duration: 2000,
}).start();
3. **Native Modules Thread**: 네이티브 모듈을 사용하고 있다면 코드는 이곳에서 실행됩니다. 예를 들면 안드로이드에서 토스트 모듈을 사용하는 것입니다.
// This is Java code that will run on the Native Modules Thread
@ReactMethod
public void show(String message, int duration) {
Toast.makeText(getReactApplicationContext(), message, duration).show();
}
이 예시에서 show 메서드는 Javascript로부터 실행되었지만 실행은 Native Module 스레드에서 됩니다
React Native를 개발하면서 이러한 스레드들을 이해하는 것은 중요합니다. 더 나은 퍼포먼스와 반응성을 위해서는.
Main Thread를 접근가능하게 유지하는 것은 부드러운 Ui와 애니메이션을 위해 중요합니다
## Using Different Threads in React Native
React Native 어플리케이션에서 각 스레드는 각자의 역할이 있고 태스크들을 수행하기 위해 다양하게 활용되어집니다. 아래에서 각 스레드의 쓰임과 예시를 살펴볼 것 입니다.
\**_1. Main (UI) Thread_**
메인 스레드 혹으 Ui 스레드는 ui를 그리고 사용자와의 반응에 주로 관여됩니다. 이 스레드의 주요한 역하은 인터페이스의 부드러움과 반응성을 유지하는 것입니다. 사용자와의 상호작용, 화면 이동, 발생해야 하는 애니메이션들은 이곳에서 수행됩니다.
예를 들면, Animated Api를 사용해서 컴포넌트의 opactiy를 조절해야 한다면 이 스레드에서 동작합니다
Animated.timing(this.state.fadeAnim, {
toValue: 1,
duration: 2000,
}).start();
위의 코드에서 Animated.timing은 2초에 걸쳐 컴포넌트의 투명도를 조절합니다.
**_2. JavaScript Thread_**
자바스크립트 스레드는 React와 Javascript코드가 수행되는 곳입니다. 어플리케이션의 비즈니스 로직, 자바스크립 계산, API 호출, 상태관리, 터치 이벤트 관리 등이 이 스레드에서 이뤄집니다.
Api로 부터 데이터를 받고 상태를 업데이트 해야한다면 이 자바스크립트 스레드에서 동작합니다
fetchData = async () => {
const response = await fetch("https://api.example.com/data");
const json = await response.json();
this.setState({ data: json }); // these operations happen on the JavaScript Thread
Here, the `fetchData` function is called to fetch data from the API, and the received data is set in the component state. This entire operation runs on the JavaScript Thread.
**_3. Native Modules Thread_**
자바스크립트 불가능하거나 비효율적인 동작을 수행해야한다면, 네이티브 언어로 코드를 작성할 수 있습니다. 이것이 native 모듈로 알려져 있습니다. 이러한 네이티브 모듈의 동작은 네이티브 모듈 스레드에서 수행됩니다.
예를 들면 device IMEI 번호를 가져오는 네이티브 모듈을 작성했다고 하였을때 아래의 코드는 이 모듈을 호출하는 자바스크립 코드 입니다
import { NativeModules } from "react-native";
// Retrieve the IMEI number using a hypothetical native module
NativeModules.DeviceInfo.getIMEI((imei) => {
console.log(imei);
});
DeviceInfo와 getIMEI 메서드는 네이티브 모듈 스레드에서 수행됩니다
**_4. Render Thread (Android 5.0+)_**
Render 스레드는 Android 5.0에서 소개되었고 서로 다른 cpu 스레드에서 더 복잡한 rendering 계산을 수행합니다. 메인 스레드가 바쁠때 애니메이션을 부드럽게 할 수 있습니다. 그러나 Render 스레드의 사용은 추상적인 방식이고 시스템에 의해 관리되어 져서 개발자의 코드와 직접적으로 동작하진 않을 것 입니다.
요약하자면 ReactNatived에서 각 스레드의 역할과 사용을 이해함으로써 개발자들은 어플리케이션의 퍼포먼스, 반응성, 사용자 경험을 극대화 할 수 있습니다. 이러한 이해는 프레임워크의 모든 포텐셜과 견고한 모바일 어플리케이션을 만드는데 도움이 됩니다