首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 共享内存 信号量

Linux 共享内存与信号量的基础概念

共享内存

共享内存是一种进程间通信(IPC)机制,允许多个进程访问同一块物理内存区域。这种机制非常高效,因为数据不需要在进程之间复制,而是直接在内存中共享。

优势:

  1. 高效性:数据直接在内存中共享,避免了数据复制的开销。
  2. 实时性:进程可以立即看到其他进程对共享内存的修改。

类型:

  • System V 共享内存:通过 shmget, shmat, shmdt, shmctl 等系统调用实现。
  • POSIX 共享内存:通过 shm_open, mmap, munmap, shm_unlink 等函数实现。

应用场景:

  • 高性能服务器:如数据库服务器,需要快速的数据交换。
  • 实时系统:需要快速响应的系统。

信号量

信号量是一种同步机制,用于控制多个进程对共享资源的访问。它本质上是一个计数器,用于记录可用资源的数量。

优势:

  1. 互斥访问:确保同一时间只有一个进程可以访问共享资源。
  2. 资源计数:可以管理多个相同资源的访问。

类型:

  • 二进制信号量:只能取值0或1,常用于互斥访问。
  • 计数信号量:可以取大于1的值,用于管理多个资源。

应用场景:

  • 生产者-消费者问题:协调生产者和消费者进程之间的数据交换。
  • 读者-写者问题:控制对共享资源的读写访问。

示例代码

System V 共享内存示例

代码语言:txt
复制
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

int main() {
    key_t key = ftok("shmfile", 65);
    int shmid = shmget(key, 1024, 0666|IPC_CREAT);
    char *str = (char*) shmat(shmid, (void*)0, 0);

    sprintf(str, "Hello, World!");
    printf("Data written in memory: %s\n", str);

    shmdt(str);
    return 0;
}

POSIX 共享内存示例

代码语言:txt
复制
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
    int shm_fd = shm_open("/my_shm", O_CREAT | O_RDWR, 0666);
    ftruncate(shm_fd, 1024);
    char *str = (char*) mmap(0, 1024, PROT_WRITE, MAP_SHARED, shm_fd, 0);

    sprintf(str, "Hello, World!");
    printf("Data written in memory: %s\n", str);

    munmap(str, 1024);
    close(shm_fd);
    shm_unlink("/my_shm");
    return 0;
}

信号量示例

代码语言:txt
复制
#include <sys/ipc.h>
#include <sys/sem.h>
#include <stdio.h>

union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};

int main() {
    key_t key = ftok("semfile", 65);
    int semid = semget(key, 1, 0666|IPC_CREAT);
    union semun arg;
    arg.val = 1;
    semctl(semid, 0, SETVAL, arg);

    struct sembuf sb = {0, -1, SEM_UNDO};
    semop(semid, &sb, 1);

    printf("Critical Section\n");

    sb.sem_op = 1;
    semop(semid, &sb, 1);

    return 0;
}

常见问题及解决方法

共享内存常见问题

  1. 内存泄漏:进程退出后未正确释放共享内存。
    • 解决方法:确保使用 shmdtshmctl 正确释放内存。
  • 数据不一致:多个进程同时修改共享内存导致数据不一致。
    • 解决方法:使用信号量或其他同步机制保护共享内存的访问。

信号量常见问题

  1. 死锁:进程相互等待对方释放资源。
    • 解决方法:设计合理的资源分配策略,避免循环等待。
  • 信号量未正确初始化:信号量初始值设置不当。
    • 解决方法:确保信号量初始值正确反映可用资源的数量。

通过合理使用共享内存和信号量,并结合适当的同步机制,可以有效解决多进程间的通信和资源共享问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券