Process vs Thread (feat. 크로미움 브라우저)

이원희·2020년 11월 10일
4

 🖥 OS

목록 보기
3/3
post-thumbnail

프로세스와 스레드는 운영체제를 이해할때도 기본이지만 사실 프로그래밍을 할때 알아야하는 필수사항이다.
모른다면 프로그래밍하기 힘들다..
그리고 기술 면접에서 단골 주제이기도 하고, 한 번 알아두면 개발할 때 좀 큰 그림을 보는 눈이 생긴다. (물론 나만 그랬을 수도 있음..)
이 부분도 사실 파고들면 끝도 없고, 심오한 세계를 마주칠 수 있는 부분이지만 일단 필요하다고 생각되는 부분까지 포스팅해보려한다.

프로세스? 스레드? 그게 뭔대...

프로세스랑 스레드에 알아보기 전에 프로그램에 대해서 알아보자.
프로그램은 어떤 작업을 위해 실행할 수 있는 파일이다.
다른 말로는 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태를 말한다.

  • 메모리에 올라가 있지 않은
    아직 운영체제가 프로그램에게 독립적인 메모리 공간을 할당해주지 않았음을 의미합니다.
    모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있습니다.
  • 정적인 상태
    아직 실행되지 않고 가만히 있다는 뜻이다.

프로세스와 스레드는?

그렇다면 프로그램의 뜻을 생각하면서 아래 프로세스와 스레드의 정의에 대해서 생각해보자

프로세스는 메모리 상에서 실행중인 프로그램이다.

프로그램을 실행하는 순간 해당 파일은 메모리에 올라가게되고 이를 프로세스라고 한다.
(이 상태를 동적인 상태라고 한다.)

OS에 여러 프로세스들이 올라가 있는걸 알 수 있다.
프로세스는 메모리에 올라와 실행되고 있는 프로그램의 인스턴스(독립적인 개체)이다.
즉, 운영체제로부터 시스템 자원을 할당받는 작업의 단위라고 할 수 있다.
(뭐 여기서 멀티 프로세스나 CPU 스케줄링에 대해서 더 얘기할 수 있지만 그건 나중에...)

프로세스의 특징은 뭘까?

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

그렇다면 스레드는?

스레드의 정의를 이해하기 전에 스레드라는 개념이 나타난 이유를 봐보자

과거에는 프로그램을 실행할 때 실행 시작부터 끝까지 프로세스 하나만을 사용해서 진행했다.
프로그램이 복잡해짐에 따라 프로세스 하나만으로 모든 작업을 실행하는게 벅차게 되었다.
이를 해결하기 위해 스레드라는 개념이 생겼다.

즉, 프로세스보다 작은 실행 단위 개념이 필요해서 나타났다.
스레드는 프로세스 안에서 실행되는 흐름 단위로 이해할 수 있다.

스레드는 프로세스 내에 존재한다.
위에서 프로세스는 기본적으로 최소 1개의 스레드를 가지고 있다고 했다.

스레드의 특징은 뭘까?

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

스레드의 특징을 한 번 보면 스레드는 독립된 Stack 영역을 가지고 있고, 다른 메모리 영역들은 서로 공유한다는게 가장 핵심이다.
(사실 스레드의 특징들은 위의 성질에 의한 결과라고 볼 수 있다.)

그렇다면 프로세스/스레드가 강제 종료될때 어떤 일이 일어날까?

이 글에서

WKWebView는 App의 main 프로세스와 별도의 메모리를 할당받아 실행되어 WKWebView가 중단되더라도 App은 중단되지 않는다.

라고 포스팅했었는데 이 부분에 대한 답이 될 질문이다.
(크로미움 브라우저에 대해서 다룰때에도 도움이 될 질문이고)

우리는 프로세스는 각각의 데이터 영역을 할당 받고, 스레드는 stack만 독립적으로 할당받고, 나머지 데이터 영역은 공유한다는 사실을 알고 있다.

프로세스가 강제 종료된 상황에서는 다른 프로세스에게 영향이 있을까?

프로세스간 공유하고 있는 파일을 손상시키는 경우가 아니라면 영향이 없다.
그 이유를 우리는 이제 말할 수 있다.
(프로세스간에는 데이터 영역을 독립적으로 할당받고, 프로세스간에 데이터 영역을 침범하지 못하므로)

스레드가 강제 종료된 상황에서는 다른 스레드에게 영향이 있을까?

스레드 하나에 오류가 발생한다면 같은 프로세스 내의 다른 스레드들도 모두 강제 종료된다.
그 이유는 스레드는 Stack을 제외한 모든 메모리 영역을 스레드간 공유하기 때문이다.

이제 우리는 WKWebView가 중단되더라도 App은 중단되지 않는 이유에 대해서 얘기할 수 있다.

WKWebView는 App의 Main 프로세스와 다른 메모리를 할당 받는다고 했다.
이는 서로 다른 프로세스로 실행된다고 할 수 있다.
우리는 프로세스가 강제 종료된 상황에서 다른 프로세스에게 영향이 없다는 것을 알고 있다.

feat. 크로미움 브라우저에서의 프로세스와 스레드

갑자기 크로미움 브라우저?라고 생각할 순 있지만
상당히 재밌게 읽었던 글이 있어서 공유하고 싶기도하고, 정리해두고 싶어서 남겼다.
(그리고 읽어보면 프로세스와 스레드에 대해 이해를 좀 도와주기도 하고, 이런 부분에도 프로세스와 스레드의 개념이 들어가는구나 생각할 수 있을거 같아 다뤄본다.)

우선 브라우저는

  • 스레드를 많이 사용하는 프로세스 하나
  • 스레드를 조금만 사용하는 프로세스를 여러개 만들어 IPC로 통신

할 수도 있다.
여기서 중요한 점은 표준이 없어 브라우저마다 접근 방식이 다를 수 있다.

나는 그 중에서 크롬에 대해서 다룰 것이고, 그 중에서 크롬이 탭을 생성하는 방식에 대해서 얘기하려한다.

우선 크롬은 렌더러 프로세스를 여러 개 사용한다.
(렌더러 프로세스는 탭 안에서 웹 사이트가 표시되는 부분의 모든 것을 제어한다.)
즉, 탭 하나당 프로세스가 하나씩 할당된다는 것이다.

❗️그럼 우리가 위에서 배운 내용을 적용해본다면

  • 크롬은 1탭-1프로세스이다.
  • 프로세스는 메모리 영역이 독립적으로 할당된다.
  • 프로세스간에는 메모리 영역을 침범하지 않는다.
  • 위의 이유로 프로세스가 강제 종료 되어도 다른 프로세스에는 영향을 끼치지 않는다.
    --> 그렇다면 크롬의 탭 중 하나가 강제 종료 혹은 실행 중지되어도 다른 탭에는 영향이 없다.

위의 흐름으로 이해할 수 있다.

모든 탭이 하나의 프로세스 안에서 여러 스레드로 실행되고 있었다면?

  • 하나의 탭이 강제 종료 혹은 실행 중지되면 다른 탭들도 중지될 것이다.

이제 크로미움 크로미움 브라우저에서의 프로세스와 스레드에 대해 더 자세하게 알고 싶다면 여기로 가서 보면 될 것 같다.
(그리고 참고한 글에는 귀여운 그림과 함께 공부할 수 있다...ㅋㅋㅋㅋㅋ)

프로세스와 스레드도 파고들면 끝이 없기에 한 번 정리해두고 싶었고... 재밌었다... 그럼 20000! 👋

0개의 댓글