프로그램, 프로세스, 스레드

신동수·2024년 4월 1일
0

잡동사니

목록 보기
12/17
post-thumbnail

프로그램 과 프로세스

프로그램

*.exe, *.dmg 파일과 같은 컴퓨터에서 실행할 수 있는 파일을 말한다.
아직 파일을 실행하지 않은 상태이기에 정적 프로그램 또는 프로그램이라고 부른다.
즉, 프로그램은 코드 덩어리 인 것이다.

프로세스

프로그램이 그냥 코드 덩어리이면, 프로세스는 프로그램을 싱행사켜 정적인 프로그램이 동적으로 변화하여 프로그램이 돌아가고 있는 상태이다.

위는 Mac 에서 확인되는 실행중인 프로그램들이며, Windows 의 작업관리자와 같은 내용을 확인할 수 있다.

모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있다. 프로그램을 실행하면 파일은 메모리영역에 올라가고, 시스템 자원을 할당받아 서비스를 이용할 수 있게 되는 것이다.

프로세스의 한계

과거에는 파일을 다운받으면 실행 시작부터 실행 끝까지 프로세스 하나만을 사용하기 때문에 다운이 완료될때까지 기다려야 했다. 동일한 프로그램을 여러 개의 프로세스로 만들게 된다면 시스템자원이 금방 부족해질 것이다. 스레드는 프로세스 특성의 한계를 해결하기 위해 탄생하였다.

간단 정리

프로그램프로세스
어떤 작업을 하기 위해 실행할 수 있는 파일실행되어 작업중인 컴퓨터 프로그램
파일이 저장 장치(Disk)에는 있지만 메모리에는 올라가 있지 않은 상태메모리에 적재되고 시스템 자원을 할당받아 프로그램이 실행중인 상태

스레드

스레드란, 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위 를 말한다.

위 캡처에서 Chrome 프로세스의 스레드를 본다면 50 이 되어 있는 것을 확인할 수 있다. 하나의 프로세스 안에서 여러가지 작업들 흐름이 동시에 진행되기 때문에 가능한 것으로, 작업 흐름들을 스레드라고하며 여러개가 있다면 멀티 스레드라고 부른다.

프로세스 & 스레드의 메모리


프로그램이 실행되어 프로세스가 만들어지면 4가지의 메모리 영역으로 구성되어 할당받게 된다.

  • 코드 영역 : 프로그램 함수들의 코드가 CPU 가 해석 가능한 기계어 형태로 저장
  • 데이터 영역 : 코드가 실행되면서 사용하는 전역 변수나 데이터. .data, .rodata, .bss 영역으로 세분화
    - .data : 전역 변수, static 변수 등 프로그램이 사용하는 데이터가 저장
    - .rodata : 상수 키워드가 선언된 변수나 문자열 상수가 저장
    - .bss : 초기값 없는 전역 변수, static 변수가 저장
  • 힙 영역 : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터가 저장, 사용자에 의해 동적으로 할당된다.
  • 스택 영역 : 호출한 함수가 종료되면 반환받는 데이터를 저장하는 독립적인 공간이다.

위 그램에서 Stack 과 Heap 영역이 화살표로 되어 있는 그림을 많이 보았을 것이다. 코드 영역과 데이터 영역은 선언할 때 그 크기가 결정된다. 스택과 힙 영역은 프로세스가 실행되는 동안 크기가 동적으로 변환되기 때문이다.

스레드의 자원 공유


스레드가 여러개 있으면 우리가 파일을 다운 받으며 동시에 웹 서핑을 할 수 있게 해준다. 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능한 것이다. 위 사진과 같이 하나의 프로세스 내에 여러개의 스레드가 들어있는 상태인 것이다.


프로세스의 4가지 메모리 영역(Code, Data, Heap, Stack) 중 스레드는 Stack만 할당받아 복사하고 Code, Data, Heap은 프로세스내의 다른 스레드들과 공유된다. 하나의 프로세스를 다수의 실행 단위인 스레드로 자원을 공유하고, 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 올리기 위함이다.

프로세스의 자원 공유

기본적으로 각 프로세스는 메모리에 별도의 주소 공간에서 실행되기 때문에, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수는 없다. 하지만 현재 우리가 사용하는 프로그램을 본다면 다른 프로그램의 정보를 가져오는 것을 알 수 있다. 이처럼 대표적으로 IPC 를 통해 다른 프로세스에 접근하여 정보를 가져올 수 있는 방법이 있다.

IPC(Inter-Process Communication)

Shared Memory

협력 프로세스 간 공유되는 메모리를 생성 후 이를 이용하여 정보를 교환한다. 데이터의 형식과 위치는 프로세스들에 의해 결정된다. 주로 전역 변수, 공유 변수, 공유 파일을 통해 통신을 이룬다.

Message Passing

OS가 프로세스 간 통신 방법을 제공하고, 메세지를 대리 전달해준다. OS가 동기화를 해주기 때문에 안전하고 동기화 문제가 없으나, 시스템 콜을 사용하기 때문에 성능이 떨어진다.

간단 정리

프로세스와 스레드의 차이점은?

프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다. 
프로세스는 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당 받는다.(code, data, heap, stack)
스레드는 이중에 stack만 따로 할당받고 나머지 영역은 스레드끼리 서로 공유한다.

# 요약
프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
스레드 : 다른 스레드와 공간과 자원을 공유하면서 사용

프로세스의 문제점은?

  • 프로세스 생성에 큰 오버헤드가 있다. (프로세스를 생성할때 많은 시간이 소요됨)
  • 프로세스 컨텍스트 스위칭의 비효율성, 오버헤드가큼
  • 프로세스 사이에 통신이 어렵다는점 (IPC사용해야함)

IPC란 무엇인가?

  • 프로세스들이 주소공간이 완전히 분리되어 있어 두 프로세스 사이에서 코드를 제외한 메모리 공간이 공유되지 않아 프로세스가 다른 프로세스의 메모리 접근이 불가능하다.
  • 프로세스들이 서로 통신 할 수 있도록 운영체제 커널에서 IPC 지원한다.
  • 대표적인 IPC 는 공유메모리, 신호, 파이프 세가지 정도가 있다.

스레드의 출현 목적은?

  • 프로세스보다 크기가 작은 실행 단위 필요
  • 프로세스의 생성 및 소멸에 따른 오버헤드 감소
  • 빠른 컨텍스트 스위칭 (멀티태스킹 환경에서 여러 프로세스 또는 스레드를 동시에 실행하기 위한 기술)
  • 프로세스들의 통신 시간, 방법 어려움 해소
profile
조금씩 성장하는 DevOps 엔지니어가 되겠습니다. 😄

0개의 댓글