Análisis del navegador web moderno (parte 1)

Mariko Kosaka

CPU, GPU, memoria y arquitectura multiproceso

En esta serie de blogs de 4 partes, analizaremos el navegador Chrome desde la arquitectura de alto nivel hasta los detalles de la canalización de renderización. Si alguna vez te preguntaste cómo el navegador convierte tu código en un sitio web funcional o no sabes por qué se sugiere una técnica específica para mejorar el rendimiento, esta serie es para ti.

En la parte 1 de esta serie, analizaremos la terminología básica de la computación y la arquitectura de varios procesos de Chrome.

En el centro de la computadora, se encuentran la CPU y la GPU.

Para comprender el entorno en el que se ejecuta el navegador, debemos comprender algunas partes de la computadora y lo que hacen.

CPU

CPU
Figura 1: 4 núcleos de CPU como trabajadores de oficina sentados en cada escritorio que controlan las tareas a medida que llegan

La primera es la Unidad de Proceso Central, o CPU. La CPU se puede considerar el cerebro de tu computadora. Un núcleo de CPU, representado aquí como un trabajador de oficina, puede controlar muchas tareas diferentes, una por una, a medida que llegan. Puede manejar todo, desde matemáticas hasta arte, y saber cómo responder a una llamada de un cliente. En el pasado, la mayoría de las CPUs eran un solo chip. Un núcleo es como otra CPU que se encuentra en el mismo chip. En el hardware moderno, a menudo se obtiene más de un núcleo, lo que brinda más potencia de procesamiento a los teléfonos y las laptops.

GPU

GPU
Figura 2: Muchos núcleos de GPU con una llave inglesa que sugiere que controlan una tarea limitada

La Unidad de Proceso Gráfico o GPU es otra parte de la computadora. A diferencia de la CPU, la GPU es buena para manejar tareas simples, pero en varios núcleos al mismo tiempo. Como su nombre lo sugiere, se desarrolló por primera vez para controlar los gráficos. Por este motivo, en el contexto de los gráficos, "usar GPU" o "con respaldo de GPU" se asocia con una renderización rápida y una interacción fluida. En los últimos años, con el procesamiento acelerado por GPU, cada vez más cálculos se pueden realizar solo en la GPU.

Cuando inicias una aplicación en tu computadora o teléfono, la CPU y la GPU son las que la alimentan. Por lo general, las aplicaciones se ejecutan en la CPU y la GPU con mecanismos que proporciona el sistema operativo.

Hardware, SO y aplicación
Figura 3: Tres capas de la arquitectura de computadoras. Hardware de la máquina en la parte inferior, sistema operativo en el medio y aplicación en la parte superior.

Ejecuta el programa en el proceso y el subproceso

procesos y subprocesos
Figura 4: Proceso como un cuadro de límite, subprocesos como peces abstractos que nadan dentro de un proceso

Otro concepto que debes comprender antes de profundizar en la arquitectura del navegador es el proceso y el subproceso. Un proceso se puede describir como el programa de ejecución de una aplicación. Un subproceso es el que vive dentro del proceso y ejecuta cualquier parte del programa de su proceso.

Cuando inicias una aplicación, se crea un proceso. El programa puede crear subprocesos para ayudarlo a trabajar, pero eso es opcional. El sistema operativo le proporciona al proceso una “porción” de memoria para trabajar y todo el estado de la aplicación se mantiene en ese espacio de memoria privada. Cuando cierras la aplicación, el proceso también desaparece y el sistema operativo libera la memoria.

proceso y memoria
Figura 5: Diagrama de un proceso que usa espacio de memoria y almacena datos de la aplicación

Un proceso puede pedirle al sistema operativo que inicie otro proceso para ejecutar diferentes tareas. Cuando esto sucede, se asignan diferentes partes de la memoria para el proceso nuevo. Si dos procesos necesitan comunicarse, pueden hacerlo mediante la comunicación inter proceso (IPC). Muchas aplicaciones están diseñadas para funcionar de esta manera, de modo que, si un proceso de trabajo deja de responder, se pueda reiniciar sin detener otros procesos que ejecutan diferentes partes de la aplicación.

proceso de trabajo y IPC
Figura 6: Diagrama de procesos separados que se comunican a través de IPC

Arquitectura del navegador

Entonces, ¿cómo se compila un navegador web con procesos y subprocesos? Bueno, podría ser un proceso con muchos subprocesos diferentes o muchos procesos diferentes con algunos subprocesos que se comunican a través de IPC.

arquitectura del navegador
Figura 7: Diferentes arquitecturas de navegadores en un diagrama de proceso o subproceso

Lo importante aquí es que estas diferentes arquitecturas son detalles de implementación. No hay una especificación estándar sobre cómo compilar un navegador web. El enfoque de un navegador puede ser completamente diferente al de otro.

Para esta serie de blogs, usaremos la arquitectura reciente de Chrome, que se describe en la Figura 8.

En la parte superior, se encuentra el proceso del navegador que se coordina con otros procesos que se encargan de diferentes partes de la aplicación. En el caso del proceso de renderización, se crean varios procesos y se asignan a cada pestaña. Hasta hace poco, Chrome asignaba un proceso a cada pestaña cuando podía. Ahora, intenta asignar a cada sitio su propio proceso, incluidos los iframes (consulta Aislamiento de sitios).

arquitectura del navegador
Figura 8: Diagrama de la arquitectura de varios procesos de Chrome. Se muestran varias capas en el proceso del renderizador para representar que Chrome ejecuta varios procesos del renderizador para cada pestaña.

¿Qué proceso controla qué?

En la siguiente tabla, se describe cada proceso de Chrome y lo que controla:

Proceso y qué controla
Navegador Controla la parte "chrome" de la aplicación, incluida la barra de direcciones, los favoritos y los botones Atrás y Adelante.
También controla las partes invisibles y privilegiadas de un navegador web, como las solicitudes de red y el acceso a archivos.
Procesador Controla todo lo que se encuentra dentro de la pestaña en la que se muestra un sitio web.
Complemento Controla los complementos que usa el sitio web, por ejemplo, Flash.
GPU Controla las tareas de la GPU de forma independiente de otros procesos. Se separa en diferentes procesos porque las GPUs controlan las solicitudes de varias apps y las dibujan en la misma superficie.
Procesos de Chrome
Figura 9: Diferentes procesos que apuntan a diferentes partes de la IU del navegador

Hay aún más procesos, como el proceso de extensión y los procesos de utilidad. Si quieres ver cuántos procesos se están ejecutando en Chrome, haz clic en el ícono del menú de opciones en la esquina superior derecha, selecciona Más herramientas y, luego, selecciona Administrador de tareas. Se abrirá una ventana con una lista de los procesos que se están ejecutando en ese momento y la cantidad de CPU o memoria que usan.

Beneficios de la arquitectura de varios procesos en Chrome

Antes, mencioné que Chrome usa varios procesos de renderización. En el caso más simple, puedes imaginar que cada pestaña tiene su propio proceso de renderización. Supongamos que tienes 3 pestañas abiertas y cada una se ejecuta con un proceso de renderización independiente.

Si una pestaña deja de responder, puedes cerrarla y seguir adelante mientras mantienes activas las otras pestañas. Si todas las pestañas se ejecutan en un proceso, cuando una pestaña deja de responder, todas dejan de responder. Eso es triste.

Renderizador múltiple para pestañas
Figura 10: Diagrama que muestra varios procesos que ejecutan cada pestaña

Otro beneficio de separar el trabajo del navegador en varios procesos es la seguridad y la zona de pruebas. Dado que los sistemas operativos proporcionan una forma de restringir los privilegios de los procesos, el navegador puede poner en la zona de pruebas ciertos procesos de ciertas funciones. Por ejemplo, el navegador Chrome restringe el acceso a archivos arbitrarios para los procesos que controlan entradas del usuario arbitrarias, como el proceso de renderización.

Debido a que los procesos tienen su propio espacio de memoria privada, a menudo contienen copias de infraestructura común (como V8, que es un motor de JavaScript de Chrome). Esto significa que se usa más memoria, ya que no se pueden compartir de la misma manera que si fueran subprocesos dentro del mismo proceso. Para ahorrar memoria, Chrome limita la cantidad de procesos que puede iniciar. El límite varía según la cantidad de memoria y potencia de la CPU que tenga tu dispositivo, pero cuando Chrome alcanza el límite, comienza a ejecutar varias pestañas del mismo sitio en un solo proceso.

Ahorro de más memoria: Servicification en Chrome

Se aplica el mismo enfoque al proceso del navegador. Chrome está experimentando cambios de arquitectura para ejecutar cada parte del programa del navegador como un servicio que permite dividirlo en diferentes procesos o agregarlo a uno.

La idea general es que, cuando Chrome se ejecuta en hardware potente, puede dividir cada servicio en procesos diferentes, lo que brinda más estabilidad, pero si se encuentra en un dispositivo con limitaciones de recursos, Chrome consolida los servicios en un proceso para ahorrar espacio en la memoria. Antes de este cambio, se usaba un enfoque similar de consolidación de procesos para reducir el uso de memoria en plataformas como Android.

Servificaci￳n de Chrome
Figura 11: Diagrama de la servitización de Chrome que traslada diferentes servicios a varios procesos y un solo proceso del navegador

Procesos del renderizador por fotograma: Aislamiento de sitios

El aislamiento de sitios es una función que se introdujo recientemente en Chrome y que ejecuta un proceso de renderización independiente para cada iframe entre sitios. Hablamos de un proceso de renderización por modelo de pestaña que permitía que los iframes entre sitios se ejecutaran en un solo proceso de renderización con el uso compartido del espacio de memoria entre diferentes sitios. Ejecutar a.com y b.com en el mismo proceso de renderización podría parecer correcto. La política de mismo origen es el modelo de seguridad principal de la Web. Se asegura de que un sitio no pueda acceder a los datos de otros sitios sin consentimiento. Eludir esta política es un objetivo principal de los ataques de seguridad. El aislamiento de procesos es la forma más eficaz de separar los sitios. Con Meltdown y Spectre, se hizo aún más evidente que debemos separar los sitios con procesos. Con el aislamiento de sitios habilitado en computadoras de escritorio de forma predeterminada desde Chrome 67, cada iframe entre sitios en una pestaña obtiene un proceso de renderización independiente.

aislamiento de sitios
Figura 12: Diagrama de aislamiento de sitios; varios procesos de renderización que apuntan a iframes dentro de un sitio

Habilitar el aislamiento de sitios fue un esfuerzo de ingeniería de varios años. El aislamiento de sitios no es tan simple como asignar diferentes procesos de renderización, ya que cambia de forma fundamental la forma en que los iframes se comunican entre sí. Abrir DevTools en una página con iframes que se ejecutan en diferentes procesos significa que DevTools tuvo que implementar trabajo en segundo plano para que se vea sin problemas. Incluso ejecutar una simple combinación de teclas Ctrl + F para encontrar una palabra en una página implica realizar una búsqueda en diferentes procesos del renderizador. Puedes ver el motivo por el que los ingenieros de navegadores hablan del lanzamiento del aislamiento de sitios como un gran logro.

Conclusión

En esta publicación, analizamos una vista de alto nivel de la arquitectura del navegador y los beneficios de una arquitectura de varios procesos. También hablamos de la conversión de servicios y el aislamiento de sitios en Chrome, que están profundamente relacionados con la arquitectura de varios procesos. En la próxima publicación, comenzaremos a analizar lo que sucede entre estos procesos y subprocesos para mostrar un sitio web.

¿Te gustó la publicación? Si tienes preguntas o sugerencias para futuras publicaciones, escríbenos a @kosamari en Twitter.

Siguiente: Qué sucede en la navegación