Apple-CS-interview / iOS-CS-interview

7 stars 0 forks source link

멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오. #15

Open Do-hyun-Kim opened 1 year ago

Do-hyun-Kim commented 12 months ago

멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오.

Process란 무엇인가?

프로세스(Process)란 실행되어 작업중인 컴퓨터 프로그램(Application)을 의미하며, 메모리에 이미 적재되어 있는 상태이고 CPU 자원을 할당 받아 프로그램이 실행되고 있는 상태를 의미한다. 즉 개발자가 구현한 코드를 실행한 것

image

thread란 무엇인가?

일반적으로 하나의 프로그램(Application)은 하나 이상의 프로세스(process)를 가지고 있고, 하나의 프로세스(process)는 반드시 하나 이상의 스레드(thread)를 갖는다. 즉 기본적으로 프로세스를 생성하면 하나 이상의 main thread를 생성하게 된다. 그 이후의 스레드 2, 스레드 3번은 개발자가 개별로 생성하게 된다.

image

multi thread

image

Swift Multi Thread 하기 위해서는?

Multi Thread 장점

context switch : 하나의 프로세스가 CPU를 사용중인 상태에서 다른 프로세스를 CPU를 사용중인 사용하도록 하기위해, 이전의 프로세스의 상태(문맥)을 보관하고 새로운 프로세스의 상태를 적재하는 작업

Multi Thread 단점

멀티스레딩 프로그래밍시 고려해야될 것

경쟁 상태(Race Condition)란 공유 자원 에 대해 여러개의 프로세스가 동시에 접근을 시도할때 접근의 타이밍이나 순서 등의 결과 값에 영향을 줄 수 있는 상태를 말한다. 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있다.

📝 참고 사이트

vichye-1 commented 11 months ago

프로세스란?

스레드란?

멀티 스레드란?

  1. 메모리 공간과 시스템 자원 소모가 줄어든다
  2. 쓰레드 간 code, data, heap 영역을 공유하기 때문에, context switching이 빠르다
  3. 생성/종료 시간도 프로세스보다 빠르다
    • 프로세스를 생성하여 자원을 할당하는 게 아니기 때문
  4. 프로세스간 통신 방법에 비해 스레드간의 통신 방법이 간단하다
    • stack영역을 제외하고 나머지 영역을 공유하기 때문에 통신 방법이 간단함

멀티 스레딩의 단점

  1. 동기화 문제
    • 서로 다른 스레드가 데이터와 Heap 영역을 공유하고 있기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어올 수 있다
  2. 병목현상이 발생하여 성능이 저하될 가능성이 있다
    • 과도한 락(lock)으로 인한 병목현상을 줄여야한다

멀티 스레드를 사용하는 이유

멀티 쓰레딩 프로그래밍시 고려해야할 점

📝 참고

ronick-grammer commented 11 months ago

멀티 쓰레드로 동작하는 앱을 작성하고 싶을 때 고려할 수 있는 방식들을 설명하시오.

프로세스 (Process)

운영체제로부터 시스템 자원을 할당받는 작업의 단위이다.

*문맥교환: 하나의 프로세스에서 다른 프로세스로 CPU 제어권이 이양되는 과정

스레드 (Thread)

한 프로세스 내에서 실행되는 실행 단위이다.

iOS 상에서의 멀티 스레드

GCD 사용시 고려할 점

📝 참고 사이트

Hminchae commented 11 months ago

프로세스(Process)

*stack은 함수 호출 시 전달되는 인자, 되돌아가는 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간임. 독립적인 스택을 가졌다는 것은 독립적인 함수 호출이 가능하다라는 것이다.

멀티 프로세스(Multi Process)와 멀티 스레드(Multi Thread)

멀티 프로세스

iOS 에서의 멀티스레딩 프로그래밍시 고려해야할 점들

  1. Mutable, Immutable

    • Immutable한 인스턴스는 스레드에 안전(Thread-safe)함. 스레드에서 한번에 접근해도 문제가 되지 않음
    • Mutable한 인스턴스는 스레드에 안전(Thread-safe)하지 않지만 읽기 전용으로만 사용한다면 문제가 되진 않음
    • Mutable한 인스턴스를 하나 이상의 스레드에서 변경이 이루어진다면 문제가 발생
  2. Synchronized

    • 메소드를 실행할 때 동시에 접근할 수 없도록 막고 싶을 때 해당 부분을 Lock을 걸 수 있음
    • Lock을 걸어줌으로써 한 스레드에서 해당 부분이 끝낼 때 까지 다른 스레드에서 접근할 수 없게됨
  3. GCD

    • Swift에서 스레드 관련 작업은 Grand Central Dispatch(GCD) API를 통해 처리함.
    • GCD는 클로저 블록 안에 있는 특정 작업을 큐에 올리고, 해당 큐를 특정 스레드에 실행하는 방식임
  4. Class, Struct

    • 클래스는 레퍼런스 타입, 구조체는 값 타입. 즉, 구조체가 파라미터로 전달될 때 스레드에 안전(Thread-safe)함
    • 멀티 스레드를 사용하여 개발을 할 때에는 스레드에 안전하지 않은(Thread-unsafe) 변수를 사용하고 있다면 변경 중에 동시에 접근하는 경우가 있는지 잘 체크해야함

참조