컴퓨터 사이언스

프로세스와 스레드

kagan-draca 2024. 11. 3. 20:09

프로그램(Program)

  1. 어떤 작업을 위해 실행할 수 있는 파일

 

1. 프로세스(Process)

  1. 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
  2. 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
  3. 운영체제로부터 시스템 자원을 할당받는 작업의 단위

프로세스(Process) 특징

  • 프로세스는 각각 독립된 메모리 영역인 Code, Data, Stack, Heap을 가지고 있습니다.
  • 프로세스는 별도의 메모리 주소 공간에서 실행되며,
    한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없습니다.

 

Code 영역

  • 우리가 작성한 소스 코드, 상수(#defined), 컴파일 된 기계어가 들어가 저장되는 장소입니다.
  • 프로그램이 시작하고 끝날 때 까지 메모리에 계속 남아있습니다.
  • CPU는 Code 영역에 저장된 명령어를 하나 씩 가져가 처리합니다.

Data 영역

  • 프로그램의 전역 변수(Global) 변수와 정적(Static) 변수, 문자열(String)이 저장되는 영역입니다.
  • 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸합니다.
  • BSS와 GVAR 영역으로 나눠져 있으며,

    BSS : 초기화 되지 않은 데이터를 RAM에 저장하기 위한 영역 
    GVAR : 초기화가 된 데이터를 ROM에 저장하기 위한 영역

Stack 영역(정적 메모리)

  • 함수 호출 시 생성되는 지역변수(함수 내 변수)와 매개변수(함수가 전달 받는 변수)가 저장되는 영역 입니다.
  • 함수의 호출과 동시에 메모리에 할당되며, 함수의 로직이 완료되면 메모리 해제 됩니다.
  • 후입선출(LIFO)(마지막에 들어온 데이터가 먼저 나간다.) or 선입후출(FILO)(먼저 들어온 데이터가 마지막에 나간다) 
    는 방식 입니다.
  • 위의 사진에서 처럼 메모리의 높은 주소에서 낮은 주소 방향으로 데이터가 할당 됩니다.

장점

  • 변수를 명시적으로 할당 또는 해제할 필요가 없기 때문에 속도가 빠르다.
  • 사이즈를 명시적으로 할당 해제 할 필요가 없다. (ex : int : 4byte, float : 4byte, double : 8byte, char : 1byte)

단점

  • 스택의 크기 제한 (ex : int : 4byte, -2147483648 ~ 2147483647 범위)이 있어
    한계를 초과하도록 삽입할 수 없습니다.

Heap 영역(동적 메모리)

  • 사용자가 직접 공간을 할당, 해제 하는 메모리 공간 입니다.
  • 할당 방식 : malloc() (포인터에 메모리 공간 할당), new (Class의 인스턴스(객체) 생성) 으로 할당 가능
  • 해제 방식 : free() (포인터에 할당된 메모리 해제), delete (Class의 인스턴스(객체) 제거)로 해제 가능
  • 선입선출(FIFO) (먼저 들어온 데이터가 먼저 나간다.) 방식 입니다.
  • Stack과는 반대로 메모리의 낮은 주소에서 높은 주소 방향으로 데이터가 할당 됩니다.

장점

  • 메모리 크기에 제한이 없습니다.
    ex) int *arr = (int *)malloc(n (할당 받을 메모리 크기) * sizeof(int) (int : 4byte로));
    => int 형 자료 n개 생성 가능 => 유연한 배열 생성 가능
  • 멀티스레드 데이터 공유

단점

  • 할당, 해제 작업으로 인한 속도 저하
  • 데이터 접근 속도가 느린 편이다.

 

오버플로우 (overflow)

 

STACK은 위의 설명에 따라 메모리 주소가 높은 주소에서 낮은 주소 순으로 쌓여가고,
HEAP은 메모리 주소가 낮은 주소에서 높은 주소 순으로 쌓여 갑니다.

때문에, 두 메모리 영역의 주소가 겹치게 되는 오버플로우(OverFlow)가 발생할 수 있습니다.

 

힙(HEAP)이 스택(STACK) 영역을 침범하는 경우 힙 오버플로우(HEAP OverFlow),

스택(STACK)이 힙(HEAP) 영역을 침범하는 경우 스택 오버플로우(STACK OverFlow)

가 발생하게 됩니다.

 

2. 스레드(Thread)

  1. 프로세스(Process) 내에서 실행되는 여러 흐름의 단위
  2. 프로세스의 특정한 수행 경로
  3. 프로세스가 할당받은 자원을 이용하는 실행의 단위

스레드(Thread) 특징

스레드는 프로세스 내에서 각각의 Stack 영역만 따로 할당 받고, Code, Data, Heap 영역은 공유 합니다.

 

스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로,

프로세스 내의 주소 공간이나 자원들을 공유하면서 실행됩니다.

(반면, 프로세스는 프로세스 끼리는 공유하지 않는다. 위로 올리면 나와요)

 

그래서, 한 스레드가 프로세스 자원을 변경할 경우, 다른 스레드도 그 변경 결과를 즉시 반영할 수 있습니다.

 

멀티 프로세스와 멀티 스레드 차이

멀티 프로세스

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

장점

  • 하나의 프로세스는 독립적인 메미로 공간을 가지고 있기 때문에, 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 주지 않아 안정성이 높습니다.

ex) 유튜브 시청하면서, 게임하기

 

유튜브를 처리하는 프로세스는 동영상을 처리하고, 게임을 처리하는 프로세스는 게임 환경을 유자하기 때문에

둘 중 하나의 이상이 발생하더라도 다른 하나는 문제 없이 사용 가능한 상태인 것 입니다.

 

단점

  • 프로세스는 각각의 독립된 메모리 영역을 할당 받았기 때문에 프로세스 사이에서 공유하는 메모리가 없어, Context Switching이 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 합니다.

 

멀티 스레드

  • 히나의 응용 프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 방식

장점

  • 여러 스레드가 Code, Data, Heap을 공유하고 있어 메모리 공간과 자원 소모가 줄어드는 효과가 있습니다.
  • 프로세스의 Context Switching과 달리 스레드 간의 Context Switching은 캐시 메모리를 비울 필요가 없어 속도가 빠릅니다.

단점 

  • 각 스레드가 작업할 영역(임계영)을 지정해줘야 하고, 범위를 벗어나지 않도록 관리해주어야 합니다.
  • 작업이 끝난 스레드가 작업 중인 스레드를 기다릴 수 있도록 구현해야한다.
    => Stack을 제외한 공간을 공유하기 때문에 각 스레드의 작업이 끝나면 끝난 작업 결과가 공유된다.

ex) 멀티 스레드를 이용한 가우시안 소거법과 후입 대입을 이용한 계산 속도 계산을 해봤습니다.

 

 

 

 

으로 위와 같이 Gaussian Size가 14이고, 전체 스레드 수가 4개일 때 각 스레드의 작업 영역(임계 영역)을 나눠 줄 수 있고,

 

    for (int i = 0; i < np; i++)
    {
        pthread_join(threads[i], NULL);
    }

 

으로 작업을 마친 스레드가 다른 스레드를 기다릴 수 있게 만들어주었습니다.

 

성능으로는 

의 수행시간이 나왔습니다.

 

'컴퓨터 사이언스' 카테고리의 다른 글

문맥 교환(Context Switching)  (0) 2024.11.03
메모리  (2) 2024.10.07
CPU란?  (0) 2024.10.06