Cuando se almacena un bit en la memoria de la computadora, ¿cómo determina su ubicación su ubicación? ¿No tendrá que recordar su ubicación, y ahora tiene una nueva información para almacenar? ¿Cómo terminará esto?

En algunos casos, la dirección de lo que almacenó está codificada directamente en las instrucciones del lenguaje de máquina. Para las variables temporales a corto plazo, esto a menudo es un desplazamiento del valor contenido en un registro de CPU en particular llamado puntero de la pila, digamos “SP + 8”. En este caso, la dirección de los datos, el SP + N se codifica directamente en la secuencia de instrucciones, creada por el compilador que ensambló el programa a partir del código fuente original. Se necesitan bytes en la memoria para almacenar la parte “SP + 8” de la instrucción que necesita usar el valor almacenado en esa ubicación, por lo que sí, se necesita espacio para decirle a la CPU dónde encontrar los otros datos que necesita. Para otros datos a largo plazo, es probable que haya una tabla de datos donde los contenidos son punteros (direcciones) de otros objetos de datos que necesita el programa, y ​​la indirección se hace más y más profunda en ese caso, hasta un punto que depende de La complejidad de las estructuras creadas por el programa que se está ejecutando.

Pero miremos en la otra dirección: las instrucciones de los propios programas se leen automáticamente de la memoria sin necesidad de “almacenamiento adicional” porque la CPU obtiene instrucciones secuencialmente, en orden, desde un punto de partida que se produjo al encender, generalmente algo así como la dirección cero (literalmente). El hardware en la CPU comienza a leer y decodificar las instrucciones desde allí, siguiendo las instrucciones para saltar para ejecutar desde otras partes de la memoria (por ejemplo, el sistema UEFI / BIOS almacenado en la ROM, que es un programa suficiente para iniciar el computadora completamente) y esto continúa durante toda la vida de la sesión. Por lo tanto, la operación secuencial del proceso de ejecución de instrucciones es controlada directamente por el hardware, un byte después del siguiente (usando un registro de CPU que apunta al siguiente byte del flujo de instrucciones) y la indirecta infinita de necesitar más almacenamiento para encontrar el siguiente bit de el almacenamiento que le preocupa se detiene por ese hecho.

Esto es correcto. Sin embargo, debe tener en cuenta que normalmente no se almacenan bits individuales por separado.

En cambio, almacena estructuras de datos . Por ejemplo, puede definir una estructura como “empleado”, con las siguientes partes:

primer nombre

apellido

segundo nombre

número de posición

salario

fecha de inicio

fecha final

… y así.

Cada uno de estos tendría una longitud particular. Por ejemplo, puede configurarlo para que el nombre, el apellido y el segundo nombre tengan una longitud máxima de 30 caracteres cada uno. Entonces, cuando tiene la dirección de un registro de empleado, sabe que el primer nombre se almacena en esa dirección, el apellido en la dirección + 30 caracteres y el medio en la dirección + 60 caracteres.

Entonces, ahora tiene una estructura que contiene literalmente miles de bits, pero solo tiene que almacenar una dirección, y puede usarla para encontrar cualquier parte de la estructura.

Al subir de nivel, supongamos que tiene un programa al que se le pasará una lista de empleados. Le pasamos la lista como un solo objeto. Por lo tanto, se podría pasar una lista de, por ejemplo, 428 empleados como dos datos: la dirección inicial de la lista y el tamaño de la lista. Cada entrada en la lista es una dirección de un registro de empleado … pero no tenemos que almacenar la dirección de todas y cada una de esas direcciones en algún lugar. Solo tenemos que conocer la ubicación inicial, y luego podemos encontrar, digamos, la entrada número 200 en la lista agregando 200 veces el tamaño de una dirección a esa ubicación inicial.

Los elementos en las estructuras de datos también pueden cumplir una doble función. Tenga en cuenta el “número de puesto” en la estructura de datos del empleado. Ese podría ser el índice de un “registro de posición” en la “base de datos de posición”. Eso tendrá información sobre el puesto, como a qué departamento está asignado … que a su vez es un índice en una lista de departamentos.

Por lo tanto, no tenemos que almacenar una dirección para “el número de departamento de Daphne Blake”. En cambio, podemos buscar en la base de datos de empleados un empleado cuyo apellido sea Blake y su primer nombre sea Daphne. Una vez que la encontramos, obtenemos su número de posición (en un desplazamiento conocido desde el inicio del registro del empleado), desde el cual calculamos la ubicación en la que se encuentra el registro de ese número de posición, desde el cual calculamos la ubicación en la que ese número de departamento es encontrado.

Son muchas búsquedas, sumas y multiplicaciones … pero esas son cosas en las que las computadoras son buenas. Esta es una compensación común en la informática: el intercambio de tiempo (dedicado a encontrar algo en lugar de almacenar su dirección directamente) por espacio (que llevaría almacenar la dirección de cada cosa).

El mismo concepto de búsqueda en la base de datos de empleados para “apellido: Blake, nombre de pila: Daphne” puede ampliarse de muchas maneras. Por ejemplo, puede tener un índice que enumere las bases de datos del sistema, y ​​cuando necesita conocer la ubicación de la base de datos de Empleados, busca el nombre “Empleado”. Ahora, su programa de administración de bases de datos simplemente tiene que saber cómo encontrar ese índice.

Este concepto también se extiende a archivos y carpetas. En algún lugar, puede haber un archivo de configuración para el programa de base de datos, que tiene una entrada como: “tabla de base de datos maestra: c: \ xyz_payroll \ master.tbl”. Ahora, cuando se inicia el programa de base de datos, solo tiene que saber dónde encontrar ese archivo de configuración, y aprende las direcciones (en el disco) de otras cosas de él … y esas a su vez tienen direcciones de otras cosas, y así sucesivamente.

En última instancia, el almacenamiento de cualquier computadora (ya sea en memoria o en disco) es finito, por lo que solo necesita un número finito de direcciones. Al estructurarlos, reduce aún más la cantidad de direcciones necesarias. Un programa se construye con algunas direcciones “clave” ya conocidas, y se configura de una manera que le permite encontrar otras.

La memoria de la computadora no se utiliza para el almacenamiento. El almacenamiento se realiza en discos y otros tipos de medios de almacenamiento (sí, incluidos los SSD, que utilizan un tipo de memoria no volátil). Los datos que se almacenan son parte de un archivo. Y un archivo tiene una especificación de archivo, compuesta por su nombre y una jerarquía específica de directorios. La ubicación de los datos del archivo se puede establecer mediante el uso de un sistema de archivos (parte del sistema operativo) que puede traducir el nombre de un archivo al lugar en el disco. Hace esto algorítmicamente. Es por eso que la memoria USB que creó en una computadora se puede utilizar para buscar los datos en otra computadora. Incluso otra computadora de una arquitectura diferente.

Lo estás mirando en la dirección equivocada. Termina porque en alguna ubicación predeterminada y fija es una tabla de ubicaciones de otras tablas, que a su vez tiene ubicaciones de otras tablas … hasta que se llega a la ubicación de esos datos.