CS_프로세스, 스레드, 비동기

5w31892p·2023년 4월 4일
0

CS_Study

목록 보기
5/9

체크리스트

  • 프로세스와 스레드 개념 설명 가능?
  • 멀티 프로세스와 멀티 스레드 개념 설명하고 각각 장단점 서명 가능?
  • 비동기 개념 설명 가능?
  • 비동기 왜 필요한지 설명 가능?

  • 프로세스와 스레드는 CPU의 일거리
  • ram == memory / HDD == Hard Disk

CPU는 '요리사', memory는 '도마'

CPU는 한번에 하나의 프로세스만 실행이 가능하다.


프로세스

  • 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스
    • 인스턴스 : 설계된 것을 바탕으로 구현된 구체적인 실체
    • 붕어빵틀 (클래스), 붕어빵(인스턴스)
  • 운영체제로부터 시스템 자원을 할당받은 작업의 단위
    • 시스템 자원 : CPU 시간, 실행되기 위해 필요한 독립된 메모리 영역

  • 독립된 메모리를 할당 받음

    • 이 독립된 공간 == 프로세스 주소 공간
      • code : 코드 자체의 메모리 영역 (프로그램 명령)
      • data : 전역변수, 정적변수 ...
      • heap : 동적 할당 시 사용 (new(), ...)
      • stack : 지역변수, 매개변수, 리턴값 ... (임시 메모리 영역)
  • 최소 1개의 스레드를 가짐

스레드

  • 프로세스의 자원을 이용하는 여러 실행 흐름의 단위

  • code, data, heap : 다른 스레드와 공유
  • stack : 각각 따로 할당 받음
  • 프로세스와 해당 프로세스의 다른 스레드와 자원과 공간을 공유하면서 사용

멀티프로세스

  • 하나의 프로그램을 여러 프로세스로 구성 -> 각 프로세스가 하나의 작업 처리하도록 하는 것

장점

  • 여러 자식 프로세스 중 하나에 문제 발생해도 그것만 죽고 다른 영향 확산 안됨

단점

  • 문맥교환에서의 오버헤드(리소스 큼)
    • 문맥교환 : cpu는 한번에 하나의 프로세스만 처리 -> 여러 프로세스 처리해야할 때는 돌아가면서 처리하는데 이를 context switching이라고 함
    • 동작 중인 프로세스 대기하면서 해당 프로세스의 상태를 프로세스 제어 블록(PCB)에 보관 -> 다시 동작하면 보관했던 프로세스를 복구하는 작업
      • 프로세스 제어 블록 (Process Control Block)
        • cpu의 핵
        • 특정 프로세스 중요 정보 저장하고 있는 커널 내의 자료구조
  • 프로세스 간 통신 기법(IPC)
    • 각 독립된 메모리 할당 받았기 때문에 프로세사 사이의 변수 공유 할 수 없기 때문에 IPC를 사용해야하는데 이는 어렵고 복잡함

멀티 스레드

  • 하나의 프로그램을 여러 스레드로 구성하고, 각 스레드가 하나의 작업 처리

장점

  • 프로세스에 비해 메모리 공간이나 시스템 자원 소모 줄어듬
  • 스레드간 통신시 data, heap 영역 이용해 주고 받으므로 간단
  • 문맥교환시 PCB, 캐시 메모리 비울 필요 없음

단점

  • data, heap 등 공유하기 때문에 엉뚱한 값을 읽어오거나 수정할 수 있음 -> 자원 공유 동기화 문제 발생
  • 하나의 스레드 문제 발생 시 전체 프로세스에 영향

Thread-safe

  • 멀티스레드 환경에서 여러 스레드가 동시에 사용되도 안전하다는 것
  • 여러 스레드가 공유 자원에 접근할 때, 공유 자원의 무결성을 보장하는 것 (자원 동기화가 잘 되지 않는 이슈 없이 의도한 대로 잘 동작하는 것)

비동기

  • 제어권
    • 자신 함수 실행할 권리
    • 제어권 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에 돌려줌
  • 동시성
    • 함수 a, b 동시 진행되는 것처럼 보이는 것
    • 예를 들어 a 함수가 b 함수의 결과값에 의존하는지가 중요

블로킹 vs 논블로킹 (제어권이 누구한테 있는가)

  • 블로킹
    • a함수가 b함수를 호출한 뒤, b의 리턴값이 올 때까지 기다린 후 진행
    • 제어권 넘겨주는 것
  • 논블로킹
    • a가 b 호출 후, b 작업 완료 여부와 상관 없이 계속 진행
    • 제어권 넘겨주지 않는 것

동기 vs 비동기 (호출되는 함수의 작업 완료 여부를 신경쓰는가)

  • 동기
    • a가 b 호출 후, a가 b의 리턴값을 계속 확인하면서 신경 쓰는 것
  • 비동기
    • a가 b 호출 후, a가 b 작업 완료 여부 신경쓰지 않는 것

Java 비동기

  • 기본 : 멀티스레드 방식
  • JVM에 의해 스레드 스케줄링 이뤄짐
  • request 요청 처리, DB 접근 등에 활용

Spring WebFlux


프로세스 : 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스
스레드 : 프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위
멀티 프로세스 : 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
멀티 스레드 : 하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것


멀티 프로세스 vs 멀티 스레드, 언제 뭘 사용해야 하는가?
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제

멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지하고 Context Switching에 많은 비용이 든다는 단점

따라서 대상 시스템의 특징에 따라 오류가 나서 프로세스가 죽었을 때 크리티컬한 이슈가 발생하는지, Context Switching이 발생 빈도가 빈번한지 등을 따져 잘 선택


비동기가 왜 필요한지
엄청난 용량의 정보를 갖고있는 현대 웹페이지를 보다 유동적으로, 효율적으로 움직이게 하기 위해서

0개의 댓글