Fundamentos del sistema operativo de la computadora (16) --- Memoria compartida para la sincronización de procesos

Introducción

Este es el capítulo dieciséis, memoria compartida para la sincronización de procesos . Las introducciones anteriores son todos métodos para resolver la sincronización de subprocesos, este artículo es un método para manejar la sincronización de procesos: memoria compartida

Memoria compartida

Sincronización de subprocesos

Cada proceso puede tener uno o más subprocesos. Los subprocesos comparten recursos de proceso y también se requiere comunicación entre subprocesos, o el estado de algunos recursos de proceso debe sincronizarse entre subprocesos. En este momento, se requiere la sincronización de información entre subprocesos.

Sincronización de procesos

Puede haber uno o más procesos en un sistema operativo Los procesos comparten recursos de la computadora (incluyendo memoria, discos, etc.) Por lo tanto, también se requiere sincronización de información entre procesos. El problema productor-consumidor mencionado en el artículo anterior y el problema de la comida del filósofo son razones para la sincronización de procesos.

Antes de conocer la memoria compartida en este artículo, revise cómo el sistema operativo mencionado anteriormente realiza la gestión de procesos.
Cada proceso tiene su propio espacio de proceso, y su espacio de proceso se asigna a través de la administración de almacenamiento de páginas de segmentos y la memoria real a través de tablas de páginas. El espacio de proceso entre procesos no interfiere entre sí y es independiente entre sí.

por lo tanto:

  • Hasta cierto punto, varios procesos utilizan la memoria física juntos (es decir, varios procesos comparten la memoria física)
  • Debido a la gestión de procesos del sistema operativo, el espacio de memoria entre procesos es independiente (es decir, el espacio de memoria lógica de dos procesos cualesquiera no tiene ninguna relación), por lo que se garantiza la seguridad de la operación independiente de cada proceso (esto (también un función de la gestión de procesos)

De forma predeterminada, el proceso no puede acceder al espacio de memoria fuera del espacio de proceso (es decir, un proceso no puede acceder al espacio de memoria de otro proceso)

Sin embargo, la memoria compartida puede romper esta limitación. A través de la memoria compartida, los procesos se pueden asignar a la misma parte de la memoria a través de tablas de páginas. Esta parte de la memoria puede ser utilizada por el proceso 1 o el proceso 2. Es decir, esta memoria compartida puede ser leída o escrita por el proceso 1, y también puede ser leída o escrita por el proceso 2. Por lo tanto, a través de la memoria compartida, el proceso 1 y el proceso 2 establecen una conexión. Entonces la memoria compartida también es un método importante de sincronización de procesos proporcionado por el sistema operativo

Introducción a la memoria compartida

  • El almacenamiento compartido permite que procesos no relacionados accedan a la misma pieza de memoria física (el principio de su implementación es mapear la misma pieza de memoria física a las tablas de páginas de diferentes procesos, de modo que diferentes procesos puedan acceder a la misma pieza de memoria física a través del tabla de páginas)
  • La memoria compartida es la forma más rápida de compartir y transferir datos entre dos procesos
  • La memoria compartida no proporciona un mecanismo de sincronización y es necesario utilizar otros mecanismos para administrar el acceso a fin de evitar problemas causados ​​por el acceso simultáneo.

Nota: Mecanismo de sincronización: en la programación concurrente, cada proceso debe restringir el acceso a las variables públicas. Esta restricción se denomina sincronización.

Usar pasos de memoria compartida

  • Solicitar memoria compartida
  • Conecte la memoria compartida al espacio del proceso (para que el proceso pueda acceder a la memoria compartida a través de la tabla de páginas)
  • Usar memoria compartida
  • Deje el espacio de proceso y elimine

Ejemplo de código

En el ejemplo, habrá un cliente y un servidor, y se comunicarán a través de la memoria compartida.

common.h pone algo de información pública

#ifndef __COMMON_H__
#define __COMMON_H__

//共享内存中的字符串最大长度
#define TEXT_LEN 2048 

//共享内存的数据结构
//因为在默认情况下,内存里边存储的方式是没有数据结构的,当程序需要使用共享内存的话,就需要定义数据结构,把结构数据存储到共享内存
struct ShmEntry{
    //是否可以读取共享内存,用于进程间同步
    bool can_read
    //共享内存信息
    char msg[2048]
};
#endif

server.cpp

#include "common.h"

#include <sys/shm.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <iostream>

int main()
{
    //定义共享内存结构图
    struct ShmEntry *entry;
    
    //1.申请共享内存
    int shmid = shmget((key_t)1111, sizeof(struct ShmEntry), 0666|IPC_CREAT);
    if(shmid == -1) {
        std::cout << "Create share memory error!" << std::endl;
        return -1;
    }
    
    //2.连接到当前进程空间/使用共享内存
    entry = (ShmEntry*)shmat(shmid, 0, 0);
    entry->can_read = 0;
    while(true){
        if(entry->can_read == 1) {
            std::cout<< "Received message" << entry->msg << std::endl;
            entry->can_read = 0;
        } else {
            std::cout << "Entry can not read. Sleep 1s" << std::endl;
            sleep(1);
        }
    }
    
    //3.脱离进程空间
    shmdt(entry);
    
    //4.删除共享内存
    shmctl(shmid, IPC_RMID, 0);
    
    return 0;
}

client.cpp

#include "common.h"

#include <sys/shm.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <iostream>

int main()
{
    //定义共享内存结构图
    struct ShmEntry *entry;
    
    //1.申请共享内存
    int shmid = shmget((key_t)1111, sizeof(struct ShmEntry), 0666|IPC_CREAT);
    if(shmid == -1) {
        std::cout << "Create share memory error!" << std::endl;
        return -1;
    }
    
    //2.连接到当前进程空间/使用共享内存
    entry = (ShmEntry*)shmat(shmid, 0, 0);
    entry->can_read = 0;
    char buffer[TEXT_LEN];
    while(true){
        if (entry->can_read = 0) {
            std::cout << "Input message>>>";
            fgets(buffer, TEXT_LEN, stdin);
            strncpy(entry->msg, buffer, TEXT_LEN);
            std::cout << "Send message:" << entry->msg << std::endl;
            entry->can_read = 1;
        }
    }
    
    //3.脱离进程空间
    shmdt(entry);
    
    //4.删除共享内存
    shmctl(shmid, IPC_RMID, 0);
    
    return 0;
}

Ejecutar servidor

Ejecutar cliente y enviar mensaje

servidor recibió información

Arriba, la comunicación entre los dos procesos se realiza compartiendo memoria. Dirección de API relacionada con la memoria compartida en PHP: https://www.php.net/manual/zh/ref.shmop.php

Es la competitividad central de una persona técnica encontrar la constante en la tecnología que cambia rápidamente. Unidad de conocimiento y acción, combinando teoría con práctica

Supongo que te gusta

Origin blog.csdn.net/self_realian/article/details/107225880
Recomendado
Clasificación