适用Linux下用于多进程的共享内存池

Shared-Cache Malloc

开发者:cyc-yzhzc

项目链接

https://gitee.com/yzhzc/scmalloc
(优化中)

项目简介

一个用于Linux环境下的共享内存池,专为多进程环境设计,提供快速且安全的共享内存管理以及智能的内存分配与回收机制。

功能特点

  • 虚拟地址映射管理:无需关心不同进程下同一块共享内存映射的虚拟地址不同的问题。

  • 自动申请和释放共享内存文件:系统自动申请所需的共享内存文件,无需用户手动管理,闲置的共享内存文件会自动被释放,节省系统资源。

  • 按页管理共享内存文件:申请的共享内存文件以页为单位进行管理,提高内存利用率。

  • 灵活分配内存块:多页或单页共享内存可以被切割成所需的小块内存供进程使用。

  • 智能回收与合并内存块:回收的小块内存会自动管理和合并,当合并成整页时交给页管理器进行管理。

  • 高级页管理:页管理器会将空闲的小块共享内存页合并成更大的页,并将闲置的最大页释放给系统,自动解除这块共享内存在进程中的映射。

项目优势

  • 高效管理:通过智能分配和回收内存块,提高系统性能和资源利用率。
  • 无缝集成:进程无需关心共享内存的复杂管理,简化了内存使用流程。
  • 自动优化:自动管理内存的申请、释放和合并,确保系统的内存资源得到最优利用。

API

Shared Cache Malloc 提供了简单易用的API接口,适用于各种需要高效共享内存管理的应用场景。

server

需要启动这个服务,其他进程才能使用申请释放

#include <iostream>
#include "SharedServer.hpp"


int main()
{
    LOG_CYC(_DEBUG, "server", nullptr);

    SharedServer* svr = SharedServer::GetInstance(ShmService::SHM_CREATE);
    svr->Run();

    return 0;
}

client

#include <iostream>
#include <atomic>
#include <thread>
#include <chrono>
#include "SCAllocator.hpp"

const int iterations = 25;                // 每个线程的迭代次数
const int maxBlockSize = 128 * 1024 * 1024; // 64MB,最大申请大小
const int numThreads = 4;                 // 线程数

class buffer {
public:
    buffer(int64_t ID) : id(ID) {}
    int64_t id;
    char buf[1024];
};

void threadFunction(int threadId, std::atomic<int>& count) {
    std::srand(std::time(nullptr) + threadId);  // 每个线程设置不同的随机种子
    std::chrono::duration<double> allocTime(0);
    std::chrono::duration<double> deallocTime(0);

    buffer* bufs[iterations];
    void* ptrs[iterations];

    auto startAlloc = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < iterations; ++i) {
        int size = (std::rand() % maxBlockSize) + 1;  // 随机生成1到maxBlockSize之间的大小
        bufs[i] = SC::allocateMemory<buffer>(count);  // 分配内存
        ptrs[i] = SC::allocateMemory(size);
    }
    auto endAlloc = std::chrono::high_resolution_clock::now();
    allocTime += endAlloc - startAlloc;

    auto startDealloc = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < iterations; ++i) {
        SC::deallocateMemory(bufs[i]);
        SC::deallocateMemory(ptrs[i]);
    }
    auto endDealloc = std::chrono::high_resolution_clock::now();
    deallocTime += endDealloc - startDealloc;

    count += iterations;

    // 打印每个线程的分配和释放时间
    std::cout << "线程 " << threadId << " 分配时间: " << allocTime.count() << " 秒, 释放时间: " << deallocTime.count() << " 秒" << std::endl;
}

int main() {
    std::atomic<int> count(0);

    std::thread threads[numThreads];
    std::chrono::duration<double> totalTime(0);

    auto startTotal = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < numThreads; ++i) {
        threads[i] = std::thread(threadFunction, i, std::ref(count));
    }

    for (int i = 0; i < numThreads; ++i) {
        threads[i].join();
    }
    auto endTotal = std::chrono::high_resolution_clock::now();
    totalTime = endTotal - startTotal;

    std::cout << numThreads << " 个线程,每个线程执行最大随机 " << maxBlockSize/(1024*1024) << "MB " << iterations << " 次 "<< std::endl;
    std::cout << "总执行时间: " << totalTime.count() << " 秒" << std::endl;

    return 0;
}

执行结果

线程 0 分配时间: 0.0126348 秒, 释放时间: 0.000201596 秒
线程 2 分配时间: 0.0130916 秒, 释放时间: 0.000475594 秒
线程 1 分配时间: 0.0137269 秒, 释放时间: 0.00010405 秒
线程 3 分配时间: 0.0140054 秒, 释放时间: 0.0002626984 个线程,每个线程执行最大随机 128MB 25 次 
总执行时间: 0.0147795

数据结构

开发中…,会首先提供一个多进程共享队列,实现进程交互共享内存块的数据;

  • 13
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值