Brian Kernighan explica en este video la atracción temprana de Bell Labs por los pequeños lenguajes / programas basados en limitaciones de memoria
Una máquina grande tendría 64 k-bytes, K, no M o G, y eso significaba que cualquier programa individual no podía ser muy grande, por lo que había una tendencia natural a escribir programas pequeños, y luego el mecanismo de canalización, Básicamente, la redirección de entrada y salida hizo posible vincular un programa a otro.
Pero no entiendo cómo esto podría limitar el uso de memoria teniendo en cuenta el hecho de que los datos deben almacenarse en la RAM para transmitir entre programas.
De Wikipedia :
En la mayoría de los sistemas tipo Unix, todos los procesos de una tubería se inician al mismo tiempo [énfasis mío], con sus secuencias conectadas adecuadamente y gestionadas por el planificador junto con todos los demás procesos que se ejecutan en la máquina. Un aspecto importante de esto, diferenciar las tuberías de Unix de otras implementaciones de tuberías, es el concepto de almacenamiento en búfer: por ejemplo, un programa de envío puede producir 5000 bytes por segundo, y un programa de recepción solo puede aceptar 100 bytes por segundo, pero no se pierden datos En cambio, la salida del programa de envío se mantiene en el búfer. Cuando el programa receptor está listo para leer datos, el siguiente programa en la tubería lee desde el búfer. En Linux, el tamaño del búfer es de 65536 bytes (64 KB). Un filtro de terceros de código abierto llamado bfr está disponible para proporcionar búferes más grandes si es necesario.
Esto me confunde aún más, ya que esto anula por completo el propósito de los programas pequeños (aunque serían modulares hasta cierta escala).
Lo único que puedo pensar como una solución a mi primera pregunta (las limitaciones de memoria son problemáticas dependiendo de los datos de tamaño) sería que los grandes conjuntos de datos simplemente no se computaron en ese momento y el problema real que las tuberías estaban destinadas a resolver era el cantidad de memoria requerida por los propios programas. Pero dado el texto en negrita en la cita de Wikipedia, incluso esto me confunde: como un programa no se implementa a la vez.
Todo esto tendría mucho sentido si se usaran archivos temporales, pero tengo entendido que las tuberías no escriben en el disco (a menos que se use el intercambio).
Ejemplo:
sed 'simplesubstitution' file | sort | uniq > file2
Para mí está claro que sed
está leyendo el archivo y escupiéndolo línea por línea. Pero sort
, como BK afirma en el video vinculado, es un punto final, por lo que todos los datos deben leerse en la memoria (¿o no?), Luego se transmiten a uniq
, lo que (en mi opinión) sería uno programa en línea a la vez. Pero entre la primera y la segunda tubería, todos los datos deben estar en la memoria, ¿no?
unless swap is used
el intercambio siempre se usa cuando no hay suficiente RAM