
Firefox meets multicore system
해당 글은 MDN의 Entering the Quantum Era—How Firefox got fast again and where it’s going to get faster 글을 참고하여 작성하였습니다.
2016년, Firefox를 관리하는 Mozilla 재단에서 Quantum 프로젝트를 발표합니다. 이 프로젝트는 나날이 성장하는 Google Chrome에 대항하기 위한 웹 브라우저를 내놓겠다는 내용이였습니다. 그리고 이 결실은 2017년에 이루어집니다. 2017년 11월, Firefox의 57.0 버전이 릴리즈 되면서 Firefox 웹 브라우저에 있어 큰 도약을 하게 됩니다. 기존의 레이아웃 엔진이였던 Gekco 엔진을 부분적으로 새 엔진인 Servo를 도입한 정식적인 버전이였습니다. 이 업데이트 이후로 Firefox는 상당히 빠르고 안정적인 웹 브라우징 경험을 사용자들한테 제공할 수 있었습니다. 이번 글은 Firefox가 어떻게 페이지를 빠르고 안정적으로 렌더링을 할 수 있었는지에 대해 알아보겠습니다.
Quantum 프로젝트에서 가장 신경 쓴 부분은 멀티 코어 병렬처리입니다. Gecko 엔진이 나왔을 당시, CPU는 싱글 코어 구조로 Gecko 엔진 또한 코어 한 개의 기준으로 작성한 프로그램이었습니다. 2000년 중후반부터 여러 일(task)들을 독립적으로 실행할 수 있는 멀티 코어 프로세서가 시장에 하나 둘 나오게 됩니다. Gecko 엔진은 점점 시대에 맞지 않는 브라우저가 되었습니다. 결정적으로, 2008년 멀티 코어 설계에 맞춘 Google의 Chrome 브라우저가 나오면서 Firefox 브라우저의 설 자리가 좁아졌습니다. Firefox 팀도 멀티 코어 프로세서를 지원하는 웹 브라우저 엔진을 만들기로 결심합니다.
Firefox 팀은 2008년 부터 시작된 Electrolysis 프로젝트를 진행하면서 Chrome과 비슷한 멀티 코어 기반의 아키텍처를 설계했지만 실제로 Firefox 엔진에 적용하기 까지는 여러 난관이 있었습니다. 첫 번째로 싱글 코어에서는 고민하지 않아도 될 동시성 문제입니다. 멀티 코어 환경에서 병렬적으로 여러 태스크를 처리하려면 코어들 간에 메모리를 공유해야 합니다. 만약 두개의 코어가 같은 메모리에 접근해 연산 작업을 하게 된다면 race condition 문제가 발생 할 수 있습니다. 두 번째 문제로는 기존의 싱글 코어 기준으로 작성된 Gecko 엔진을 멀티 코어 설계로의 전환이 힘들었다는 점입니다.
두 가지 문제에 대해 Firefox 팀이 내놓은 답은 간단했습니다. 첫 번째의 문제로 멀티 코어의 메모리 공유로 인한 동시성 문제를 해결하기 위해, Firefox 팀은 두 개 이상의 코어가 메모리를 공유하지 않아도 될 정도로 프로그램을 한 덩어리 형태로 나누는 coarse-grained parallelism 방법을 도입했습니다. 이는 코어들간에 메모리 공유를 할 필요가 없어져 동시성 문제에서 자유로워 질 수 있습니다. 웹 브라우저에서는 탭(tab) 같이 coarse-grained parallelism 방식에 맞추기 쉬운 부분들이 있습니다. 각 탭들은 foreground에서든 background에서든 실행되어 서로 방해 받지 않으면서 독립적으로 실행 될 수 있습니다.
두 번째는 기존 레거시 코드로 인한 전환 문제입니다. 이에 대한 해결점도 간단했는데, 기존 엔진을 버리고 새롭게 엔진을 작성한다는 것이었습니다. Firefox 팀은 2016년에 Quantum이라는 이름으로 프로젝트를 시작하면서 멀티 코어 지원을 위한 엔진 개발을 착수하여 2017년 11월에 발표한 Firefox 57 버전에 정식으로 출시합니다.
Quantum 프로젝트는 여러 팀으로 나누어서 진행했습니다.