크롬 브라우저에 대해서 "멀티 프로세스라서 성능이 좋다"라는 말을 많이 들어봤습니다.
왜 성능이 좋다고 하는지 OS책에서 3장 프로세스에 있는 내용(p.138)을 기반으로 찾아보고자 합니다.
많은 웹사이트는 사용자들에게 풍부하고 동적인 웹 브라우징 경험을 제공하기 위해 Javascript, Flash, HTML5와 같은 능동적 콘텐츠를 포함하고 있다. 불행하게도 이러한 웹 응용들은 소프트웨어 버그도 함께 포함하고 있다.
여기서 말하는 버그는 웹 브라우저를 고장낼 수 있다고 합니다. 크롬과 같은 현대 브라우저들은 탭 형식의 브라우징을 지원하는데 이는 웹 브라우저의 한 인스턴스가 탭마다 웹사이트를 하나씩, 그리고 동시에 여러 웹사이트를 열 수 있게 해줍니다. 사용자는 자신이 원하는 탭만 클릭하면 해당 웹사이트를 이용할 수 있게 됩니다. 이 때, 어느 탭이 고장이 난다고 가정한다면 다른 탭들도 영향을 받을 것입니다. 이러한 문제를 크롬은 "다중 프로세스 구조(==멀티 프로세스)"를 활용해 해결했다고 합니다.
사용자 인터페이스와 함께 디스크와 네트워크 입출력을 관리하는 책임을 진다. Chrome이 시작될 때 새로운 브라우저 프로세스가 생성된다. 오직 하나의 브라우저 프로세스만이 생성된다.
크롬의 메인 프로세스이며, 유저 인터페이스를 제공하고 모든 탭과 창을 관리합니다. 이 프로세스는 브라우저 창, 탭, 주소창, 북마크, 기록 등 브라우저의 주요 기능을 담당합니다. 브라우저 프로세스는 랜더러 프로세스, 플러그인 프로세스, GPU 프로세스, 네트워크 프로세스 등 다른 유형의 프로세스를 생성하고 관리합니다.
브라우저 프로세스는 우리가 컴퓨터를 켰을 때 생성되는 0번 프로세스 처럼 크롬의 마더 프로세스입니다. 이 프로세스가 크롬 브라우저의 다른 모든 프로세스를 생성하고 관리합니다. 브라우저 프로세스는 Chrome의 중심적인 역할을 하며, 사용자의 입력 및 브라우저 창과 관련된 작업을 처리합니다.
웹 페이지를 표시하기 위한 프로그램 논리를 포함한다. 따라서 HTML, Javascript, 이미지 등을 처리하기 위한 프로그램 논리를 포함한다. 일반적으로 새 탭에서 열린 웹사이트마다 새로운 렌더러 프로세스가 생성되고 여러 랜더러 프로세스가 동시에 활동하게 된다.
렌더러 프로세스는 각 탭에서 실행되는 프로세스입니다. 각 탭마다 별도의 렌더러 프로세스가 생성되며, 이 프로세스는 해당 탭에서 열려 있는 웹 페이지의 HTML, CSS, JavaScript 등을 처리합니다. 렌더러 프로세스는 브라우저 프로세스와 분리되어 있으며, 다른 탭에서 실행되는 렌더러 프로세스에는 영향을 미치지 않습니다. 이것은 각 탭이 서로 완전히 분리되어 있어 하나의 탭이 문제가 생겨도 다른 탭에 영향을 주지 않도록 합니다.
크롬의 렌더러 프로세스는 샌드박스 안에서 실행된다고 합니다.샌드박스 안에서 실행된다는 것은, 각 렌더러 프로세스가 별도의 보안 컨텍스트에서 동작하도록 디자인되었다는 것을 의미합니다. 이 보안 컨텍스트는 샌드박스라고 불리며, 렌더러 프로세스가 운영체제의 다른 부분과 분리되어 실행되도록 보장합니다.
즉, 렌더러 프로세스가 샌드박스 안에서 실행됨으로써, 다른 프로세스들과 격리되어 있어서 악성 코드가 렌더러 프로세스를 공격하거나 렌더러 프로세스를 통해 사용자의 시스템에 악성 코드가 침투하는 것을 막을 수 있습니다.
또한, 렌더러 프로세스가 샌드박스 안에서 실행되므로, 렌더러 프로세스가 문제가 발생하여 비정상적으로 종료되더라도, 시스템의 다른 부분에 영향을 미치지 않습니다.
FLASH 또는 QuickTime과 같이 사용 중인 플러그인 종류마다 생성된다. 플러그인 프로세스는 플러그인을 위한 코드뿐 아니라 플러그인이 연관된 렌더러 프로세스와 브라우저 프로세스와 통신할 수 있게 하는 코드를 포함하고 있다.
플래시, PDF 뷰어 등의 플러그인을 실행하는 프로세스입니다. 플러그인 프로세스는 렌더러 프로세스와 마찬가지로 브라우저 프로세스와 분리되어 있습니다. 이것은 플러그인에서 발생하는 문제가 브라우저 전체에 영향을 미치지 않도록 합니다.
이처럼 크롬은 브라우저, 탭, 플러그인 등의 기능을 분리하여 실행하므로, 하나의 프로세스가 충돌하거나 멈추어도 다른 프로세스에는 영향을 미치지 않습니다.
멀티 프로세스 아키텍처는 쉽게 말하면 하나의 어플리케이션을 여러 개의 독립적인 프로세스로 나누어 실행하는 구조를 말합니다. 크롬이 대표적인 멀티 프로세스 아키텍처의 예시입니다. 이 아키텍처의 장점으로는 위에서 말한것처럼 안전성, 보안성이 있으며 또한, 멀티 코어 프로세서를 활용하여 병렬 처리를 할 수 있기 때문에 성능도 향상됩니다.
멀티 프로세스, 멀티 스레드같이 여러개가 동시에 일을 한다 하면 항상 머릿 속을 스쳐가는 문제가 있습니다. 동기화 입니다. 각 프로세스가 독립적으로 일한다면 프로세스의 작업이 끝났을 때 최종 작업물이 다르면 안됩니다. 이러한 문제는 IPC(Interprocess Communication)을 통해 해결합니다. IPC의 기본적인 2가지 모델로는 공유 메모리(shared memory)와 메시지 전달(message passing)이 있습니다. 대부분의 OS가 그러하듯이 크롬 또한 두 가지 방법을 동시에 사용합니다.
먼저 공유 메모리를 사용하는 방식은, 프로세스 간에 데이터를 공유하기 위해 사용됩니다. 예를 들어, 크롬에서는 웹페이지를 렌더링하는 렌더러 프로세스와 브라우저 프로세스 간에 공유 메모리를 사용하여, 렌더링된 웹페이지의 화면을 브라우저 창에 표시합니다.
또한, 메시지 전달을 사용하는 방식은, 프로세스 간의 통신을 위해 사용됩니다. 크롬에서는 각 프로세스 간에 메시지를 전달하고 받기 위해 IPC 메시지 큐를 사용합니다. 이를 통해, 브라우저 프로세스와 렌더러 프로세스, 플러그인 프로세스 등 각각의 프로세스가 서로 통신하여 원활한 동작을 수행할 수 있습니다.
정리하자면 크롬은 데이터 공유를 위해 공유 메모리를, 프로세스 간의 통신을 위해 메시지 전달 방법을 사용합니다.
크롬은 멀티프로세스 아키텍처를 적용한 브라우저로서 안정성과 성능이 훌륭합니다. 독립적인 프로세스 운용으로 프로세스간 미칠 수 있는 악영향은 줄이고, 사용자는 여러 웹사이트를 동시에 사용할 수 있어 성능이 좋습니다.
사용자가 새 탭을 열 때마다 렌더러 프로세스가 별도의 보안 컨텍스트인 샌드박스에서 실행되도록 하여 사용자의 시스템이 안전하게 유지될 수 있도록 합니다.
동기화 문제는 다른 여타 프로세스들과 같이 공유 메모리, 메시지 전달이라는 IPC를 통해 해결했습니다.
이런 크롬의 단점으로는 메모리 사용량이 생각보다 많다는 것이었는데 이는 하드웨어 스펙이 좋아짐에 따라 자연스럽게 해결됐다고 볼 수 있습니다.