[TIL] 프로세스와 스레드의 차이

이명진·2023년 2월 1일
0

TIL

목록 보기
9/16

서두

면접 질문 으로 프로세스와 스레드에 대해 알고 있냐는 질문을 받았다.
프로세스 ? 스레드? 어디서 들어본것 같은데 막상 면접에서 직면하니 깜깜하니 생각이 나지 않았다.

면접이 끝나고 나서 프로세스 와 스레드에 대해서 생각을 다시 해봤다.
프로세스는 cpu정보를 볼떄 들어본것 같기도 하다 (인텔 프로세서.. 아닐수도..?)
스레드도 cpu관련되서 듀얼 코어, 쿼드 코어 란 용어에서 사용되지 않나 싶었다.

프론트엔드 개발자인데 cpu정보 까지 알아서 코딩해야 하나 ? 질문의 의도가 무엇인지 궁금해지기도하고
개념정리도 할겸 프로세스와 스레드에 대해 검색해보고 공부하게 되었다.

프로세스와 스레드

OS 에서 사용되는 내용으로 이 내용을 알려면 프로그램에 대해 알아야 한다.
왜냐하면 프로세스의 사전적 의미가 아래와 같기 때문이다

프로세스 사전적 의미

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

프로그램은 컴퓨터를 사용하신 분들이면 다들 아실 것이다. exe 파일 , dmg 파일등 어떤 파일을 실행해야 할때 어떤 프로그램을 사용하세요 라고 많이 들어봤을 것이다.

프로그램 사전적 의미

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

이쯤되어서 생각해보니 렉이 걸려 어떤 프로그램이 안움직일때 작업관리자에 들어가서 프로세스 강제종료 라는
단어를 들어봤던 것이 생각 나게 되었다.

참고로 나는 맥을 사용하는데 윈도우의 작업관리자와 비슷한 활성 상태보기에서 프로세스에대한
이름을 찾을수 있다.

프로세스의 특징

  • 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있다.
  • 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
  • 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, inter-process communication)을 사용해야 한다.
    Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용

이번에는 스레드에 대해 알아보자

스레드 사전적 의미

  • “프로세스 내에서 실행되는 여러 흐름의 단위”
  • 프로세스의 특정한 수행 경로
  • 프로세스가 할당받은 자원을 이용하는 실행의 단위

프로세스는 최소 1개의 스레드를 가지고 있다. 스레드는 프로세스에서 실행할수 있도록 작업해주는 역할을 하고 있는 것 같다. 대부분 찾아보면 스레드의 정의를 프로세스가 할당받은 자원을 이용하는 실행단위 라고
작성해 두었다.

스레드의 특징

  • 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행된다.
  • 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
    한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.

한번 읽고나서 이해가 안되었는데 내 주관대로 생각해서 정리를 해본다.
내 주관이니 참고로 틀릴수도 있다.
내가 생각하기에는 요새 맥을 사용하는데 맥은 프로그램을 실행할때 램(RAM)을 사용한다
프로세스의 특징처럼 램에서 각자의 공간중 일부를 독립적으로 할당해주고
프로세스 내부에서 스레드가 생기는데 스레드는 코드를 칠때의 각각의 함수 라고 생각을 한다.
프로세스를 실행하면서 코드들이 실행되고 스레드가 코드를 읽어가면서 각각의 함수들, 코드들을 실행하나고 생각하고 있다.

면접에서는 왜 물어보는 것일까?

일단 첫번째로 컴퓨터 지식에 대해서 얼마나 알고 있나에 대해 궁금해서 물어보는 것 같다.
기본 지식이기도 하고 요즘 면접에서 단골 질문이라고 한다.
그러므로 기본적으로 개념이 어떤지에 대해 알아야 할것 같다.

두번째로 내가 생각한것처럼 메모리에 할당되기 때문에 메모리 흐름과 메모리 관리를 위해서 물어보는것같다.
성능을 측정하기 위해서 캐싱 능력과 메모리 누수가 나는지 코드 성능에 대해서 고민을 많이 하는데
이를 통해서 메모리가 어떻게 사용되는지 어떤 흐름으로 메모리가 사용되는지 물어보는 것같다.
(내 주관이다. 아닐수도 있다)

프로세스와 스레드의 차이

  1. 공유방식
    스레드는 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다
    각각 독립된 메모리 영역을 할당해 주기 때문에 프로세스는 다른 프로세스의 변수나 자료에 접근할 수 없다.
    프로세스가 할당받은 메모리 영역 내에서 Stack 형식으로 할당된 메모리 영역은 따로 할당받고, 나머지 Code/Data/Heap 형식으로 할당된 메모리 영역을 공유한다. 따라서 각각의 스레드는 별도의 스택을 가지고 있지만 힙 메모리는 서로 읽고 쓸 수 있게 된다.

  2. 오류 발생시
    프로세스는 독립적으로 실행되기때문에 하나가 말썽이면 그냥 프로세스 끝내기 하면 하나만 종료가 된다
    즉 다른 프로세스에 영향이없다.
    반면에 스레드는 Code/Data/Heap 메모리 영역의 내용을 공유하기 때문에 어떤 스레드 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드 모두가 강제로 종료된다.

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

말그대로 여러개의 프로세스와 스레드를 쓴다는 말이다.
요즘들어 자주 등장하는 멀티 테스킹과 멀티프로세스는 같은 용어같다
멀티태스킹이란, 하나의 운영체제 안에서 여러 프로세스가 실행되는 것을 의미한다.
멀티스레드는 하나의 프로세스가 여러 작업을 여러 스레드를 사용하여 동시에 처리하는 것을 의미한다.

멀티스레드의 장점
1. Context-Switching할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
2. 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.
멀티스레드의 단점
1. 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
2. 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없다.

Context-Switching이란

CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 Context Switching라 한다

멀티스레드의 장단점에서 꼭 짚고 넘어가야 할 점이 바로 동기화 문제다. 주로 Synchronization Issue라고 하는데, 이에 대해 자세히 설명하면 다음과 같다.
멀티스레드를 사용하면 각각의 스레드 중 어떤 것이 어떤 순서로 실행될 지 그 순서를 알 수 없다. 만약 A 스레드가 어떤 자원을 사용하다가 B 스레드로 제어권이 넘어간 후 B 스레드가 해당 자원을 수정했을 때, 다시 제어권을 받은 A 스레드가 해당 자원에 접근하지 못하거나 바뀐 자원에 접근하게 되는 오류가 발생할 수 있다.
즉 스레드 간에는 자원공유를 하면서 전역변수를 이용함으로 함께 상용할때 충돌이 발생할수 있다
개발자들간의 var 사용과 같은것 같다.

면접을 위한 정리

프로그램을 실행한게 프로세스 이다.
스레드는 프로세스 내에서 실행되는 여러 흐름의 단위
프로세스는 독립된 메모리로 개별인 반면에 스레드는 서로 공유하여서 쓰는 자원이 있다
스레드는 stack 영역을 제외하고 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답시간이 빠르다
에러 발생시 프로세스는 개별로 종료하며 서로 영향이 없고 스레드는 공유자원 있어서 서로 문제가 될 수 있다.

출처

기본 정리 잘되어 있는 곳
상세적으로 읽기 좋은 곳

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글