我启动2个进程,一个进程往队列中插入数据,另一个进程从队列中取数据,这个队列使用共享内存实现的,经过测试往队列里添加数据和从队列中取数据的时间消耗大概是0.5毫秒左右,我希望能把时间控制在10微秒以内,请问有啥方法比较好!采纳有积分奖励!
这里主要是在加锁和解锁哪里消耗了很多时间!望大神们给点建议!
这个要做性能profile,看具体瓶颈在哪。然后对应分析
共享内存的方式实现队列(假设你实现的方式是链表),
那么分配的节点的方式大概这样下:
void * shm_alloc(int size,int key)
{
int shmid;
void *p;
if((shmid=shmget(ftok("ex01.c",key),size,0666|IPC_CREAT))<0)
{
err_exit("shmget");
}
if((p=shmat(shmid,NULL,0))<0)
{
err_exit("shmat");
}
return p;
}
调用方式如下:
struct node *p;
p=(struct node *)shm_alloc(sizeof(struct node ),i);
有了这些准备后关键问题就是锁的问题啦!
1:必须明确进程同步策略
2:锁的肯定也置于共享内存中。
3:那么假设A进程获取mutex变量。
则需要访问共享内存部分;
阻塞;获取锁后,继续申请获取队列
获取成功后假设添加数据。最后释放锁
并且通过进程同步通知B进程可以读锁。
以上是我分析你的实现过程。
那么下面就是对你将实现的问题,提出一些解决方案:
第一,你需要的无非是一个缓存区问题;
并且我假设你实现的是类似生产消费问题,那么很明显你可以用
Rabbitmq解决。它提供强大的队列管理机制,要是你会使用python的话
当然java ....等等也可以。你可以实现一个或多个进程读入(即:生产)
多个进程并发处理(即:消费)
第二,一般像这样的问题也可以用线程实现。
不过需要具体考虑你的资源访问问题是否相关。
希望能对你有用!