멀티 프로세싱와 멀티 스레딩을 이해해보자.

GREEN FIELD·2024년 9월 14일
0

Backend

목록 보기
1/2

1. 프로그램(Program)과 프로세스(Process)

2. 멀티 프로세싱, 멀티 태스킹, 멀티 스레딩

1. 프로그램과 프로세스

프로그램 - 프로그래밍 언어로 짜여진 상태로, 하드 디스크 상에 저장만 되어 있는 상태.
프로세스 프로그램이 메모리에 올라가서 실제 실행 중인 상태

프로그램 | 자세한 요리 레시피(어떤 재료로 어떻게 요리를 해야하는 지 상세하게 적혀진 명세), 서랍(디스크)에 꽂혀 있다.
프로세스 | 레시피 적혀진 대로 불판(메모리) 위에서 요리되고 있는 상태..!

프로세스는 독립적인 메모리 위치에 위치하며 아래의 영역을 가진다.

  • code(text):동작 방식, 짜여진 코드(바이너리 형태로 컴파일 됨)

  • data : 전역변수, static 변수, 배열, 구조체 등이 저장되는 영역. 프로그램 시작할 때 할당되어 끝날 때 반환

    • BSS 영역 : 초기화되지 않은 변수들을 저장하는 영역 (Blocks started by symbol) - RAM에 저장한다.

    • Data(GVAR) 영역 : 초기화된 데이터 (ROM에 저장)

      WHY? 메모리 공간을 효율적으로 사용하기 위해서 구분한다.
      초기 값이 있는 데이터들은 그 값 그대로 ROM에 저장하고, 초기화되지 않은 데이터들은 0으로 초기화(커널에서)할 것이기 때문에 굳이 ROM 을 차지하지 않도록 구분한다.

  • stack : 지역변수, 매개변수, 리턴값, 일시적으로 사용하고 사용이 끝나면 반환, 스택 형태로 쌓임(높은 주소값 -> 낮은 주소값 방향)
    ----> 프로세스가 로드될 때 크기를 미리 계산해서 로드, stack에서 반복된 재귀함수 호출 등 -> stack overflow error 발생

  • heap (동적 할당) : 필요에 의해서 할당되는 값(런타임에 결정, 낮은 주소값 -> 높은 주소값 방향) ---> stack와 heap은 같은 영역을 공유하며, 서로의 영역을 침범하면 heap overflow, stack overflow 발생

참조1
참조2

멀티 프로세스, 멀티 태스킹

들어가기에 앞서..
컴퓨터의 내부 작업은 크게 연산 처리 작업과 입출력 작업으로 구분할 수 있다.
CPU 작업과 I/O (Input/Output)작업에 대해 간단히 알아보자.

  • CPU : 연산 작업
  • I/O : 사용자 입출력(키보드, 모니터, 스피커, 마우스 등), 파일 읽고 쓰는 일, 네트워크의 어딘가와 데이터 주고 받는 일(외부 통신)

Context Switching?
컴퓨터 내부의 작업 주도권이 바뀌는 것.
인터럽트(interrupt) 요청이 있을 때 콘텍스트 스위칭이 발생한다.
대표적인 예로, CPU 작업 중 I/O 요청이 발생하면 context switching이 일어나며 CPU의 동작이 멈추고 컴퓨터의 작업 주도권이 I/O 작업으로 넘어간다.

아래의 인터럽트 요청이 있을 때 콘텍스트 스위칭이 발생한다.
1. 입/출력을 요청할 때
2. CPU 사용시간이 만료되었을 때
3. 자식 프로세스를 만들 때
4. 인터럽트 처리를 기다릴 때
(https://beststar-1.tistory.com/26)

문제는, context switching이 발생할 때 오버헤드(overhead)가 발생한다. 따라서 switching이 빈번할수록 성능상 손해를 본다.

싱글 프로세스

메모리 위에 하나의 프로그램만 올라가서 하나의 프로세스만 동작할 수 있는 환경으로, 프로세스에서 I/O 요청이 발생하면 CPU는 대기상태가 되고 I/O가 끝났다는 신호가 오면 다시 CPU가 중단된 시점부터 다시 프로세스가 동작한다.

불판에서 한가지 요리만 할 수 있다. C셰프(CPU)와 I/O셰프는 동시에 바톤 터치하면서 일해야 한다.

멀티 프로그래밍

메모리 위에 여러 프로그램을 올려놓고, A 프로세스가 I/O 요청을 맞았을 때, CPU는 쉬는 것이 아니고, I/O 요청동안 B 프로세스를 동작한다.
한계) 그래도 사용자가 메인으로 사용하는 프로그램은 A이고, A가 끝날 때 까지 B는 제대로 주도권을 가질 수 없다.

여러 주문을 불판에 올려놓고 한가지 요리에 집중한다. 그 요리에 I/O셰프가 작업할 때 C셰프는 다른 요리도 뒤적거린다.

멀티 태스킹

CPU의 주도권을 여러 프로세스에 짧은 quantum 시간동안 골고루 분배하여, 메모리 위에 실행중인 프로그램(프로세스)가 실질적으로 동시에 동작하고 있는 것처럼 보이게 해줌.
-> 빠른 반응성,하나의 프로세스 장애로 전체 시스템이 다운되는 것을 막음, CPU 효율적 활용, 프로세스 우선 순위 조절(OS의 스케줄링 알고리즘따라) / 단 context switching 자주 일어남.

C 셰프가 불판 위 여러 음식을 0.01초씩 빠르게 요리함. 겉으로 보기에 동시에 요리되고 있는 것처럼 보임.

멀티 프로세싱 (cpu의 코어와 스레드)

스레드란?
CPU(core) : 요리사
H/W에서의 스레드 : core가 한번에 할 수 있는 작업량. 요리사의 팔 개수. (원래 코어:스레드 = 1:1 이었으나, hyper threading 기술로 1:n이 가능하게 되었다.)
S/W에서의 스레드 : 프로세스 내에서 논리적 흐름으로, 프로세스 자원을 공유한 상태(stack 영역만 스레드 별로 가지고 나머지 영역은 공유한다)로 프로세스의 업무를 스레드라는 각각의 흐름에서 처리.

멀티 스레드: 공유하고 있는 영역이 있어서 뒤에서 볼 멀티 프로세싱에 비해 context switching이 비교적 가볍다. 단 race condition, critical section 같은 공유 데이터 관리에 유의해야 함.

멀티프로세싱이란?
실제로(물리적으로) 여러 개의 cpu(core)를 둬서 동시에 여러 프로세스가 동작할 수 있도록 한다.

셰프 여러명 채용

①하나의 job을 여러 코어가 동시에 작업하거나 ②여러 코어가 여러 job을 동시에 작업
---> 멀티 프로세싱 + 멀티 태스킹
① 하나의 작업에 대해 여러 core의 각각의 thread가 번갈아가면서 수행

여러 셰프가 빨리 요리를 만들기 위해 달려듦.

② 여러 작업에 대해 여러 core의 각각의 thread가 번갈아가면서 수행

여러 셰프가 각자 맡은 요리들을 왼손에 하나, 오른손에 하나씩 들고 열심히 만들어 주문을 쳐냄.

https://iosdevlime.tistory.com/entry/iOSCombine-CPU%EC%99%80-%EC%BD%94%EC%96%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EA%B0%9C%EB%85%90

멀티 프로세싱 vs 멀티 프로세스
멀티 프로세싱 : 실제로 여러 코어에서 작업을 수행 -> 빠른 처리 목적 (많은 연산이 필요한 작업)
멀티 프로세스 : 하나의 프로세스를 여러 프로세스(부모 - 자식 형태)로 나누어 역할 분담(각각의 pid) -> 하나의 작업이 실패해도 전체 프로세스 오류가 되지 않도록 안정성 향상 목적(브라우저 멀티 탭)
ㄴ 독립적인 task 수행, 독립적인 메모리 할당
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-multi-programming-tasking-processing

비슷한 용어 탓에 개념이 헷갈릴 때가 있어 이참에 정리를 해둔다.

0개의 댓글