Programación del sistema de aprendizaje No.16 [Comunicación entre procesos]

introducción:

Hora de Beijing: 2023/4/9/20:44, ayer, es decir, el sábado de este fin de semana, fue la legendaria Copa Blue Bridge, ¡jajaja! Es malo, y realmente no soy bueno haciendo las preguntas. Lamentablemente, puede ser que era joven y frívolo o tenía poca experiencia. ¡Espero que después de esta experiencia pueda estar más tranquilo el próximo año! ¿Quién nos dijo que no hiciéramos las preguntas? Para ser preciso, no tengo la costumbre de hacer preguntas, y también se puede decir que no tengo mucho tiempo para hacer preguntas, aunque sé desde niño que el tiempo es como el agua en una esponja. , siempre hay un apretón, pero una palabra perezosa, por ejemplo, azul Cuando Qiao Bei regresó, podría haber comenzado a bloguear directamente, pero ha sido tan malo hasta ahora. Olvídalo, la razón principal es que no hay mucho. presión (este puede ser el status quo de los estudiantes de primer año contemporáneos, sin metas, sin presión), en este caso, una persona tiene 100 razones para convencerse de que es mala, y yo no soy la excepción, ¡jajaja! Pero, sigue siendo la misma frase, si no te rindes, está bien si no te rindes, solo ten una pequeña meta, ¡jajaja! Por supuesto, como yo, la presión sigue siendo muy alta. El punto más directo es que los grandes de CSDN insisten en actualizarse y, naturalmente, no estamos dispuestos a quedarnos atrás. ¡Así es más fácil para mí ponerme en camino! ¡Así que hoy aprendamos sobre la comunicación entre procesos y el conocimiento sobre bibliotecas dinámicas y estáticas en el blog anterior!
inserte la descripción de la imagen aquí

Revise bibliotecas dinámicas y estáticas

En el blog anterior, aprendimos que cuando se usa la biblioteca dinámica, no copia todos los datos de la biblioteca en el programa de destino, sino que se llama en forma de un archivo de encabezado, por lo que solo el compilador puede reconocer la biblioteca dinámica. ruta, y la operación El sistema no puede reconocerlo, lo que dará lugar a un error de enlace en el sistema operativo cuando la biblioteca dinámica está en uso, es decir, cuando se va a ejecutar el programa ejecutable, y entiendo que para solucionar este problema, hay tres soluciones, de la siguiente manera:

  1. Importe la ruta de la biblioteca a una variable de entorno (temporalmente)
  2. Enlace suave (permanente)
  3. esquema de perfil

Y en el último blog, ya aprendimos sobre los dos primeros, importar variables de entorno y establecer enlaces suaves, así que aprendamos la tercera forma, ¡la forma de configurar esquemas de archivos! Y revise los dos primeros, importe variables de entorno y cree enlaces suaves:

Importar variables de entorno
es importar la ruta donde se encuentra la biblioteca dinámica en la variable de entorno que el sistema operativo puede reconocer de forma predeterminada, porque la esencia es hacer que el sistema operativo pueda encontrar la ruta donde se encuentra la biblioteca dinámica. esta vez, la variable de entorno es: &LD_LIBRARY_PATH, por lo que si desea que el sistema operativo encuentre la ruta de la biblioteca dinámica en este momento, simplemente importe la ruta de la biblioteca dinámica a esta variable de entorno, el comando: , de modo que cuando importemos export LD_LIBRARY_PATH=&LD_LIBRARY_PATH:"动态库所在的路径"la ruta de la biblioteca dinámica en esta variable de entorno, el sistema operativo En este punto, puede encontrar la ruta correspondiente, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí


Todavía entiendo que el establecimiento de un enlace suave es esencialmente para permitir que el sistema operativo encuentre la ruta de la biblioteca dinámica, por lo que la esencia de establecer un enlace suave es crear un archivo de mapeo para la ruta de la biblioteca dinámica que puede ser reconocido por el sistema operativo por defecto .sudo ln -s /home/vimtest/其他人的动静态库/我的动态库/lib/libmymath.so /lib64/libmymath.so , como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí
Significa que la ruta donde se encuentra la biblioteca dinámica se crea bajo lib64la ruta que el sistema operativo puede reconocer de forma predeterminada como un libmymath.soarchivo de asignación de vínculos flexibles,
como se muestra en la siguiente figura: En este momento, el sistema operativo puede encontrar la ruta donde la biblioteca dinámica se encuentra por defecto.
inserte la descripción de la imagen aquí

Esquema del archivo de configuración
En primer lugar, todavía entiendo que no importa de qué manera sea, su esencia es permitir que el sistema operativo encuentre la ruta del archivo donde se encuentra la biblioteca dinámica, por lo que la forma de configurar el archivo es la misma, como que se muestra en la figura a continuación, y: en el 注意sistema Linux A continuación, hay una ruta de archivo de configuración predeterminada
inserte la descripción de la imagen aquí
y entendemos que podemos crear nuestros propios archivos bajo esta ruta de archivo de configuración, comando:sudo touch /etc/ld.so.conf.d/bit_107.conf

inserte la descripción de la imagen aquí
Como se muestra en la figura anterior, podemos encontrar que debajo de la ruta del archivo de configuración del sistema, existe bit_107.confeste archivo en este momento, por lo que en este momento solo necesitamos escribir la ruta donde se encuentra la biblioteca dinámica en el archivo, como como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí
y finalmente la configuración Se reactiva la ruta del archivo, comando: sudo ldconfig, en este momento la ruta donde se encuentra la librería dinámica puede ser reconocida por el sistema operativo, como se muestra en la siguiente figura:
inserte la descripción de la imagen aquí

General: a través de los tres métodos anteriores, se puede entender en este momento que cuando el sistema operativo ejecuta un programa ejecutable, hay tres formas de encontrar la ruta de la biblioteca dinámica correspondiente


Profundiza en la biblioteca dinámica y estática

En primer lugar, comprenda que el conocimiento anterior y el conocimiento del blog anterior son esencialmente solo el conocimiento del funcionamiento de las bibliotecas dinámicas y estáticas, así que profundicemos en el interior de las bibliotecas dinámicas y estáticas en este momento, y tomemos un ¡Mira las bibliotecas dinámicas y estáticas en detalle! (teoría)

En esencia, es 使用特征la diferencia entre bibliotecas estáticas y dinámicas: cuando se usa una biblioteca estática, el programa de destino necesita copiar la implementación de toda la biblioteca estática en el programa, mientras que la biblioteca dinámica usa indirectamente la biblioteca dinámica a través de la declaración del interfaz de función en el archivo de encabezado.La implementación de la interfaz de función y la biblioteca dinámica pueden distinguir la interfaz de función utilizada de la interfaz de función no utilizada a través del juicio condicional, a fin de lograr la capacidad de uso preciso sin copia ciega

Cuando comprenda el conocimiento anterior, puede saber fácilmente en este momento que cuando la biblioteca estática se carga en el programa, consumirá una gran cantidad de recursos en este momento , independientemente de los recursos de tiempo y espacio, o recursos de red. se usa la biblioteca dinámica, debido a que solo el archivo de encabezado se carga en el programa de destino, y la implementación de toda la biblioteca dinámica se carga en la memoria cuando se ejecuta el programa ( porque es esencialmente un archivo binario), por lo que el uso de la biblioteca dinámica no será tan importante en este momento, ocupa recursos , como se muestra en la siguiente figura:

biblioteca estática
inserte la descripción de la imagen aquí
biblioteca dinámica

La biblioteca dinámica está vinculada al programa de destino. En este momento, el contenido específico de la biblioteca dinámica no se copia, pero la dirección de la implementación de la interfaz correspondiente a la biblioteca dinámica se reemplaza por el símbolo externo correspondiente al programa de destino correspondiente a través de el expediente de cabecera y el juicio condicional, el proceso se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

En general, cuando se usa la biblioteca dinámica, no solo se debe cargar el programa de destino en la memoria, sino que también se debe cargar la biblioteca dinámica en la memoria 6TFDD
y
, 注意de acuerdo con la figura anterior, podemos saber que la memoria física ya ha almacenado La biblioteca dinámica correspondiente ya está disponible. Si otros programas, es decir, otros procesos, también necesitan usar la biblioteca dinámica en este momento, cuando el sistema operativo reconozca que ya hay una biblioteca correspondiente en la memoria, no es necesario en este momento En lugar de recargar desde el disco, es suficiente asignar directamente la biblioteca dinámica al área compartida de su propio espacio de direcciones a través de la tabla de páginas, para lograr la función de una biblioteca con múltiples utiliza , de modo que se pueden ahorrar recursos en gran medida, tanto en términos de eficiencia del sistema operativo como en aspectos de espacio-tiempo

Cómo entender la dirección de la biblioteca dinámica ( fPIC)

Después de terminar con lo anterior, cómo se llaman las bibliotecas estáticas y dinámicas en la memoria, echemos un vistazo más profundo a los métodos de direccionamiento específicos de las bibliotecas estáticas y dinámicas. El propósito es comprender el conocimiento relevante (independientemente de los códigos de posición) , fPICcomo sigue La narración dice:

En primer lugar, lo primero que hay que entender es que un programa permite que existan varias direcciones al mismo tiempo. La analogía es que una persona puede tener varios nombres o varios números, como el número de estudiante, el número de dormitorio y el número de identificación. Después de entender este punto, es obvio que un programa debe tener diferentes direcciones, por ejemplo, la dirección lógica en el disco o la dirección física en la memoria física o la dirección virtual en el espacio de direcciones virtuales, lo que significa que existe objetivamente. objeto o Personas, en diferentes escenarios, tendrán diferentes atributos.Este atributo puede ser morfológico o lógico.Después de entender esto, ¡sigamos profundizando en la dirección!

Comprenda el conocimiento anterior, sepa que un programa puede tener diferentes direcciones, direcciones lógicas, direcciones físicas, direcciones virtuales, y comprenda que todas estas direcciones diferentes tienen nombres diferentes, solo debido a los diferentes escenarios del programa, por lo que siempre En términos generales, el El programa tiene muchas direcciones, y la dirección será diferente debido a diferentes escenarios, pero en general, solo hay dos tipos de direcciones en esencia, una es la dirección absoluta (biblioteca estática) y la otra es la dirección relativa (biblioteca dinámica) , y comprender que el direccionamiento en el espacio de direcciones virtuales es una dirección absoluta

Comprenda las direcciones absolutas y las direcciones relativas :
creo que todos hemos sabido antes qué es una ruta absoluta y qué es una ruta relativa. De manera similar, al direccionar, la dirección es la misma. La dirección absoluta es como la dirección física en la memoria física . Cada byte tiene su propio número (dirección), que se denomina dirección absoluta , y una dirección relativa, al igual que una dirección lógica en un disco, se referencia mediante un punto o valor fijo y luego se pasa a través del desplazamiento Direccionamiento en el forma de cantidad, esta es la dirección relativa

¿Por qué la biblioteca dinámica usa el direccionamiento relativo ?
Ya sea del conocimiento previo del blog o del conocimiento anterior, todos entendemos en este momento que cuando un programa de destino se vincula a una biblioteca estática, copia directamente todas las interfaces en la biblioteca estática para el programa de destino , por lo que cuando el espacio de direcciones virtuales del proceso asigna la memoria física a través de la tabla de páginas en este momento, el espacio de direcciones virtuales almacena el código completo del programa de destino en la memoria física asignada a través de la tabla de páginas . puede encontrarlo; en cuanto a la biblioteca dinámica, debido a diferentes procesos, diferentes grados operativos o diferentes programas en ejecución, la cantidad de interfaces de biblioteca dinámica o implementaciones de interfaz que deben usarse es diferente, o las bibliotecas de terceros que deben ser utilizados son diferentes, por lo que está destinado a que cada La biblioteca dinámica almacenada en el espacio de direcciones virtuales del programa de destino sea diferente, el espacio de direcciones de cada proceso sea diferente y el código de implementación de la interfaz almacenado en el área compartida de cada proceso es diferente, por lo que la librería dinámica no permite el uso de direcciones absolutas, sino direcciones relativas, las razones específicas son las siguientes:

La biblioteca dinámica no puede usar el direccionamiento absoluto porque la biblioteca dinámica se asignará al espacio de direcciones del proceso cuando se carga, y la biblioteca dinámica es compartida por varios programas , y el espacio de direcciones de memoria de cada programa es diferente. La biblioteca no puede usar direccionamiento absoluto porque la biblioteca dinámica determina su ubicación de memoria final cuando se carga en el espacio de memoria del proceso, y los espacios de direcciones de memoria de diferentes procesos son diferentes (diferentes programas ejecutables) , por lo que si es dinámica, la biblioteca usa direcciones absolutas para el direccionamiento, por lo que en diferentes procesos que cargan la biblioteca, su código y datos pueden asignarse a diferentes direcciones de memoria . Esto da como resultado un código que no se puede compartir entre múltiples procesos porque las direcciones en un proceso no pueden ser interpretadas correctamente por los otros procesos. Por lo tanto, las bibliotecas dinámicas deben adoptar direcciones relativas para garantizar que se pueda acceder a su código y datos utilizando el mismo desplazamiento en todos los procesos.

Como se muestra en la figura a continuación: Como se muestra
inserte la descripción de la imagen aquí
en la figura anterior, es por eso que se usan rutas relativas en lugar de rutas absolutas, y tenga en cuenta: las direcciones de todas las implementaciones de interfaz de función en la biblioteca dinámica son compensaciones y comienzan desde 0 de manera predeterminada y se entienden perfectamente
:

Entonces, en esencia, la biblioteca dinámica no permite el uso de direcciones absolutas, porque la relación de mapeo entre el espacio de direcciones y la dirección de memoria es correspondiente, y la biblioteca dinámica en el espacio de direcciones es diferente debido a los diferentes códigos de programa, pero porque los procesos son diferentes Comparte una biblioteca dinámica, por lo que la interfaz de la biblioteca dinámica en el espacio de direcciones también debe ser la misma, de lo contrario, los datos únicos de la biblioteca dinámica en la memoria no se pueden encontrar a través de la relación de mapeo correspondiente, por lo que la dirección absoluta no puede se puede usar en el espacio de direcciones en este momento, usando así la dirección relativa, porque al usar la dirección relativa, el desplazamiento se puede agregar a la posición inicial de la biblioteca dinámica en este momento (siempre que las implementaciones de interfaz utilizadas por cada proceso sean igual, el desplazamiento será el mismo), así que cuando llame, llame a La interfaz de la biblioteca dinámica es la misma y, finalmente, de acuerdo con la relación de mapeo, la implementación de la interfaz de la biblioteca dinámica en la memoria a la que se accede es la misma

Así que para concluir:

Total: Esta es la razón por la que se usa fPIC

De todos modos, el objetivo final es comprender cómo la biblioteca dinámica realiza la carga parcial, el concepto de dirección relativa

Escenarios de uso específicos para probar bibliotecas estáticas y dinámicas

Después de comprender los conocimientos anteriores, hemos completado el conocimiento sobre el funcionamiento y la teoría de las bibliotecas dinámicas y estáticas. En este momento, profundizaremos en algunos escenarios para ver cuáles son las características específicas de las bibliotecas dinámicas y estáticas. En primer lugar. , debemos entender que un enorme El programa tiene una gran cantidad de código y datos. En este momento, no solo se requiere la implementación de la biblioteca dinámica, sino también la implementación de la biblioteca estática. Por lo tanto, la mayoría de los programas se completan utilizando el biblioteca estática y la biblioteca dinámica al mismo tiempo. Sí, pero generalmente algunos programas pequeños se pueden completar usando solo una biblioteca dinámica o una biblioteca estática, por lo que si hay una biblioteca dinámica y una biblioteca estática en este momento, y la interfaz de función El programa de destino requiere implementaciones en estas dos bibliotecas. Entonces, en este momento, ¿el sistema vincula la biblioteca estática o la biblioteca dinámica? Como se muestra abajo:

inserte la descripción de la imagen aquí
Entonces, en este momento sabemos que cuando hay bibliotecas estáticas y bibliotecas dinámicas en una biblioteca, el programa llamará primero a la biblioteca dinámica en este momento, por lo que creo que todos deben tener una pregunta en este momento, es decir, cómo ¿Llamar primero a la biblioteca estática? Como se muestra en la figura a continuación:
inserte la descripción de la imagen aquí
Sabemos que cuando una biblioteca tiene una biblioteca dinámica y una biblioteca estática, aunque la predeterminada es la biblioteca dinámica, aún podemos llamar primero a la biblioteca estática, como se muestra en la figura a continuación al ver el propiedades del archivo. También podemos ver si el programa está vinculado a una biblioteca dinámica o a una biblioteca estática. Instrucciones específicas:
gcc -o mytest-d main.c -I include -L lib -l mymath
gcc -o mytest-s main.c -I include -L lib -l mymath -static

inserte la descripción de la imagen aquí
En general, es lo que se usa, pero se prefiere la biblioteca dinámica predeterminada, y la biblioteca estática se vincula solo si no hay una biblioteca dinámica.

comunicación entre procesos

Propósito de la comunicación entre procesos
Transferencia de datos: un proceso necesita enviar sus datos a otro proceso
Uso compartido de recursos: compartir el mismo recurso entre múltiples procesos
Evento de notificación: un proceso necesita enviar un mensaje a otro proceso o a un grupo de procesos para notificarle (ellos) que se ha producido algún evento (como notificar al proceso principal cuando finaliza el proceso)
Control de procesos: algunos procesos quieren controlar completamente la ejecución de otro proceso (como el proceso de depuración), en este momento el proceso de control espera poder interceptar todas las trampas y excepciones de otro proceso y poder conocer sus cambios de estado. a tiempo

Desarrollo de la comunicación entre procesos

1. Canalización 2. Comunicación entre procesos System V 3. Comunicación entre procesos POSIX

Clasificación de la comunicación entre procesos

1. Canalización 2. Canalización anónima canalización 3. Canalización con nombre

Consulte el siguiente blog para obtener información detallada.

inserte la descripción de la imagen aquí

Resumen: Realmente hay mucho conocimiento sobre bibliotecas dinámicas y estáticas, y finalmente todo está hecho, ¡lo cual es difícil! A continuación, ¡hablemos del proceso! Explicación detallada de la comunicación entre procesos, ¡nos vemos en el próximo blog!

Supongo que te gusta

Origin blog.csdn.net/weixin_74004489/article/details/130047523
Recomendado
Clasificación