Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

# 프로세스와 쓰레드 #11

Open
yoogail105 opened this issue Apr 13, 2022 · 1 comment
Open

# 프로세스와 쓰레드 #11

yoogail105 opened this issue Apr 13, 2022 · 1 comment

Comments

@yoogail105
Copy link
Owner

yoogail105 commented Apr 13, 2022

1. 프로세스와 멀티 프로세싱

프로그램

  • 어떤 작업을 위해 실행할 수 있는 파일
  • 파일 시스템에 존재하는 실행파일
  • ex. .exe, .pkg 등으로 끝나는 프로그램 파일들

프로세스

예를 들어

  • 위의 프로그램을 눌러서 실행하면, 운영체제가 그 프로그램을 실행시켜 준다.
  • CPU를 차지하면서 수행을 하는데, 이를 수행하는 주체가 프로세스이다.
  • 즉, 프로그램을 실행시키는 실행 주체, 인스턴스
  • ex. 크롬 프로그램을 눌러서 실행을 시켰을 때, 이를 CPU에 올리고 작업하는 것은 프로세스
    → 크롬에서 여러 창을 열 수 있는데 이는 각각의 프로세스
    → 크롬 창을 출력하는 작업을 실행하면, 이 역시 CPU에 올라가게 되고 이것도 하나의 프로세스

그래서 프로세스는

  • 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립 개체)
  • 동적인 개념으로는, 실행된 프로그램
  • 운영체제로부터 시스템의 자원을 할당받는 작업의 단위
    • 할당받는 시스템의 자원 종류: CPU시간, 주소 공간, 독립된 메모리 영역
  • 프로세스는 code, data, stack, heap 각각의 독립된 메모리 영역을 할당받는다.
  • 기본적으로 각 프로세스는 최소 1개의 스레드(main)를 가짐
  • 각 프로세스는 별도의 주소 공간에서 실행됨
  • 프로세스간에는 서로의 변수나 자료 구조에 대해서 절대 접근할 수 없다!
  • 프로세스 간 서로의 자원에 접근하려고 하면, 프로세스 간 통신(IPC, Inter-Process-Comunication)을 이용
    • 파이프, 파일, 소켓 등 프로세스간 통신 IPC를 사용해야 한다.

여러 개의 프로세스를 어떻게 관리할까?

  • 프로세스 식별자 processID(PID) 로 이름을 붙여서 관리

멀티 프로세싱

  • 하나의 프로그램을 여러 개의 프로세스로 구성
  • 각각의 프로세스는 하나의 작업task을 처리
  • 장점
    • 안정성이 높다.
      • 프로세스는 독립된 메모리 영역을 할당받기 때문에 서로의 자원에 침투 불가하기 때문
      • 하나의 프로세스에서 문제가 발생해도, 다른 프로세스는 문제 없음
  • 단점
    • CPU의 부담이 커지고, 오버헤드가 발생할 가능성 높다.
      • 우리의 체감 상 여러 프로세스들이 동시에 실행되고 있는 듯 보이나, 실제 CPU는 각각의 프로세스들을 빠르게 전환하며 한 번에 하나의 프로세스를 실행하고 있다.(Context Switching)
      • Context Switching: CPU에서 여러 프로세스를 돌아가면서 작업을 처리 하기 위해서, A 프로세스를 실행할 때는 메모리 영역에 A프로세스를 올리고, B 프로세스 실행 시엔 B프로세스를 올리는 식으로 동작한다.
      • 동작중인 프로세스가 대기를 하면서 해당 프로세스의 상태 보관, 대기하고 있던 프로세스가 동작하면서 이전에 보관했던 상태를 복구하는 작업
      • 이 때 CPU의 부담이 커지고 오버헤드가 발생할 수 있음
      • 왜? 프로세스는 독립된 메모리의 영역을 할당(공유 자원 X)
        → 캐시에 있는 모든 데이터를 리셋하고, 다시 메모리에 올릴 프로세스의 캐시 정보를 불러와야 한다.
  • 프로세스 간 자원의 공유가 어렵다.(IPC)

2. 쓰레드와 멀티 쓰레드

쓰레드Thread

  • 하나의 프로그램 내에서 동작되는 여러 실행의 흐름
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당받은 자원을 이용하는 실행의 단위
  • 프로세스 내부에서 동작 → 독립적인 메모리 영역 할당X
  • Code, Data, Heap 영역은 공유, Stack 영역만 독립적으로 할당
    • 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 쓰레드(sibling thread)도 변경 내용을 바로 반영 → 안정적X
    • stack만 독립?
      • stack이 LIFO → 먼저 들어온 작업이 순서대로 나오는 것이 아니라 흐름에 방해를 줌
    • 공유되는 영역은 자원에 접근 가능, 공유되지 않는 스택 영역엔 접근할 수 없음

멀티 쓰레드 Multi-thread

  • 하나의 프로그램을 여러 개의 쓰레드로 구성
  • 각 쓰레드마다 하나의 작업task을 처리
  • 여러 운영체제들이 멀티 프로세싱보다 멀티 쓰레드를 기본으로 함.

3. 멀티 프로세싱 vs 멀티 쓰레드 ?

  • 왜 여러 운영체제들이 멀티 프로세싱보다 멀티 쓰레드를 기본으로 하고 있을까?

멀티쓰레드 사용의 장점

  • 쓰레드간 code, data, heap 영역 공유 → Context switching이 빠름
    • 메모리에 현재 사용하는 자원을 올리고 내리고 하는 것 빠름
  • 프로세스를 생성하여 자원 할당하는 것 X → 생성 및 종료시간 빠름
  • 공유 영역 → 통신하는 방법이 간단함
    • cf. 멀티 프로세스의 경우, 파이프/파일/소켓 등 프로세스간 통신 IPC을 해야 함

멀티쓰레드 사용의 단점

  • 까다로운 설계
    • A 쓰레드가 접근하려는 힙 영역의 자원에 B 쓰레드가 갑자기 접근해서 바꾸는 등의 공유 문제 발생(동기화 문제)
    • 하나의 쓰레드에서 문제 생길 시 전체 쓰레드 영향 받음

🔖 출처

@yoogail105
Copy link
Owner Author

yoogail105 commented Apr 13, 2022

Main Thread / Global Thread

1. Main Thread

  • 하나 존재
  • 별도의 처리를 하지 않으면, main thread에서 동작
  • main thread에서 너무 많은 작업을 수행하게 되면 앱의 속도가 느려지고 오류 발생할 수 있음
  • main thread는 Interface Thread 라고도 불림
    • UI와 관련된 작업은 반드시 Main Thread에서 처리해야 한다.
    • 그렇지 않으면, 런타임 오류 발생

2. Global Thread(Background Thread)

  • iOS에서의 프레임워크들은 모두 백그라운드에서 구동된다.
    • 예를 들어, 사진을 다운받는다고 할 때 이에 필요한 작업을 모두 백그라운드에서 실행되고, 다운로드가 완료되었을 때의 알림을 delegate, completion handler를 통해 메인스레드에 알린다.
    • 만약 모든 프레임워크의 작업이 메인스레드에서 작동하면, 앱의 화면은 다운로드가 완료될 때까지(UI를 구현할 수 있는 자료가 생길 때까지) 멈춰있는 것처럼 보인다.
    • 따라서 오래 걸릴 것이라고 예상되는 작업에 대해서 백그라운드 스레드에서 실행되도록 처리를 해주어야 한다.

🔖 참고

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant