Comprensión profunda del directorio de sistemas informáticos 2

Capítulo 1 Un recorrido por los sistemas informáticos 1

1.1 La información es bits + contexto 1

1.2 Los programas son traducidos a diferentes formatos por otros programas 3

1.3 Es beneficioso entender cómo funciona el sistema de compilación4

1.4 El procesador lee e interpreta las instrucciones almacenadas en la memoria5

1.4.1 Los componentes de hardware del sistema5

1.4.2 Ejecutar el programa hello 7

1.5 El caché es crucial 7

1.6 Los dispositivos de almacenamiento forman una jerarquía 9

1.7 Hardware de administración del sistema operativo 10

1.7.1 Proceso 11

1.7.2 Hilo 12

1.7.3 Memoria virtual 12

1.7 .4 Documento 13

1.8 Uso de la comunicación de red entre sistemas 13

1.9 Temas importantes 15

1.9.1 Concurrencia y paralelismo 15

1.9.2 El Importancia de la abstracción en los sistemas informáticos 17

1.10 Resumen 17

Descripción de referencia 18

Parte 1 Estructura y ejecución del programa

Capítulo 2. Representación y Procesamiento de Información 20

2.1 Almacenamiento de Información 22

2.1.1 Representación Hexadecimal 22

2.1 2 Word 25

2.1. .3 Tamaño de datos 25

2.1.4 Direccionamiento y orden de bytes 26

2.1.5 Representación de cadena 31

2.1.6 Código de representación 31

2.1.7 Introducción al álgebra booleana 32

2.1.8 Operaciones a nivel de bits en lenguaje C 34

2.1 .9 Operaciones lógicas en lenguaje C 36

2.1.10 Operaciones de desplazamiento en lenguaje c 36

2.2 Representación de enteros 38

2.2.1 Tipo de entero Tipo de datos 38

2.2.2 Codificación de números sin signo 39

2.2.3 Codificación complementaria 40

2.2.4 Números con signo y sin signo Conversión entre 44

2.2.5 Números con signo y números sin signo en C lenguaje 47

2.2.6 Ampliar la representación en bits de un número 49

2.2.7 Truncar números 51

2.2.8 Recomendaciones sobre números con y sin signo 52

2.3 Operaciones con números enteros 54

2.3.1 Ninguna Suma con signo 54

2.3.2 Suma en complemento a dos 57

2.3.3 Suma a dos complemento no 59

2.3.4 Multiplicación sin signo 60

2.3.5 Multiplicación complementaria 60

2.3.6 Multiplicación por la constante 63

2.3.7 Dividir por la potencia de 2 64

2.3.8 Reflexiones finales sobre la aritmética de enteros 67

2.4 Números de coma flotante 67

2.4.1 Binario decimales 68

2.4.2 Representación de coma flotante ieee 70

2.4.3 Ejemplos de números 71

2.4.4 Redondeo 74

2.4 .5 Operaciones en coma flotante 76

2.4.6 En lenguaje C Números en coma flotante 77

2.5 Resumen 79

Notas de referencia 80

Tarea 80

Respuestas del ejercicio 90

Capítulo 3 Representación de programas a nivel de máquina 102

3.1 Perspectiva histórica 103

3.2 Codificación de programas 105

3.2.1 Código a nivel de máquina 106

3.2.2 Ejemplos de código 107

3.2.3 Notas sobre el formato 109

3.3 Formato de datos 111

3.4 Información de acceso 112

3.4.1 Indicador de operando 112

3.4.2 Instrucción de transferencia de datos 114

3

.4.3 Ejemplo de transferencia de datos 116

3.5 Operaciones aritméticas y lógicas 118

3.5.1 Carga de dirección efectiva 118

3.5.2 Operaciones unarias y operaciones binarias 119

3.5.3 Operaciones de desplazamiento 120

3.5.4 Discusión 120

3.5.5 Operaciones aritméticas especiales 122

3.6 Control 123

3.6.1 Código de condición 124

3.6.2 Código de condición de acceso 125

3.6.3 Instrucción de salto y su codificación 127

3.6. 4 Rama condicional de traducción 129

3.6.5 Bucle 132

3.6.6 Instrucción de transferencia condicional 139

3.6.7 Declaración de cambio 144

3.7 Proceso 149

3.7.1 Estructura del marco de pila 149

3.7.2 Control de transferencia 150

3.7.3 Convención de uso de registros 151

3.7.4 Ejemplos de procedimientos 152

3.7.5 Procedimientos recursivos 156

3.8 Asignación y acceso a matrices 158

3.8.1 Principios básicos 158

3.8.2 Aritmética de punteros 159

3.8.3 Matriz anidada 159

3.8.4 Matriz de longitud fija 161

3.8.5 Longitud variable matriz 163

3.9 Estructura de datos heterogénea 164

3.9.1 Estructura 164

3.9.2 Unión 167

3.9.3 Alineación de datos 170

3.10 Integral: comprensión de los punteros 172

3.11 Aplicación: uso del depurador gdb 174

3.12 Referencias de memoria fuera de límites y almacenamiento en búfer Desbordamiento de área 175

3.13 | Introducción a x86-64 185

3.13.3 Información de acceso 187

3.13.4 Control 192

3.13.5 Datos estructura 200

3.13.6 Observaciones finales sobre x86-64 200

3.14 Representación a nivel de máquina de programas de punto flotante 201

3.15 Resumen 201

Notas de referencia 202

Tarea 202

Respuestas a los ejercicios 212

Capítulo 4 Arquitectura del procesador 230

4.1 Conjunto de instrucciones y86 Arquitectura 231

4.1.1 Estado visible para los programadores 231

4.1.2 Instrucciones y86 232

4.1.3 Codificación de instrucciones 233

4.1. 4. Excepción y86 237

4.1.5 Programa y86 237

4.1.6 Detalles de algunas instrucciones y86 241

4.2 Diseño lógico y lenguaje de control de hardware hcl242

4.2.1 Puertas lógicas 243

4.2.2 Circuitos combinacionales y expresiones booleanas hcl 243

4.2.3 Circuitos combinacionales a nivel de palabra y expresiones enteras hcl 245

4.2.4 Establecer relaciones 248

4.2.5 Memoria y reloj 248

4.3 Implementación secuencial de y86 250

4.3. 1 Organizar el procesamiento en etapas 250

4.3.2 Estructura de hardware de Seq 258

4.3.3 Temporización de Seq 259

4.3.4 Implementación de etapas de Seq 262

4.4 Principios generales de los oleoductos 267

4.4.1 Oleoductos computacionales 268

4.4.2 Descripción detallada de las operaciones del oleoducto 269

4.4. Situación de la línea de montaje.

Limitaciones 271

4.4.4 Sistema de canalización con retroalimentación 272

4.5 Implementación de canalización de y86 273

4.5.1 seq+: reorganizar las etapas de cálculo 273

4.5.2 Insertar registro de canalización 276

4.5.3 Reorganizar y etiquetar señales 277

4.5.4 Predecir la siguiente pc279

4.5.5 Canalización riesgos 280

4.5.6 Utilizar pausas para evitar riesgos de datos 283

4.5.7 Utilizar el reenvío para evitar riesgos de datos 285

4.5 .8 Riesgos de carga/ usando datos 288

4.5.9 Manejo de excepciones 289

4.5.10 Implementación de cada etapa del pipeline 291

4.5.11 Lógica de control del pipeline 297

4.5.12 Análisis de desempeño 305

4.5.13 Trabajo inacabado 306

4.6 Resumen 308

Descripción de referencia 309

Tarea 309

Respuestas a los ejercicios 314

Capítulo 5 Optimización del rendimiento del programa 324

5.1 Capacidades y limitaciones de la optimización del rendimiento de los compiladores 325

5.2 Representar el rendimiento del programa 328

5.3 Ejemplos de programas 330

5.4 Eliminar la ineficiencia de los bucles 332

5.5 Reducir las llamadas a procedimientos 336

5.6 Eliminar referencias de memoria innecesarias 336

5.7 Comprensión de los procesadores modernos 340

5.7.1 Funcionamiento general 340

5.7 .2 Rendimiento de las unidades funcionales 343

5.7.3 Modelo abstracto de funcionamiento del procesador 344

5.8 Desenrollado de bucles 348

5.9 Mejora del paralelismo 351

5.9.1 Múltiples variables acumuladas 351

5.9.2 Transformación de recombinación 354

5.10 Resumen de los resultados de la optimización del código fusionado 358

5.11 Algunos factores limitantes 359

5.11.1 Registrarse desbordamiento 359

5.11.2 Penalizaciones por predicción de bifurcaciones y predicciones erróneas 360

5.12 ​​​​Comprender el rendimiento de la memoria 363

5.12.1 Rendimiento de carga 363

5.12.2 Rendimiento del almacenamiento 364

5.13 Aplicación: Tecnología de mejora del rendimiento 369

5.14 Confirmar y eliminar cuellos de botella en el rendimiento 369

5.14.1 Análisis del programa 370

5.14.2 Usar programas de creación de perfiles para guiar la optimización 371

5.14.3 Ley de Amdahl 374

5.15 Resumen 375

Notas de referencia 375

Tarea 376

Respuestas a los ejercicios 378

Capítulo 6 Jerarquía de la memoria 382

6.1 Tecnología de almacenamiento 382

6.1 .1 Memoria de acceso aleatorio 383

6.1.2 Almacenamiento en disco 389

6.1.3 Unidad de estado sólido 398

6.1.4 Tendencias en tecnología de almacenamiento 399

6.2 Localidad 401

6.2.1 Localidad de las referencias de datos del programa 402

6.2.2 Localidad de búsqueda de instrucciones 403

6.2.3 Resumen de localidad 403

6.3 Jerarquía de memoria 405

6.3.1 Jerarquía de memoria Caché 406

6.3.2 Resumen de conceptos de jerarquía de memoria 408

6.4 Memoria caché 408

6.4.1 Estructura general de la memoria caché 409

p>

6.4.2 Caché asignada directamente 410

6.4.3 Caché asociativo por conjuntos 416

6.4.4 Caché totalmente asociativo

Almacenamiento en caché 418

6.4.5 Preguntas sobre escrituras 420

6.4.6 Anatomía de una jerarquía de caché real 421

6.4.7 Parámetros de caché Impacto en el rendimiento 422

6.5 Escritura de código compatible con caché 423

6.6 Integral: el impacto del caché en el rendimiento del programa 426

6.6.1 Memory Mountain 426

6.6.2 Reorganizar bucles para mejorar la localidad espacial 430

6.6.3 Explotar la localidad en programas 433

6.7 Resumen 433

Notas de referencia 434

Tarea 434

Respuestas del ejercicio 442

Parte 2 Ejecución de programas en el sistema

Capítulo 7 Vinculación 448

7.1 Controlador del compilador 449

7.2 Vinculación estática 450

7.3 Archivo de objetos 450

7.4 Reutilizable Localización de archivos de objetos 451

7.5 Símbolos y tablas de símbolos 452

7.6 Resolución de símbolos 454

7.6.1 Cómo el vinculador resuelve múltiples símbolos globales definidos 455

7.6.2 Vinculación con bibliotecas estáticas 457

7.6.3 Cómo el vinculador utiliza bibliotecas estáticas para resolver referencias 460

7.7 Reubicación 461

7.7.1 Entradas de reubicación 461

7.7.2 Referencias de símbolos de reubicación 462

7.8 Archivos de objetos ejecutables 465

7.9 Carga de archivos de objetos ejecutables 466

7.10 Vinculación dinámica de bibliotecas compartidas 467

7.11 Carga y vinculación de bibliotecas compartidas Bibliotecas de aplicaciones 468

7.12 Código independiente de la posición (pic) 471

7.13 Herramientas para procesar archivos de destino 473

7.14 Resumen 473

Descripción de la referencia 474

Tarea 474

Respuestas a los ejercicios 479

Capítulo 8 Flujo de control de excepciones 480

8.1 Excepciones 481

8.1.1 Manejo de excepciones 481

8.1.2 Categoría de excepción 482

8.1.3 Excepción 484 en el sistema Linux/ia32

8.2 Proceso 487

8.2.1 Flujo de control lógico 487

8.2.2 Flujo concurrente 487

8.2.3 Espacio de direcciones privado 488

8.2. 4 Modo de usuario y modo kernel 488

8.2.5 Cambio de contexto 489

8.3 Manejo de errores de llamadas al sistema 491

8.4 Control de procesos 492

8.4.1 Obtención del ID del proceso 492

8.4.2 Creación y finalización de procesos 492

8.4.3 Reciclaje de procesos secundarios 495

8.4.4 Poner procesos en suspensión 499

8.4.5 Cargando y ejecuta el programa 500

8.4.6 Usa fork y execve para ejecutar el programa 502

8.5 Señal 504

8.5.1 Terminología de señales 505

8.5.2 Envío de señales 506

8.5.3 Recepción de señales 509

8.5.4 Problemas de procesamiento de señales 511

8.5.5 Procesamiento de señales portátil 516

8.5.6 Bloqueo y desbloqueo explícito de señales 517

8.5.7 Sincronización de flujos para evitar errores de concurrencia desagradables 517

8.6 Saltos no locales 521

8.7 Herramientas para operar procesos 524

8.8 Resumen 524

Descripción de referencia 525

Tarea 525

Respuestas del ejercicio 530

Capítulo 9 Memoria virtual 5

34

9.1 Direccionamiento físico y virtual 535

9.2 Espacio de direcciones 535

9.3 La memoria virtual como herramienta de almacenamiento en caché 536

9.3. Estructura organizativa de dram cache 537

9.3.2 Tabla de páginas 537

9.3.3 Página visitada 538

9.3.4 Página faltante 538

.

9.3.5 Página de asignación 539

9.3.6 La localidad nos vuelve a salvar539

9.4 La memoria virtual como herramienta de gestión de memoria 540

9.5 La memoria virtual como una herramienta para la protección de la memoria 541

9.6 Traducción de direcciones 542

9.6.1 Combinación de caché y memoria virtual 544

9.6.2 Aceleración usando tlb Traducción de direcciones 545

9.6.3 Tablas de páginas multinivel 546

9.6.4 Integral: traducción de direcciones de un extremo a otro 547

9.7 Estudio de caso: Intel Core i7 / sistema de memoria Linux 550

9.7.1 traducción de direcciones core i7 551

9.7.2 sistema de memoria virtual Linux 554

9.8 mapeo de memoria 556

9.8.1 Mirar nuevamente el objeto compartido 557

9.8.2 Mirar nuevamente la función fork 558

9.8.3 Mirar nuevamente la función ejecutiva 559

9.8.4 Mapeo de memoria a nivel de usuario usando la función mmap 559

9.9 Asignación de memoria dinámica 561

9.9.1 malloc y funciones libres 561

9.9.2 Por qué utilizar asignación de memoria dinámica563

9.9.3 Requisitos y objetivos del asignador564

9.9.4 Fragmentación565

9.9.5 Problemas de implementación565

9.9. 6 Lista libre implícita 565

9.9.7 Colocar bloque asignado 567

9.9.8 Dividir bloque libre 567

9.9.9 Obtener memoria de montón adicional 567

9.9.10 Fusionar bloques libres 568

9.9.11 Fusionar con marcadores de límites 568

9.9.12 General: implementar un asignador simple 570

9.9.13 Lista libre explícita 576

9.9.14 Lista libre separada 576

9.10 Recolección de basura 578

9.10.1 Conocimientos básicos del recolector de basura 579

9.10.2 recolector de basura mark&sweep 580

9.10.3 Mark&sweep conservador580 del programa c

9.11 Errores comunes relacionados con la memoria en programas C 581

9.11.1 Referencia indirecta a punteros incorrectos 582

9.11.2 Lectura de memoria no inicializada 582

9.11.3 Permitir desbordamiento del buffer de pila 582

9.11.4 Suponga que los punteros y los objetos a los que apuntan tienen el mismo tamaño 583

9.11.5 Causar errores de desalineación 583

9.11.6 Referencia a un puntero, no al objeto al que apunta 583

9.11.7 Malentendido sobre la aritmética de punteros 584

9.11.8 Referencia a una variable inexistente 584

9.11.9 Referencia a datos en bloques de montón libres 584

9.11.10 Causa pérdida de memoria 585

9.12 Resumen 585

Notas de literatura de referencia 586

Tarea 586

Respuestas a los Ejercicios 589

Parte 3 Interacción y comunicación entre programas

Capítulo 10 Nivel de sistema i/o596

10.1 unix i/o596

<

p>10.2 Abrir y cerrar archivos 597

10.3 Leer y escribir archivos 598

10.4 Leer y escribir de forma robusta 599 con el paquete rio

10.4.1 rio sin Funciones de entrada y salida almacenadas en búfer 600

10.4.2 Funciones de entrada almacenadas en búfer de Rio 600

10.5 Lectura de metadatos de archivos 604

10.6 *** Disfrute del archivo 606

10.7 Redirección de E/S 608

10.8 E/S estándar 609

10.9 General: qué funciones de E/S debo usar 610

10.10 Resumen 611

Descripción de referencia 612

Tarea 612

Respuestas a los ejercicios 612

Capítulo 11 Programación de redes 614

11.1 Modelo de programación cliente-servidor 614

11.2 Red 615

11.3 Internet IP global 618

11.3.1 Dirección IP 619

11.3.2 Nombre de dominio de Internet 620

11.3.3 Conexión a Internet 623

11.4 Interfaz de socket 625

11.4. Estructura de dirección de socket 625

11.4.2 función de socket 626

11.4.3 función de conexión 626

11.4.4 función open_clientfd 627

11.4.5 función de enlace 628

11.4.6 función de escucha 628

11.4.7 función open_listenfd 628

11.4.8 función de aceptación 629

11.4.9 Cliente Echo y ejemplos de servidor 630

11.5 Servidor web 633

11.5.1 Conceptos básicos de Web 633

11.5.2 Contenido web 633

11.5.3 Transacciones HTTP 634

11.5.4 Contenido dinámico del servicio 636

11.6 Integral: pequeño servidor web 639

11.7 Resumen 645

Descripción de referencia 645

Tarea 646

Respuestas a los ejercicios 646

Capítulo 12 Programación concurrente 648

12.1 Programación concurrente basada en procesos 649

12.1.1 Servidor concurrente basado en procesos 649

12.1.2 Acerca de las ventajas y desventajas de los procesos 651

12.2 Programación concurrente basada en multiplexación de E/S 651

12.2.1 Servidor concurrente controlado por eventos basado en multiplexación de E/S 653

12.2.2 E/S Ventajas y desventajas de la tecnología de multiplexación 657

12.3 Subprocesos programación concurrente basada 657

12.3.1 Modelo de ejecución de subprocesos 657

12.3.2 posix Thread 658

12.3.3 Crear subproceso 659

12.3.4 Terminar hilo 659

12.3.5 Reciclar recursos del hilo terminado 660

12.3.6 Separar hilos 660

12.3.7 Inicializar hilos 660

12.3.8 Un servidor concurrente basado en subprocesos 661

12.4 Programas multiproceso *** Variables compartidas 662

12.4.1 Modelo de memoria de subprocesos 663

12.4.2 Mapeo de variables a memoria 663

12.4.3*** Variables compartidas 664

12.5 Sincronización de hilos con semáforos 664

12.5 .1 Gráfico de progreso 667

12.5.2 Semáforos 668

12.5.3 Uso de semáforos para implementar la exclusión mutua

669

12.5.4 Uso de semáforos para programar recursos compartidos 670

12.5.5 Integral: servidor concurrente preprocesado 674

12.6 Uso de subprocesos para mejorar el paralelismo 676

12.7 Otros problemas de concurrencia 680

12.7.1 Seguridad de subprocesos 680

12.7.2 Reentrada 682

12.7.3 Uso de la biblioteca existente funciones en programas con subprocesos 682

12.7.4 Competencia 683

12.7.5 Punto muerto 685

12.8 Resumen 687

Descripción de referencia 687

Tarea 688

Respuestas a los ejercicios 691

Apéndice a Manejo de errores 694

a.1 Manejo de errores en sistemas Unix 694

a.2 Función contenedora de manejo de errores 696

Referencias 698