[CS]프로세스와 스레드

이정우·2023년 11월 19일
0

CS지식

목록 보기
1/5
post-thumbnail

밸~하

밸로그 여러분 안녕하세요

오늘은 CS지식중 프로세스와 스레드에 대해서 알아보겠습니다 .

이렇게 프로세스와 스레드에 대해서 알아보게 된 계기는 ,
회사에서 K8S 스케줄링에 대해서 연구를 하고있고 이에 대해서 스케줄링의 개념을 알기위해서 학습하던중
가장 근본이 되는 프로세스와 스레드 메모리에 대해서 지식이 부족하다고 느꼇기에
이번기회에 CPU가 어떻게 메모리를 할당해주고 프로세스가 동작을 하는지와 CPU스케줄링등에 대해서 알아보기위해 포스팅을 작성하게 됬습니다 .

그럼 바로 들어가볼까요?

최근 면접에서도 가장 많이 들었던 질문중 한가지가 바로 "프로세스와 스레드의 차이에 대해서 알려주세요" 였습니다.

그럼 프로세스와 스레드는 어떤 차이가 있을까요??

본격적으로 들어가기에 앞서, 프로세스는 작업의 단위, 스레드는 실행흐름의 단위 라는 단어를 기억하고 글을 읽어주시면 이해가 훨씬 편할것입니다 .

바로 들어가겠습니다!

1. 프로그램과 프로세스

프로그램

여러분 프로그램이라는 단어 아시나요?
이야기 하기 앞서 프로그램의 정의에 대해서 알아보겠습니다.

프로그램 이란 어떤 문제를 해결하기 위하여 그 처리 방법과 순서를 기술하여 컴퓨터에 주어지는 일련의 명령문 집합체를 뜻한다. 조금 더 정확히 말하면, 사용자의 입력에 따라 그 입력된 값을 일정한 처리 방법과 순서에 따라 처리하여 결과를 산출해내는 명령문 집합이다.
-출처 나무위키

이렇게 풀어서 보면 조금 어렵죠? 조금 쉽게 설명을 드리면
프로그램은 윈도우의 exe파일이나 Mac의 dmg와 같은 컴퓨터에서 실행할 수 있는 파일을 통칭합니다.

다만, 아직 파일을 실행하지 않았기 때문에 정적프로그램을 줄여서 프로그램이라고 부르는 것입니다.

그런데 여러분 프로그램을 개발하기 위해서는 컴퓨터 언어 C,javascript,java등의 언어를 이용해서 코드를 작성하면 완성이 됩니다.

즉, 프로그램이란 쉽게말해 단순 코드 덩어리라고 할 수 있습니다.

그럼 이 단순한 코드 덩어리인 프로그램을 실행하게 되면 어떻게 될까요??

여기서 나오는 개념이 바로 프로세스 입니다.

프로세스

프로그램이 단순히 코드 덩어리면, 프로세스는 프로그램을 실행시켜 CPU메모리를 할당받고
정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태를 의미하고 있습니다.
다시말해, 컴퓨터에서 작업중인 프로그램을 프로세스라고 합니다.

앞서 설명에 메모리에 대한 이야기가 나왔는데요

모든 프로그램이 실행되기 위해서라면 메모리라는 것을 할당받아야 실행이 될 수가 있습니다.

이 메모리라는것을 할당해주는곳이 바로 운영체제입니다.

그래서 프로그램을 실행하는 순간 파일은 컴퓨터 메모리에 올라가게 되고, 운영체제로부터 시스템 자원(CPU)를 할당받아 프로그램 코드를 실행시켜 우리가 프로그램을 실행시킬 수 있게 되는것 입니다.

그럼 간단하게 프로그램과 프로세스의 차이를 정리하면

프로그램

  • 어떤 작업을 하기위해 실행할 수 있는 파일
  • 메모리를 할당받지 않고 저장장치에만 존재함으로 정적상태이다
  • 다른말로 코드덩어리라고도 할 수 있다

프로세스

  • 실행되어 작업중인 컴퓨터 프로그램
  • 메모리에 적재되고 CPU자원을 할당받아 실행중인 동적인 상태
  • 코드덩어리를 실행한 것

이렇게 간단하게 프로그램과 프로세스에 대해서 알아봤는데
그럼 프로세스와 스레드는 어떤차이가 있는지에 대해서 알아보겠습니다 .

2. 프로세스와 스레드

사실 프로세스와 스레드의 관계는 완전히 다른 개념이 아닙니다. 프로세스안에 스레드가 존재한다고 생각하시면 쉽게 이해하기 쉬우실 텐데요

어떤의미 인지 알아보겠습니다.

스레드가 나오게 된 이유

  • 프로세스의 한계

과거에는 프로세스 한개만을 이용해서 프로그램을 실행시켰습니다. 하지만 기술이 발전되고 더욱 복잡한 프로그램들이 등장함으로 프로세스 하나만을 이용해서 프로그램을 실행시키기에는 한계가 존재했습니다.

프로세스의 한계에 대해서 잘 정리된 글이 있어 잠깐 가져와 봤습니다.

오늘날 컴퓨터는 파일을 다운 받으며 다른 일을 하는 멀티 작업은 너무 당연한 기능이라고 생각할지 모르겠지만, 과거에는 파일을 다운받으면 실행 시작부터 실행 끝까지 프로세스 하나만을 사용하기 때문에 다운이 완료될때까지 하루종일 기다려야 했다. 그렇다고 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다. 스레드(Thread)는 이러한 프로세스 특성의 한계를 해결하기 위해 탄생 하였다.

출처: https://inpa.tistory.com/entry/👩‍💻-프로세스-⚔️-쓰레드-차이 [Inpa Dev 👨‍💻:티스토리]

위와 같은 한계를 해결하기 위해서 나오게 된 개념이 바로 스레드 입니다.
그럼 스레드가 어떻게 해결할 수 있는지 본격적으로 알아볼까요?

스레드

스레드란, 하나의 프로세스 내에서 동시에 진행되는 작업갈래, 흐름의 단위를 말합니다.
이 스레드는 프로세스 내에서 독립적으로 실행될 수 있는 가장 작은 단위로, 프로세스 내에서 여러개의 스레드가 동시에 실행될 수있습니다.

예를들어 크롬을 실행시킨다고 가정해 보겠습니다 크롬을 실행시키면 텝을 여러개켤수있고 각각의 탭별로 다른 작업을 할 수 있습니다.
이러한 작업이 가능한 이유는, 하나의 프로세스 안에서 여러가지 작업들 흐름이 동시에 진행되기 때문에 가능한 것인데, 이러한 작업의 흐름들을 바로 스레드라고 하며 이 스레드가 여러개이면 다중 스레드라고 합니다.

스레드가 많으면 많을수록 당연히 한번에 여러가지의 작업을 할 수 있게 때문에 프로그램속도도 동시에 하는 작업이 많아져 성능이 올라가게 됩니다.

그럼 스레드가 어떻게 이렇게 동작할 수 있는지 잠깐 알아볼까요?

이렇게 동작 할 수있는 이유를 알기위해서는 프로세스와 스레드의 자원 구조에 대해서 알아야합니다.

3.프로세스와 스레드의 메모리

프로세스의 자원 구조

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

메모리영역

  • 코드/텍스트 영역
  • 데이터영역
  • 힙영역
  • 스택영역

이렇게 4가지의 메모리영역으로 구성되어 있습니다.

1. 코드/텍스트 영역

코드 텍스트 영역은

  • 프로그램의 실행 코드가 저장되는 영역
  • CPU가 직접 실행하는 명령어들이 저장되어 있으며, 읽기 전용으로 설정됨
  • 프로그램 코드는 이 영역에서 실행되며, 코드 섹션으로도 불림

2. 데이터 영역

데이터 영역은

  • 초기화된 전역 변수 및 정적 변수들이 저장되는 영역
  • 프로그램이 실행될 때 초기값을 가지는 데이터들이 저장되는 영역
  • 읽기와 쓰기가 가능
  • .data,.rodata,.bss영역으로 세분화됨
  • .bss : 초기값 없는 전역 변수, static변수가 저장,프로그램이 실행될 때 이영역의 변수들은 자동으로 0으로 초기화 됨
  • .rodata:const 같은 상수 키워드 선언 된 변수나 문자열 상수가 저장
  • .data:전역변수 또는 static변수등 프로그램이 사용하는 데이터를 저장

3. 힙 영역

힙 영역은

  • 생성자,인스턴스등 동적으로 할당된 메모리가 저장되는 영역
  • 프로그램 실행 중에 동적으로 메모리를 할당하거나 해제할 때 사용됨
  • 힙은 프로그램의 실행 중에 크기가 동적으로 변할 수 있음
  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제됨

4. 스택 영역

스택 영역은

  • 함수 호출과 관련된 지역 변수, 함수 매개변수, 복귀 주소 등이 저장
  • 스택은 함수 호출 및 반환을 지원하며, 후입선출 구조
  • 스택의 크기는 제한되어 있음, 주로 작은 크기의 데이터를 저장하는데 사용
  • 호출한 함수가 종료되면 되돌아올 임시적인 자료를 저장하는 독립적인 공간
  • 함수의 호출과 함께 할당, 함수호출 완료이후 소멸
  • 스택 영역을 초과하면 stackoverflow에러 발생

이렇게 프로세스의 메모리 영역에 대해서 알아보았습니다 .

이번엔 스레드는 어떻게 자원공유를 할 수있는지 구조를 알아보겠습니다 .

스레드의 자원 구조

스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위로 스레드가 여러개 있으면 여러개의 작업을 동시에 수행할 수 있게 만들어준다.

스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시작업이 가능합니다.

1.공유 자원

공유 자원은

  • 코드영역
  • 데이터영역
  • 힙 영역
    이렇게 세가지로
    스레드는 콜스택만 할당받아 복사하고, 코드영역,데이터영역,힙영역은 공유해서 사용하기 때문에 서로 다른스레드에서 값을 가져와서 읽고 쓸수 있게됩니다.

2.고유 자원

스레드는 공유자원 외에도 고유한 자원을 가지고 있습니다.
고유자원

  • 스택 :각 스레드는 고유한 스택을 가지며, 함수 호출 및 지역변수등이 저장됨
  • 레지스터 값 : 각 스레드는 고유한 레지스터값을 가짐, 스레드의 실행상태를 나타내며, 스레드간 전환시에 저장되고 복원된다.
  • 스레드 ID : 각 스레드는 고유한 스레드 식별자를 가지며, 이를 통해 스레드를 식별할 수있음
  • 스레드 로컬 저장소 : 스레드가 고유하게 유지해야 하는 데이터를 저장하는 영역. 모든 스레드가 공유하는 전역 변수와 달리, 이공간은 각 스레드에게 독립적으로 할당됨
  • 스레드가 독립적인 스택을 가졌다는것은 독립적인 함수 호출이 가능하다는것, 즉 스택을 가짐으로써 스레드는 독립적인 실행흐름을 가질 수 있게 된다는것

  • 프로세스는 기본적으로 프로세스 끼리 다른 프로세스 메모리에 직접적인 접근 불가

이렇게 프로세스와 스레드의 특징에 대해서 알아보았습니다
그런데 이런 의문이 들수도 있습니다

그럼 무조건 스레드가 많을수록 좋은건가?라는 의문과
프로세스는 다른 프로세스 메모리에 접근을 할 수없나? 라는 의문이 듭니다

한번 이부분도 같이 알아보겠습니다.

프로세스의 자원 공유

기본적으로 프로세스는 메모리에 별도의 주소 공간에서 실행되기 때문에, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
그럼 절대 접근이 불가능할까?

우리가 사용하는 대부분의 컴퓨터 프로그램은 다른 프로그램에 있는 정보를 가져오는 경우를 자주 볼 수있습니다.
그럼 다른 프로세스에도 접근할 수있다는 의미인데
어떻게 정보를 공유할 수 있을까요?

크게 3가지 방법이 있습니다

  • IPC(Inter-Process Communication) 사용
  • LPC(Local inter-Process Communication) 사용
  • 별도로 공유 메모리를 만들어서 정보를 주고 받도록 설정

이렇게 세가지 방법이 있는데 한개씩 천천히 알아보겠습니다.

1. IPC(Inter-Process Communication)

IPC는 둘 이상의 프로세스 간에 데이터를 교환하고 상호 작용하기 위한 메커니즘입니다.
여러 프로세스가 동시에 실행되는 다중 로세스 환경에서 중요한 개념이며 다양한 IPC메커니즘이 존재합니다.

IPC는 다음과 같은 목적으로 주로 사용됩니다.

목적

  • 프로세스 간 데이터 전송
  • 프로세스 간 동기화
  • 프로세스 간 통신 기능

그럼 주요 IPC메커니즘에 대해서 알아보겠습니다.

주요IPC메커니즘

  • 파이프
  • 메시지 큐
  • 공유 메모리
  • 소켓
  • 세마포어
  • 파일을 이용한 통신
  • RPC

등이 있습니다
한개씩 알아보겠습니다

파이프

파이프는 단방향 또는 양방향으로 데이터를 전송하는 메커니즘 입니다.
일반적으로 부모 프로세스와 자식 프로세스 간에 사용되며, 한쪽에서 쓰고 다른쪽에서 읽습니다.

메시지 큐

메시지 큐는 메시지 기반 통신을 지원하는 메커니즘으로, 프로세스 간에 메시지를 비동기적으로 전송합니다.
메시지 큐를 통해 데이터를 교환하고 각 메시지에는 유형, 우선순위 등의 정보가 포함됩니다.

공유 메모리

공유 메모리는 두 개 이상의 프로세스가 동일한 물리적인 메모리 영역을 공유합니다.
프로세스 간 데이터를 직접 공유하기 때문에 빠른 속도를 제공하지만, 데이터 동기화에 주의해야합니다.

소켓

소켓은 네트워크 통신에서 사용되는 소켓을 이용하여 로컬 프로세스 간 통신을 구현할 수 있습니다.
TCP/IP 소켓 또는 UNIX도메인 소켓을 사용할 수 있습니다.

세마포어

세마포어는 프로세스 간 동기화를 위한 기법으로, 임계 영역에 대한 접근을 제어합니다.
여러 프로스가 공유 자원에 안전하게 접근할 수 있도록 합니다.

파일을 이용한 통신

파일을 이용한 통신은 파일을 통해 데이터를 읽고 쓰면서 프로세스 간 통신을 구현할 수 있습니다.
파일을 통해 텍스트 또는 이진 데이터를 주고 받을 수 있습니다 .

RPC(Remote Procedure Call)

RPC는 원격 프로스저 호출을 통햇 로컬 및 원격 프로세스 간에 함수 호출을 지원합니다.
로컬에서 호출하는 것과 유사한 방식으로 원격 서버의 함수를 호출할 수 있습니다.

이렇게 IPC에 대해서 알아보았는데요 LPC도 이와 유사한 메커니즘을 가지고 있습니다

그럼 이 두가지의 차이는 무엇일까요??

IPC

  • 개념 :IPC는 두 개 이상의 로세스 간에 데이터를 교환하고 통신하기 위한 메커니즘으로 프로세스간의 통신을 위해 사용되며, 이는 로컬 또는 원격 위치에서 실행중인 다른 프로세스간에도 가능합니다.

  • 범위 :IPC는 로컬 또는 원격 프로세스 간에 모두 적용되며, 네트워크를 통해 프로세스간 통신도 가능합니다

LPC

  • 개념 : LPC는 비교적 특정한 용어로, 로컬 시스템 내에서 프로세스 간 통신을 나타냅니다. 주로 동일한 컴퓨터에서 실행되는 프로세스 간에 발생하는 통신을 의미합니다.

  • 범위 :LPC는 주로 로컬시스템 내에서의 프로세스 간 통신에 중점을 둡니다. 네트워크를 통한 원격 통신은 포함되지 않을 수 있습니다.

결론

  • IPC는 프로세스간 통신을 일반적으로 나타내는 용어이며, 로컬이든 원격이든 모든 종류의 프로세스 간 통신을 포함합니다.
  • LPC는 상대적으로 특정한 맥락에서 로컬 시스템 내에서의 프로세스 간 통신을 강조하는 데 사용될 수 있습니다.

따라서 IPC는 더 일반적이고 포괄적인 개념이며, LPC는 특히 로컬 시스템내에서의 프로세스 간 통신을 강조하는 특별한 맥락에서 사용될 수 있습니다.

이러한 프로세스 간의 자원공유는 사용할때 주의를 기울여야하는데 그 이유는
단순히 CPU레지스터 교체뿐만 아니라 RAM과 CPU사이의 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있습니다. 그래서 다중 작업이 필요한 경우 스레드를 이용하는것이 훨씬 효율적이기에 현대컴퓨터의 운영체제에서는 다중 프로세싱을 지원하지만 다중스레딩을 기본으로 하고 있습니다.

이렇게 쓰레드와 프로세스에 대해서 알아보았는데요

프로세스간의 자원을 공유하는법과 스레드가 어떻게 구성되는지 또한 프로세스가 어떻게 구성되는지를 알게되는 시간이었습니다.

오늘 글한개로 끝내려 했는데 내용이 너무 방대하네요

다음주에는 프로세스와 스레드가 어떻게 동시 실행이 되는지 실행원리와 CS의 꽃 CPU에 대해서 알아보겠습니다

그럼 이만

밸~바

profile
주니어 프론트엔드 개발자

0개의 댓글