C6678共享存储器问题

       MSMC默认配置为L2,根据用户需要能配置成L3。由于配置为L3只是做了地址映射,所以物理上的访问时间应该还是一个数量级的,相差不大。这里的L2和L3的区别应该是指L2只能被L1D和L1P Cache, L3能被L2、L1D和L1P Cache。一般来说,默认使用L2的配置。用户根据自己的应用来决定是否配置为L3。最常见的需要设置MSMC为L3的场景为:需要MSMC内存为non-cacheable,需要将MSMC设置为L3 RAM。

     C6678的MSMC负责处理系统中所有的master(包括8个核,以及SMS和SES接口)对MSMC SRAM和DDR3的访问请求。4M字节的MSMC SRAM有4个bank,这些bank是独立的slave,也就是说,如果两个master在同一个clock访问两个不同的bank,则两个访问可以同时完成。如果多个master在同一个clock访问同一个bank,则由MSMC内的仲裁逻辑按优先级处理。DDR3只有一个slave端口,如果多个master在同一个clock访问它,也由MSMC内的仲裁逻辑按优先级处理。MSMC默认配置为L2,根据用户需要能配置成L3。由于配置为L3只是做了地址映射,所以物理上的访问时间应该还是一个数量级的,相差不大。这里的L2和L3的区别应该是指L2只能被L1D和L1P Cache, L3能被L2、L1D和L1P Cache。一般来说,默认使用L2的配置。用户根据自己的应用来决定是否配置为L3。最常见的需要设置MSMC为L3的场景为:需要MSMC内存为non-cacheable,需要将MSMC设置为L3 RAM。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个使用共享内存的例子。下面是代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <string.h> #define MAX_PROCESSES 10 #define QUEUE_SIZE 20 typedef struct { int data[QUEUE_SIZE]; int head; int tail; } queue_t; int shmid; queue_t *queue; void worker() { while (1) { int num; while (queue->head == queue->tail) { sleep(1); } num = queue->data[queue->head]; queue->head = (queue->head + 1) % QUEUE_SIZE; printf("Processed: %d\n", num*num); } } void parent() { int i; for (i = 30000000; i < 30000200; i++) { while ((queue->tail + 1) % QUEUE_SIZE == queue->head) { sleep(1); } queue->data[queue->tail] = i; queue->tail = (queue->tail + 1) % QUEUE_SIZE; printf("Sent: %d\n", i); } } int main() { int i; pid_t pid; key_t key = ftok(".", 'q'); shmid = shmget(key, sizeof(queue_t), IPC_CREAT | 0666); if (shmid == -1) { perror("shmget"); exit(1); } queue = shmat(shmid, NULL, 0); if (queue == (void*) -1) { perror("shmat"); exit(1); } queue->head = 0; queue->tail = 0; for (i = 0; i < MAX_PROCESSES; i++) { pid = fork(); if (pid == -1) { perror("fork"); exit(1); } else if (pid == 0) { worker(); exit(0); } } parent(); for (i = 0; i < MAX_PROCESSES; i++) { wait(NULL); } shmdt(queue); shmctl(shmid, IPC_RMID, NULL); return 0; } ``` 程序中使用了一块共享内存来实现子进程和父进程之间的通信,父进程向队列中发送数据,子进程从队列中取出数据进行处理。 共享内存的创建和删除使用了`shmget`和`shmctl`函数,共享内存的附加和分离使用了`shmat`和`shmdt`函数。 程序中创建了10个子进程,每个子进程通过循环调用`worker`函数来不断从队列中取出数据进行处理。 父进程则通过循环调用`parent`函数来不断向队列中发送数据,如果队列已满,则等待。 注意,程序中使用了循环来处理队列满的情况,这样可以让父进程在队列已满的情况下不会一直等待,而是每隔一段时间就检查一次队列是否已经有空闲位置。同时,子进程也会每隔一段时间就检查一次队列是否有数据可供处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值