현대 웹 브라우저는 단순한 웹 서핑 도구를 넘어 복잡한 웹 애플리케이션을 실행하는 플랫폼으로 진화했다. 구글에서 개발된 크롬은 가장 많이 사용되는 브라우저 중 하나로, 크롬의 성능과 안정성은 크롬의 모체인 크로미움(Chromium - 구글의 오픈소스 웹 브라우저)의 멀티프로세스 아키텍처에 기반하고 있다. 이 글에는 프로세스, 스레드, 멀티 프로세스, 멀티 스레의 개념 및 크롬의 멀티 프로세스 아키텍쳐에 대해 공부한 내용을 기록해두었다.
프로세스(Process)
개발자가 작성하는 코드가 프로그램이라면, 프로그램이 실생된 것이 프로세스다. 컴퓨터에서 실행되는 모든 애플리케이션은 하나 이상의 프로세스로 구성된다. 하드디스크에 저장된 프로그램이 실행되며 메모리에 저장되는데 이 프로세스는 메모리에 할당된 자신만의 독립적인 가상 주소 공간을 가지며, 이 공간에는 실행 코드, 실행 중 데이터, 그리고 프로그램의 상태가 저장된다.
프로그램이 프로세스로 실행되며 메모리에 저장되는 영역
Code : 실행 명령을 포함하는 코드 영역
Data : Static 변수, Global 변수영역
Heap : 동적 메모리 영역
Stack : 지역변수, 매개변수, 반환 값 등등의 일시적인 데이터의 영역
또한 프로세스 생성시에는 프로세스 제어 블록(Process Control Block, PCB)이 함께 생성된다. PCB는 각 프로세스의 중요 정보를 저장하며, 운영 체제가 프로세스 관리 및 스케줄링을 효율적으로 수행할 수 있도록 돕는다. PCB에는 아래와 같은 항목들이 포함된다.
PCB에 포함된 주요 정보
- 포인터 : 운영체제가 프로세스에 접근할때 사용하며, 프로세스의 상태나 정보를 관리한다.
- 프로세스 식별자(Process ID, PID): 각 프로세스를 고유하게 식별하는 번호이다.
- 프로세스 상태: 프로세스의 현재 상태(예: 실행 중, 준비 상태, 대기 상태)를 나타낸다.
- 프로그램 카운터(Program Counter, PC): 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.
- CPU 레지스터 정보: 프로세스 실행에 필요한 CPU 레지스터의 상태 정보이다. 이는 프로세스가 중단되었다가 다시 시작할 때 이전 상태를 복원하는 데 사용된다.
- CPU 스케줄링 정보: 프로세스의 우선순위, 스케줄링 큐에 대한 정보 등 CPU 스케줄링과 관련된 정보를 포함한다.
- 메모리 관리 정보: 프로세스에 할당된 메모리 영역에 대한 정보와 페이지 테이블, 세그먼트 테이블과 같은 메모리 관리를 위한 데이터 구조의 주소가 여기에 포함된다.
- 입출력 상태 정보: 프로세스에 할당된 입출력 장치와 열린 파일 목록, 입출력 관련 각종 플래그 등을 관리한다.
- 계정 정보: 프로세스 실행에 사용된 CPU 시간과 같은 사용량 통계를 포함하여 계정과 관련된 정보를 저장한다.
프로세스는 시스템 리소스와 서비스를 이용할 수 있는 실행 환경을 제공받으며, 운영체제는 이 프로세스들을 관리하여 CPU 시간을 할당하고, 필요한 메모리를 제공하며, 입출력 관리 등을 수행한다. 프로세스는 보통 최소한 하나의 스레드를 가지고 있다. 이 스레드는 프로세스가 실행되면서 수행하는 작업의 기본 단위로 사용된다.
각 프로세스는 독립적이기 때문에 한 프로세스의 오류가 다른 프로세스에 영향을 미치지 않는다. 이는 시스템의 안정성을 높여준다.
멀티프로세스
하나의 CPU에서는 동일한 시간에 하나의 프로세스밖에 실행할 수 없지만, CPU가 여러 프로세스 사이를 빠르게 전환함으로써 여러 프로세스가 동시에 실행되는 것처럼 처리된다. 이 개념을 동시성(Concurrency)이라고 한다. 이런 멀티태스킹은 컨텍스트 스위칭(Context Switching)에 의존하며, 각 프로세스는 실행을 위한 매우 짧은 단위의 일정 시간 동안만 CPU를 사용하고(시분할 점유), 시간이 만료되면 다음 프로세스로 전환된다.
스레드(Thread)
스레드는 프로세스 내의 실행 단위이다. 스레드는 프로세스 내에서 실제 작업을 수행하는 주체로 하나의 프로세스는 여러 스레드를 가질 수 있으며, 각 스레드는 독립적으로 실행될 수 있는 명령의 시퀀스를 포함한다. 각 스레드들은 프로세스가 소유한 자원과 메모리를 공유한다. 이 공유를 바탕으로 스레드는 프로세스간 컨텍스트 스위칭보다 더 효율적으로 전환될 수 있다.
스레드가 공유하는 영역
Code : 프로그램의 실행 명령이 저장되어 있는 영역이다.
Data: 정적(static) 변수와 전역(global) 변수가 저장되는 영역이다.
Heap: 동적으로 할당된 메모리가 저장되는 영역이다.
스레드별로 독립적으로 관리되는 영역
Stack : 각 스레드의 함수 호출과 관련된 로컬 변수, 매개변수, 반환 값 등을 저장하는 데 사용되는 영역이다.
스레드는 다음과 같은 특징을 가지고 있다
스레드의 특징
- 경량화된 프로세스: 스레드는 프로세스보다 생성과 관리가 비용이 적게 들고, 프로세스에 비해 오버헤드가 낮다. 스레드간 컨텍스트 스위칭도 프로세스 간 스위칭보다 빠르고 효율적이다.
- 자원 공유: 동일 프로세스 내의 스레드들은 메모리 및 자원을 공유한다. 이는 데이터 교환을 용이하게 하며, 통신 비용을 줄여준다.
- 병렬 처리의 향상: 여러 스레드를 사용하면 작업을 병렬로 분할하여 처리할 수 있어 프로그램의 실행 속도를 향상시킬 수 있다.
- 동기화: 스레드 간 공유 자원에 대한 접근을 제어하기 위해 별도의 동기화 메커니즘이 필요하다.
멀티 스레드
멀티 스레딩(Multithreading)은 한 프로세스 내에서 여러 스레드를 동시에 실행하는 기술로, 각 스레드는 프로세스의 자원을 공유하면서 독립적인 작업을 수행할 수 있다. 멀티 스레드 아키텍쳐를 사용하면 프로그램의 실행 효율을 극대화하고, 시스템 자원의 활용도를 높일 수 있다. 멀티 스레드는 아래과 같은 특징을 가진다.
멀티스레드의 특징
- 자원 공유: 멀티 스레딩은 하나의 프로세스 내에서 메모리와 자원을 공유한다. 이로 인해 스레드 간 데이터 교환과 통신이 훨씬 효율적이며 빠르다.
- 응답성 향상: 사용자 인터페이스가 멀티 스레드로 처리되면, 하나의 스레드가 긴 작업을 처리하는 동안 다른 스레드가 사용자 입력을 처리할 수 있어 프로그램의 응답성이 좋아진다.
- 자원 활용의 최적화: 멀티 스레딩은 CPU의 멀티 코어를 효과적으로 활용하여, 여러 스레드를 병렬로 실행함으로써 처리 속도를 향상시킨다.
- 경제성: 멀티 스레딩은 프로세스를 생성하는 것보다 자원 소비가 훨씬 적다. 스레드 간의 컨텍스트 스위칭이 프로세스 간의 스위칭보다 자원 소모가 적어, 더 효율적인 자원 관리가 가능하다.
멀티프로세스 VS 멀티스레드
멀티프로세스
- 각 프로세스는 독립적으로 작동한다
- 각 프로세스는 IPC(Inter-Process Communication)기술을 를 사용해 통신한다.
- 각 프로세스는 자원을 소모적으로 사용하며, 개별 메모리를 차지한다.
- 컨텍스트 스위칭의 비용이 크다.
- 각 프로세스간 동기화 작업이 필요하지 않다.
멀티스레드
- 각 스레드는 일정 자원을 공유하며 긴밀하게 연결되어있다.
- 공유된 자원을 바탕으로 스레드간 통신 비용이 절감된다.
- 메모리를 공유하며 효율적으로 작동된다.
- 컨텍스트 스위칭의 비용이 적다.
- 동기화를 통해 공유된 자원을 관리해야한다.
크롬의 멀티프로세스 아키텍쳐
크롬은 멀티프로세스 아키텍처를 초기에 채택하여 대중화한 브라우저 중 하나이다. 크롬은 크로미움이라는 구글의 오픈소스 브라우저를 기반으로 하고 있다. 이 구글 크롬(크로미움)의 멀티프로세스 아키텍처는 여러 종류의 프로세스로 구성되어 각각 다른 역할을 수행한다. 크롬을 열고 작업관리자를 확인해보면 여러 프로세스가 실행중인 것을 확인할 수 있는데 이러한 구조는 크롬의 성능, 안정성, 그리고 보안을 향상시키는 데 중요한 역할을 한다. 다음은 크롬에서 사용되는 주요 프로세스들이다.
크롬의 프로세스
- 브라우저 프로세스: 사용자 인터페이스와 관련된 모든 요소를 처리한다. 주소 표시줄, 북마크, 전방/후방 버튼, 설정 등의 기능이 여기에 포함된다. 또한, 탭 관리, 창 관리, 파일 다운로드, 데이터 동기화 등과 같은 코어 기능도 담당한다. 브라우저 프로세스는 크롬의 메인 프로세스로서, 다른 모든 하위 프로세스들을 관리하고 조정하는 역할을 수행한다.
- 렌더러 프로세스: 웹 페이지의 렌더링을 담당한다. 각 탭은 보통 고유의 렌더러 프로세스를 가지며 즉 탭별로 하나씩 실행되며, HTML, CSS, 자바스크립트 등을 실행하여 사용자에게 페이지를 표시한다. 최근에는 크롬의 사이트 격리(site isolation) 정책으로 iframe 태그 내의 사이트 또한 별도의 렌더러 프로세스에서 실행된다.
- 플러그인 프로세스: 타사의 플러그인들은 각각 독립적인 프로세스에서 실행된다. 이는 플러그인 충돌로 인해 전체 브라우저가 중단되는 것을 방지한다.
- GPU 프로세스: 웹 페이지 렌더링을 위한 하드웨어 가속을 처리한다. 이 프로세스는 그래픽 관련 작업을 담당하며 렌더러 프로세스의 부하를 줄여준다.
- 유틸리티 프로세스 : 배경에서 작동하는 다양한 작업을 처리한다. 예를 들어, 파일 형식 변환, 인덱싱, 안전한 브라우징 검사 등이 여기에 해당한다.
위에서 정리한 내용을 보면 멀티스레드의 장점이 훨씬 더 많은 것 같은데 왜 크롬은 멀티 프로세스 방식을 채택했을까? 크롬의 멀티 프로세스 아키텍처는 브라우저의 안정성과 보안, 사용자 경험을 향상시킨다. 크롬은 각 탭, 플러그인, 확장 프로그램을 별도의 프로세스로 실행하여 하나의 탭에서 발생하는 문제가 전체 브라우저에 영향을 미치지 않도록 방지한다. 내용을 정리해보면 아래와 같다.
크롬이 멀티프로세스를 채택하므로서 얻는 이점
1. 안정성 향상
- 프로세스 격리: 각 탭이 독립적인 프로세스로 실행됨으로써, 하나의 탭에서 발생한 문제가 다른 탭이나 전체 브라우저에 영향을 끼치지 않는다. 예를 들어, 한 탭에서 크래시가 발생해도 그 탭만 닫히고, 다른 탭은 영향을 받지 않아 전체 브라우저의 안정성이 유지된다.
2. 보안 강화
- 보안 샌드박스: 멀티프로세스 구조는 각 프로세스를 구분된 환경(샌드박스)에서 실행할 수 있게 함으로써 즉, 메모리 공유를 원천적으로 금지하므로서, 악성 코드가 시스템의 나머지 부분에 영향을 미치는 것을 방지한다. 이는 웹사이트 간 정보 유출을 막고, 각 탭을 독립적으로 보안 유지하는 데 도움을 준다. 사이트 격리 기능 역시 현재 사이트와 iframe내 사이트의 메모리 공유를 차단하려는 목적으로 도입되었다.
3. 반응성 증가
- 자원 활용 최적화: 멀티프로세스 구조에서는 한 프로세스의 부하가 증가해도 다른 프로세스에는 영향을 미치지 않아 각 탭의 반응성을 유지할 수 있다. 사용자 입장에서는 한 탭에서 복잡한 작업을 수행하더라도 다른 탭의 성능 저하가 없어 사용자 경험이 개선된다.
4. 멀티코어 프로세서의 이점 활용
- 병렬 처리: 현대의 컴퓨터 시스템은 대부분 멀티코어 프로세서를 사용하고 있다. 멀티프로세스 방식은 각각의 프로세스가 별도의 CPU 코어에서 실행될 수 있게 하여, 이러한 하드웨어의 병렬 처리 능력을 더욱 효과적으로 활용할 수 있다.
5. 유지보수 및 개발의 용이성
- 모듈화: 멀티프로세스 아키텍처는 시스템을 더 모듈화하여 개발과 유지보수를 용이하게 한다. 각 프로세스는 독립적으로 개발하고 테스트할 수 있어 더 좋은 품질의 브라우저를 개발할 수 있게 된다.
크롬의 멀티프로세스 아키텍처는 브라우저의 성능을 최적화하고, 각 구성 요소가 서로에게 미치는 영향을 최소화함으로써 더 안정적인 사용자 경험을 제공한다. 때때로 많은 탭과 확장프로그램을 동시에 사용할 때 시스템의 메모리 부하가 증가하여 성능 저하가 발생되기도 하지만, 그럼에도 불구하고 브라우저의 전반적인 안정성과 보안을 향상시키는 효과적인 방법으로 평가받고 있다.