CS 실시간 강의_동기&비동기

5w31892p·2022년 11월 18일
0

CS

목록 보기
2/3

📜 CS 특강

:: ✍ 프로세스 | 스레드 | 비동기 개념

CPU : 요리사
RAM(MEMORY) : 작업대

프로세스와 스레드

  • 운영체제(OS, Operating System)에서 배우는 개념

비동기

  • CS 개념이라기보단 개발하다보면 많이 접하는 개념

:: Process

  • 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스
  • 운영체제로부터 시스템 자원을 할당받은 작업의 단위
  • 서로 영향 끼치지 않음

인스턴스

  • 설계된 것을 바탕으로 구현된 구체적인 실체
  • 붕어빵 틀(클래스), 만들어진 붕어빵(인스턴스)

시스템자원

  • CPU 시간
  • 실행되기 위해 필요한 독립된 메모리 영역

프로세스는 독립된 메모리를 할당 받음

  • 프로세스가 메모리를 관리하기 위해 이 공간들을 어떤 구조로 관리하는데, 이를 프로세스 주소 공간이라고 함
  • 프로세스 주소 공간은 Code, Data, Stack, Heap 으로 구성
    • Code: 코드 자체를 구성하는 메모리 영역(프로그램 명령)
    • Data: 전역변수, 정적변수 등
    • Stack: 지역변수, 함수 매개변수, 리턴 값 (임시 메모리 영역)
    • Heap: 동적 할당 시 사용 (new(), malloc() 등)
  • 기본적으로 프로세스마다 최소 1개의 스레드(메인 스레드)를 갖음

:: Thread

  • 프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위
  • 스레드는 프로세스 내의 Code, Data, Heap 영역은 다른 스레드와 공유하고 Stack 영역을 따로 할당받음
  • 프로세스와 해당 프로세스 내의 다른 스레드와 자원과 공간을 공유하면서 사용

:: 멀티프로세스

  • 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리

장점

  • 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽고 끝

단점

  • 문맥 교환(Context Switching)에서의 오버헤드
    • Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생
  • 프로세스 간 통신 기법(IPC, Inter Process Comunication)
    • 프로세스는 각 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유 X
    • 따라서 IPC라는 방법을 사용해야 하며, 이는 어렵고 복잡한 통신 방법임

문맥 교환(Context Switching)

  • CPU는 한번에 하나의 프로세스만 처리할 수 있음
    • 여러 프로세스를 처리해야 하는 상황에서는 돌아가면서 여러 프로세스 작업을 처리
    • 이 과정을이 Context Switching
  • 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 프로세스 제어 블록(PCB)에 보관하고,
    • 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업

프로세스 제어 블록(PCB, Process Control Block)

  • 특정 프로세스에 대한 중요한 정보를 저장하고 있는 커널 내의 자료구조
  • 프로세스는 CPU를 할당받아 작업을 처리하다가 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU를 반환해야 함
    • 이때 작업의 진행 상황을 모두 PCB에 저장
    • 그리고 다시 CPU를 할당받게 되면 PCB에 저장되었던 내용을 불러와 종료되었던 시점부터 다시 작업을 수행

PCB에 저장되는 정보

  • 프로세스 식별자(Process ID, PID) : 프로세스 식별 번호
  • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
  • 프로그램 카운터(Program Counter, PC) : 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
  • CPU 레지스터
  • CPU 스케줄링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
  • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함한다.
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보 : 사용된 CPU 시간, 시간 제한, 계정 번호 등

:: 멀티스레드

  • 하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것

장점

  • 프로세스에 비해 메모리 공간과 시스템 자원 소모가 줄어들게 됨
  • 스레드 간 통신시, Data, Heap 메모리 영역을 이용해 데이터를 주고 받으므로 통신 방법이 간단함
  • Context switching 시 PCB 및 캐시 메모리를 비울 필요가 없기 때문에 비용이 적고 더 빠름

단점

  • 서로 다른 스레드가 Data, Heap 영역 등을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있음
    • 즉, 자원 공유 동기화 문제가 발생
  • 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받음

Thread-safe

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

:: 비동기 (asyncronous)

  • 항상 따라다니는 block과 non-block, sync와 async 개념을 이해해야 함
  • 제어권과 동시성을 먼저 짚고 넘어가야 함

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

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

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

  • 동기
    • 함수 A와 함수 B를 호출할 때, 함수 A가 함수 B의 리턴값을 계속 확인하면서 신경 쓰는것
    • 산책할 때 강아지가 계속 뒤 돌아보면서 주인 오는지 확인하는거 생각하기
  • 비동기
    • 함수 A와 함수 B를 호출할 때, 함수 A가 함수 B의 작업 완료 여부는 신경 쓰지 않는 것
    • 주인새끼 오든지 말든지 신경도 안쓰는 고양이
function cureDisease(human, medicine)  // 인자로 받은 medicine으로 human을 치료한다.
function getMedicine()  // 치료에 필요한 medicine을 리턴한다.

// 동기
const human = new Human()
const medicine = getMedicine()
cureDisease(human, medicine)

// 비동기
const human = new Human()
console.log('human 병 걸림')
getMedicine({
  params: {},
  success: function (medicine) {
    cureDisease(human, medicine)
  }
})
console.log('human 병 치료됨')


$.ajax()

:: Java의 비동기

  • 기본적으로 멀티 스레드 방식
  • JVM(Java Virtual Machine)에 의해 스레드 스케줄링이 이뤄짐
  • 예) equest 요청 처리, DB 접근 등

정리

프로세스란?

  • 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스

스레드란?

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

멀티 프로세스란?

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

멀티 스레드란?

  • 하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것

멀티 프로세스 vs 멀티 스레드, 언제 뭘 사용해야 하는가?

  • 이 두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야 하는 시스템에 따라 적합/부적합이 구분된다.
  • 멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 가지고 있다.
  • 반면, 멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지하고 Context Switching에 많은 비용이 든다는 단점이 존재한다.
  • 따라서 대상 시스템의 특징에 따라 오류가 나서 프로세스가 죽었을 때 크리티컬한 이슈가 발생하는지, Context Switching이 발생 빈도가 빈번한지 등을 따져 잘 선택해야 한다.

0개의 댓글