¿Por qué el diseño de RAM / memoria de un programa está dividido en diferentes secciones como stack, heap y BSS? ¿Por qué no solo memoria?

No idiomas tiene todas esas divisiones. En C, una memoria es solo memoria y, como máximo, solo tiene distinción entre pila y otra.

Pero para responder a su pregunta, supongamos que la memoria no se dividió en secciones y sucede lo siguiente:

1. Llamo a una función que internamente llama a 1 función más.
2. La función que llamé antes de llamar a cualquier otra función es cargar datos desde DB y los datos son enormes.
3. Como no tengo la segmentación de memoria, toda mi memoria disponible se usó para almacenar los datos de DB, y NO puedo llamar a la función requerida ya que no hay memoria disponible para que esta llamada de función se registre en la pila de llamadas. De hecho, el programa no responderá y no hará nada. Ahora este es un escenario terrible …

Si acabamos de tener límites predefinidos en la cantidad de Max stack, memoria de almacenamiento dinámico disponible para cualquier programa, el programa puede fallar rápidamente e informar un problema de memoria.

Pero la segmentación no es solo por esta única razón, sino que también está allí para obtener un rendimiento optimizado. Estamos seguros de que la pila no necesita ser GC’ed, pero Heap sí puede para que Heap pueda pasar por GC’ing y eso sin duda le dará alguna ventaja.