Mtro. Carlos Alberto Román Zamitiz · 25 ago 2026 · Tema 1 — Linux y procesos: imagen de un proceso, segmentos de memoria, PCB, comandos de análisis (size, pmap, ps, top), árbol PID/PPID, time-sharing, race condition y deadlock.
Encuadre: la primera parte de la materia es "una continuación de sistemas operativos": primero procesos, después desarrollo de servidores. El curso se enfoca en un solo procesador (uniprocesador): no se ve programación multiprocesador ni multinúcleo. "Distribuido" aquí significa servidor en un host y cliente en otro, conectados por red.
profesores.fi-b.unam.mx/~carlos/acs es HTTP y está obsoleto.README.md del Tema 1 explica cómo levantarlo. No hace falta traer computadora — compila y ejecuta incluso desde el celular. Dentro tienes root (sudo o sudo su). Si rompes el sistema (rm -rf), destruyes el Codespace y creas otro; los programas vuelven intactos. Cerrar la pestaña lo suspende; se reactiva con el botón verde.132.247.*.* y 132.248.*.* son de la UNAM a nivel mundial. Las IP privadas (p. ej. 192.168.x.x) son internas y aisladas. El profesor se conectó por SSH a 132.248.77.168 [inaudible: también se transcribe como 132.247.248.7.168]."Open Group <función>" (ej. Open Group getpid).Definición del profesor: "una fotografía o instantánea". Un ejecutable en ejecución crea un proceso que vive mientras la ejecución esté viva; al terminar o cerrar, el proceso muere.
Procesos en segundo plano (background) o demonios (daemon): no son visibles ni interactúas con ellos en la terminal. Cerrar la interfaz gráfica de un programa no siempre mata su proceso.
Al ejecutar un binario, el SO carga en una zona de memoria independiente (espacio de direcciones propio) las áreas de código y datos.
Segmentos estáticos:
printf).Segmentos dinámicos:
malloc).Scope (ámbito) de una variable local = los límites de su función.
Tarea futura (todavía no): investigar file descriptors y la asignación dinámica de memoria (malloc).
⚠️ Examen — BCP / PCB (Process Control Block, "bloque de control de proceso"): estructura administrativa del kernel donde se guardan los metadatos del proceso. El profesor lo marcó como muy importante.
.c (con -o); así ls -l agrupa fuente y binario. Sin -o se genera a.out (mala práctica: el nombre no dice nada).getchar() para pausar y que el proceso no muera al instante — libera la memoria y muere hasta que pulsas Enter.data; global no inicializada → BSS; local → stack; reservada con malloc → heap; strings literales de printf → text.size servidor — análisis estático (mira el archivo en disco). Columnas: text, data, bss, dec (suma en decimal), hex (suma en hexadecimal), filename. Ejemplo: 1767 + 592 + 8 = 2367 dec = 0x93F [inaudible: la transcripción decía "3F"].
⚠️ Examen: ¿por qué size no muestra heap ni stack? Porque son dinámicos: solo existen en RAM cuando el proceso está vivo; size solo analiza el archivo estático en disco.
pmap <PID> (Process Map) — análisis dinámico: consulta las estructuras del kernel e imprime el mapa completo del proceso en RAM (stack, heap, librerías .so, direcciones físicas). El PID se obtiene con getpid() (de <unistd.h>).
pmap no cuadran con size porque el SO asigna memoria por páginas de 4 KB; toda sección se redondea a página completa → todos los valores son múltiplos de 4.R / RW pero nunca X — para que no se pueda inyectar ni ejecutar código malicioso en el proceso.cat /proc/<PID>/maps — mientras el proceso vive, el SO mantiene el directorio /proc/<PID>/; el archivo maps muestra direcciones hexadecimales, permisos de cada segmento y librerías dinámicas cargadas (información del PCB). Al pulsar Enter en la Terminal 1 termina getchar(), se libera el heap y el proceso muere.
init en Unix clásico / distros viejas, systemd en distros modernas. De la raíz se derivan todos los demás procesos.bash). El PID de bash no cambia mientras sea la misma terminal; el de ps cambia cada vez, porque nace y muere en el instante.top — dinámico, se actualiza en pantalla; se sale con q.
Tiempo compartido (time-sharing): un proceso no acapara la RAM de principio a fin (sería una cola secuencial ineficiente). El planificador (scheduler) reparte pequeños lapsos de CPU entre los procesos según su prioridad, alternando tan rápido que da la ilusión de paralelismo.
ps — estático (no se actualiza). Sin opciones: solo los procesos de la terminal actual (normalmente bash + el propio ps).
ps aux — todos los procesos del sistema, ordenados por PID ascendente. Columnas: USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND.
? en la columna TTY; por convención su nombre termina en d (systemd, kthreadd, watchdogd).VSZ = Virtual Memory Size, RSS = Resident Set Size (el profesor lo aclarará la próxima clase).ps -e -o pid,ppid,user,stat,cmd — -e lista todos los procesos; -o elige las columnas a mostrar.
⚠️ Examen — sintaxis: las columnas tras -o van separadas por comas y SIN espacios; un espacio hace que la terminal devuelva error de sintaxis. Los estados de la columna STAT (S, R, R+, Ss…) se ven en clases posteriores.
ls a secas no da información útil. ls -l = formato largo (permisos, tamaño, dueño, fecha). ls -la = incluye archivos ocultos (los que empiezan con .).ls -ltr — l largo, t ordena por fecha de modificación (más reciente arriba), r invierte el orden (más reciente abajo, junto al prompt).TTY viene de los teletipos (teletype) de los años 1940-50: máquina de escribir mecánica + transmisión de datos a una computadora. Con los sistemas de tiempo compartido de los 60, las terminales lógicas (pantallas, ventanas) heredaron las siglas. Dato histórico que remarcó el profesor: las primeras programadoras fueron mujeres.
fork() en C para crear procesos.Teoría general de procesos, ejemplos en C y los programas del profesor están en el Tema 1.