[Swift] Mutil - Thread

iOSoo·2021년 10월 1일
0
post-thumbnail

[프로세서와 프로세스]

단일 프로세스

멀티 프로세스

요리사와 식당에 비유하자면 프로세서는 요리사이고 대량주문이 들어오는 이 식당에서 끊임없이 만들어 내는 요리들(김밥, 떡볶이, 잡채말이)이 프로세스이다.

컴퓨터는 프로세스마다 자원을 분할해서 할당을 한다.

예를 들어 라면을 끓이는 섹션, 김밥을 마는 섹션, 햄버거를 만드는 섹션등 여러 조리공간을 만들어서 조리사 혼자 여러 공간을 돌아다니면서 요리하는 것(프로세스) / 요리가 여러명이 조리공간을 분담해서 요리를 하는 것 (멀티 프로세스)이 있을 수 있다.

[Thread]

1. Thread란?

  • 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위

2. Thread에 대해서

  • 쓰레드는 프로세스가 아닌 프로세스 내에서 작동하는 것이기 때문에 메모리 영역을 독립적으로 할당 받지 못한다.

  • 따라서, 위의 사진과 같이 Code, Data, Heap 영역은 공유하고 Stack 영역만 독립적으로 할당받을 수 있다.

  • 쓰레드들 끼리는 Heap 영역을 공유하여 같은 자원에 접근할 수 있지만, 각자의 스택 영역은 서로 접근할 수 없다.

3. Thread의 장점

  1. 자원 접근에 대한 동기화를 신경쓰지 않아도 된다. 여러 개의 스레드가 공유된 자원을 사용할 경우 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며 이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킨다. 단일 스레드 모델에서는 이러한 작업이 필요하지 않다.

  2. 문맥 교환(context switch) 작업을 요구하지 않는다. 문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.

4. Thread의 단점

  1. 여러 개의 CPU를 활용하지 못한다. 프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다. 이 때 고려해야할 문제가 있는데, 바로 다수의 프로그램 인스턴스가 어떻게 상태를 공유할 것인가에 대한 문제다. 사실 이것은 멀티 스레드 환경의 서버 프로그램도 확장성을 확보하기 위해 풀어야 할 숙제이긴 하다.
    단순하고 빠른 메모리 기반 NoSQL 데이터 베이스인 Redist가 좋은 고려대상이다. 하지만 서버 프로그램 인스턴스 간 상태 공유를 최소화하거나 가능하면 없애는 방향으로 아키텍처를 설계하는 것이 가장 바람직한 방법이라고 한다.

브라우저를 실행할 때 하나만 실행하는 것이 아니라 영상도 보고 게임도 다운 받고 파일도 다운 받는다. (즉, 한 프로세스 내에서 여러 갈래의 작업들을 하는 것)

사진으로 표현하면 아래의 파란색 화살표가 하나의 프로세스이고 노란색 화살표가 Thread라고 할 수 있다.

  • 위의 요리사와 식당처럼 쓰레드를 비유하자면 아래의 사진처럼 햄버거를 조리하는 한 조리공간이 프로세스이다.

  • 패티를 굽는 쓰레드. 빵을 굽는 쓰레드, 야채를 올리고 소를 뿌리는 쓰레드등 한 메뉴의 여러 쓰레드들이 한 프로세스에서 조리된다.

  • 프로세스들은 컴퓨터의 자원을 분할해서 쓰지만 쓰레드는 프로세스마다 주어진 자원을 함께 쓴다.

[Multi Thread]

1. Multi Thread란?

  • 여러 개의 스레드가 동시에 진행되는 것을 의미한다.
  • 하나의 프로세스 내에서 여러 개의 스레드가 존재하고, 스레드들이 프로세스를 공유하되 실행은 독립적으로 이루어지는 구조

2. Multi Thread의 장점

  1. 메모리 공간과 시스템 자원 소모가 줄어든다. → 쓰레드 간 Code, Data, Heap 영역을 공유때문에
  2. 프로세스간 통신 방법에 비해 스레드간의 통신방법이 간단하다. → stack 영역을 제외하고 나머지 영역을 공유하기 때문에
  • 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고 받기 때문이다.

3. Multi Thread의 단점

  1. 설계가 어렵다. → Stack영역 빼고 공유를 하기 때문에 → A쓰레드가 접근하려는 힙 영역의 자원을 B가 갑자기 접근해서 바꿔버리는 등 자원 공유의 문제가 생기기 때문(동기화 문제)
  2. 하나의 쓰레드에서 문제가 발생 시 전체 쓰레드가 영향을 받는다. → 비독립적이기 때문에

4. Multi Process vs Multi Thread

[쉬운 요약]

  • 단일 프로세스 : 한 요리사가 중식, 한식, 일식 모두를 하는 것

  • 멀티 프로세스 : 각각의 중식요리사, 한식요리사, 일식요리사가 각자 맡은 요리를 하는 것

  • 단일 쓰레드 : 일식요리사가 회를 만들 때 회를 써는 것

  • 멀티 쓰레드 : 중식요리사가 짜장면을 만들기위해서 면도 만들고, 소스도 만드는 것

profile
애플을 좋아하는 비전공생

0개의 댓글