如何设置LINUX的核显共享内存设置

  我们可以修改shmmax内核参数,使SGA存在于一个共享内存段中。
  通过修改/proc/sys/kernel/shmmax参数可以达到此目的。
  [root@neirong root]# echo
& /proc/sys/kernel/shmmax
  [root@neirong root]# more /proc/sys/kernel/shmmax
  这里设为1G。
  对于shmmax文件的修改,系统重新启动后会复位。可以通过修改 /etc/sysctl.conf 使更改永久化。
  在该文件内添加以下一行&&& kernel.shmmax = & 这个更改在系统重新启动后生效.
  1、设置 SHMMAX
  SHMMAX
  参数定义共享内存段的最大尺寸(以字节为单位)。在设置 SHMMAX 时,切记 SGA 的大小应该适合于一个共享内存段。 SHMMAX 设置不足可能会导致以下问题:
  ORA-27123:unable to attach to shared memory segment
  您可以通过执行以下命令来确定 SHMMAX 的值:
  # cat /proc/sys/kernel/shmmax
  SHMMAX 的默认值是 32MB 。我一般使用下列方法之一种将 SHMMAX 参数设为 2GB :
  通过直接更改 /proc 文件系统,你不需重新启动机器就可以改变 SHMMAX 的默认设置。我使用的方法是将以下命令放入 /etc/rc.local 启动文件中:
  # &echo "" & /proc/sys/kernel/shmmax
  您还可以使用 sysctl 命令来更改 SHMMAX 的值:
  # sysctl -w kernel.shmmax=
  最后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
  # echo "kernel.shmmax=" && /etc/sysctl.conf
  2、设置 SHMMNI
  我们现在来看 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改。
  您可以通过执行以下命令来确定 SHMMNI 的值:
  # cat /proc/sys/kernel/shmmni
  3、设置 SHMALL
  最后,我们来看 SHMALL 共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:
  ceil(SHMMAX/PAGE_SIZE)
  SHMALL 的默认大小为 2097152 ,可以使用以下命令进行查询:
  # cat /proc/sys/kernel/shmall
  2097152
  SHMALL 的默认设置对于我们的 Oracle9 i RAC 安装来说应该足够使用。
  注意: 在 i386 平台上 Red Hat Linux 的 页面大小 为 4096 字节。但是,您可以使用 bigpages ,它支持配置更大的内存页面尺寸。
【】【】【】【】
········
  《全国专业技术人员计算机应用能力考试标准教程—word&2003中文字处理》严格根据..
定价:¥39.50
优惠价:¥29.60&&本书适合报考全国专业技术人员计算机应用能力考试“中文windows&xp操作系统”科目的..
定价:¥39.50
优惠价:¥29.60&&
············
············
         Copyright ©
() All Rights Reservedyou have been blockedLinux下多任务间通信和同步-mmap共享内存_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Linux下多任务间通信和同步-mmap共享内存
来源:Linux社区&
作者:ce123_zhouwei
共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程可以及时看到另一个进程对共享内存的更新,反之亦然.
采用共享内存通信的一个显而易见的好处效率高,因为进程可以直接读写内存,而不需要任何数据的复制.对于向管道和消息队列等通信等方式,则需要在内核和用户空间进行四次的数据复制,而共享内存则只需要两次数据复制:一次从输入文件到共享内存区,另一个从共享内存区到输出文件.实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域.而是保持共享区域,知道通信完毕为止,这样,数据内容就一直保存在共享内存中,并没有写回文件.共享内存中的内容往往是在解除映射时才写回文件的.因此,采用共享内存的通信方式效率非常高.
linux从2.2内核开始就支持多种共享内存方式,如mmap系统调用,Posix共享内存,以及System V共享内存.本文主要介绍mmap系统调用的原理及应用.后续的文章会讲解System V共享内存.
2.mmap系统调用
mmap系统调用是的是的进程间通过映射同一个普通文件实现共享内存.普通文件被映射到进程地址空间后,进程可以向像访问普通内存一样对文件进行访问,不必再调用read,write等操作.与mmap系统调用配合使用的系统调用还有munmap,msync等.
实际上,mmap系统调用并不是完全为了用于共享内存而设计的.它本身提供了不同于一般对普通文件的访问方式,是进程可以像读写内存一样对普通文件操作.而Posix或System V的共享内存则是纯粹用于共享内存的,当然mmap实现共享内存也是主要应用之一.
#include &sys/mman.h&void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
各个参数的说明如下:
start:映射区的开始地址,设置为0时表示由系统决定映射区的起始地址.
length:映射区的长度.长度单位是以内存页为单位.
prot:期望的内存保护标志,不能与文件的打开模式冲突.是以下的某个值,可以通过or运算合理地组合在一起.
PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问
flags:指定映射对象的类型,映射选项和映射页是否可以共享.它的值可以是一个或者多个以下位的组合体.
MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃.如果指定的起始地址不可用,操作将会失败.并且起始地址必须落在页的边界上.
MAP_SHARED //与其它所有映射这个对象的进程共享映射空间.对共享区的写入,相当于输出到文件.直到msync()或者munmap()被调用,文件实际上不会被更新.
MAP_PRIVATE //建立一个写入时拷贝的私有映射.内存区域的写入不会影响到原文件.这个标志和以上标志是互斥的,只能使用其中一个.
MAP_DENYWRITE //这个标志被忽略.
MAP_EXECUTABLE //同上
MAP_NORESERVE //不要为这个映射保留交换空间.当交换空间被保留,对映射区修改的可能会得到保证.当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号.
MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存.
MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展.
MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联.
MAP_ANON //MAP_ANONYMOUS的别称,不再被使用.
MAP_FILE //兼容标志,被忽略.
MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略.当前这个标志只在x86-64平台上得到支持。
MAP_POPULATE //为文件映射通过预读的方式准备好页表.随后对映射区的访问不会被页违例阻塞.
MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义.不执行预读,只为已存在于内存中的页面建立页表入口.
fd:有效的文件描述词.一般是由open()函数返回,其值也可以设置为-1,此时需要指定flags参数中的MAP_ANON,表明进行的是匿名映射.
offset:被映射对象内容的起点.一般设为0,表示从文件头开始映射.
函数的返回值为最后文件映射到进程空间的地址,进程可以直接操作起始地址为该值的有效地址.系统调用mmap用于共享内存时有下面两种常用的方式:
1)使用普通文件提供的内存映射:适用于任何进程之间.此时,需要打开或创建一个文件,然后再调用mmap,这种方式有许多特点和要注意的地方,我们在后面或举例子说明.
2)使用特殊文件提东匿名内存映射:适用于具有亲缘关系的进程之间.由于父子进程特殊的亲缘关系,在父进程中吊牌用mmap,然后调用fork.那么在调用fork之后,子进程急促继承父进程匿名映射后的地址空间,同样也继承mmap返回的地址,这样,父子进程就可以通过映射区进行通信了.注意,mmap返回的地址,需要由父进程共同维护.
对于任意的两个进程可以使用第一种方式,而对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式.此时,不必指定具体的文件,只要设定相应的标志即可,后面有相应的例子.
更多详情请继续阅读第2页的内容:
推荐阅读:
Linux system V IPC 信号灯和共享内存实例
Unix/Linux共享内存应用与陷阱
一步一步学Linux C:共享内存通信实例
Linux ipcs确定共享内存使用情况
Linux 进程间通信(system v 信号灯+system v 共享内存)实例
Linux 进程间通信(system v 信号灯+ posix共享内存)实例
相关资讯 & & &
& (10/15/:09)
& (04/04/:32)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
设置Linux中共享内存的内核参数
  中共享内存涉及到三个内核参数:SHMMAX/SHMMNI/SHMALL,除了默认值,我们还可以因环境、应用的需要进行临时、或永久的更改。
  SHMMAX参数定义共享内存段的最大尺寸(以字节为单位),默认值是32MB.
  SHMMNI 参数设置系统范围内共享内存段的最大数量,默认值是 4096.
  SHMALL参数控制着系统一次可以使用的共享内存总量(以页为单位),默认值2097152.该参数值至少应该大于等于SHMMAX/PAGE_SIZE.
  查看这三个参数的当前值,通过proc文件系统可以看到:
  $ cat /proc/sys/kernel/shmmax
  $ cat /proc/sys/kernel/shmmni
  $ cat /proc/sys/kernel/shmall
  2097152
  临时修改这三个参数的值,通过echo或sysctl命令修改proc文件中的值,重启失效
  $ echo
& /proc/sys/kernel/shmmax
  $ sysctl -w kernel.shmmax= # 1GB
  长期修改三个参数的值,修改/etc/sysctl.conf文件的内容实现,重启有效
  echo "kernel.shmmax=" 》 /etc/sysctl.conf
[ 责任编辑:之极 ]
去年,手机江湖里的竞争格局还是…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte122688人阅读
初学Linux(27)
下面将讲解进程间通信的另一种方式,使用共享内存。一、什么是共享内存顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。有关信号量的更多内容,可以查阅我的另一篇文章:二、共享内存的使得与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h中。1、shmget函数该函数用来创建共享内存,它的原型为:int shmget(key_t key, size_t size, int shmflg);第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。第二个参数,size以字节为单位指定需要共享的内存容量第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。2、shmat函数第一次创建完共享内存时,它还不能被任何进程访问,shmat函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间。它的原型如下:void *shmat(int shm_id, const void *shm_addr, int shmflg);第一个参数,shm_id是由shmget函数返回的共享内存标识。第二个参数,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。第三个参数,shm_flg是一组标志位,通常为0。调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.3、shmdt函数该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下:int shmdt(const void *shmaddr);参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1.4、shmctl函数与信号量的semctl函数一样,用来控制共享内存,它的原型如下:int shmctl(int shm_id, int command, struct shmid_ds *buf);第一个参数,shm_id是shmget函数返回的共享内存标识符。第二个参数,command是要采取的操作,它可以取下面的三个值 :& & IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。& & IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值& & IPC_RMID:删除共享内存段第三个参数,buf是一个结构指针,它指向共享内存模式和访问权限的结构。shmid_ds结构至少包括以下成员:struct shmid_ds
uid_t shm_perm.
uid_t shm_perm.
mode_t shm_perm.
};三、使用共享内存进行进程间通信说了这么多,又到了实战的时候了。下面就以两个不相关的进程来说明进程间如何通过共享内存来进行通信。其中一个文件shmread.c创建共享内存,并读取其中的信息,另一个文件shmwrite.c向共享内存中写入数据。为了方便操作和数据结构的统一,为这两个文件定义了相同的数据结构,定义在文件shmdata.c中。结构shared_use_st中的written作为一个可读或可写的标志,非0:表示可读,0表示可写,text则是内存中的文件。shmdata.h的源代码如下:#ifndef _SHMDATA_H_HEADER
#define _SHMDATA_H_HEADER
#define TEXT_SZ 2048
struct shared_use_st
//作为一个标志,非0:表示可读,0表示可写
char text[TEXT_SZ];//记录写入和读取的文本
#endif源文件shmread.c的源代码如下:#include &unistd.h&
#include &stdlib.h&
#include &stdio.h&
#include &sys/shm.h&
#include &shmdata.h&
int main()
int running = 1;//程序是否继续运行的标志
void *shm = NULL;//分配的共享内存的原始首地址
struct shared_use_st *//指向shm
//共享内存标识符
//创建共享内存
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if(shmid == -1)
fprintf(stderr, &shmget failed\n&);
exit(EXIT_FAILURE);
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, 0, 0);
if(shm == (void*)-1)
fprintf(stderr, &shmat failed\n&);
exit(EXIT_FAILURE);
printf(&\nMemory attached at %X\n&, (int)shm);
//设置共享内存
shared = (struct shared_use_st*)
shared-&written = 0;
while(running)//读取共享内存中的数据
//没有进程向共享内存定数据有数据可读取
if(shared-&written != 0)
printf(&You wrote: %s&, shared-&text);
sleep(rand() % 3);
//读取完数据,设置written使共享内存段可写
shared-&written = 0;
//输入了end,退出循环(程序)
if(strncmp(shared-&text, &end&, 3) == 0)
running = 0;
else//有其他进程在写数据,不能读取数据
//把共享内存从当前进程中分离
if(shmdt(shm) == -1)
fprintf(stderr, &shmdt failed\n&);
exit(EXIT_FAILURE);
//删除共享内存
if(shmctl(shmid, IPC_RMID, 0) == -1)
fprintf(stderr, &shmctl(IPC_RMID) failed\n&);
exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}源文件shmwrite.c的源代码如下:#include &unistd.h&
#include &stdlib.h&
#include &stdio.h&
#include &string.h&
#include &sys/shm.h&
#include &shmdata.h&
int main()
int running = 1;
void *shm = NULL;
struct shared_use_st *shared = NULL;
char buffer[BUFSIZ + 1];//用于保存输入的文本
//创建共享内存
shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666|IPC_CREAT);
if(shmid == -1)
fprintf(stderr, &shmget failed\n&);
exit(EXIT_FAILURE);
//将共享内存连接到当前进程的地址空间
shm = shmat(shmid, (void*)0, 0);
if(shm == (void*)-1)
fprintf(stderr, &shmat failed\n&);
exit(EXIT_FAILURE);
printf(&Memory attached at %X\n&, (int)shm);
//设置共享内存
shared = (struct shared_use_st*)
while(running)//向共享内存中写数据
//数据还没有被读取,则等待数据被读取,不能向共享内存中写入文本
while(shared-&written == 1)
printf(&Waiting...\n&);
//向共享内存中写入数据
printf(&Enter some text: &);
fgets(buffer, BUFSIZ, stdin);
strncpy(shared-&text, buffer, TEXT_SZ);
//写完数据,设置written使共享内存段可读
shared-&written = 1;
//输入了end,退出循环(程序)
if(strncmp(buffer, &end&, 3) == 0)
running = 0;
//把共享内存从当前进程中分离
if(shmdt(shm) == -1)
fprintf(stderr, &shmdt failed\n&);
exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}再来看看运行的结果:分析:1、程序shmread创建共享内存,然后将它连接到自己的地址空间。在共享内存的开始处使用了一个结构struct_use_st。该结构中有个标志written,当共享内存中有其他进程向它写入数据时,共享内存中的written被设置为0,程序等待。当它不为0时,表示没有进程对共享内存写入数据,程序就从共享内存中读取数据并输出,然后重置设置共享内存中的written为0,即让其可被shmwrite进程写入数据。2、程序shmwrite取得共享内存并连接到自己的地址空间中。检查共享内存中的written,是否为0,若不是,表示共享内存中的数据还没有被完,则等待其他进程读取完成,并提示用户等待。若共享内存的written为0,表示没有其他进程对共享内存进行读取,则提示用户输入文本,并再次设置共享内存中的written为1,表示写完成,其他进程可对共享内存进行读操作。四、关于前面的例子的安全性讨论这个程序是不安全的,当有多个程序同时向共享内存中读写数据时,问题就会出现。可能你会认为,可以改变一下written的使用方式,例如,只有当written为0时进程才可以向共享内存写入数据,而当一个进程只有在written不为0时才能对其进行读取,同时把written进行加1操作,读取完后进行减1操作。这就有点像文件锁中的读写锁的功能。咋看之下,它似乎能行得通。但是这都不是原子操作,所以这种做法是行不能的。试想当written为0时,如果有两个进程同时访问共享内存,它们就会发现written为0,于是两个进程都对其进行写操作,显然不行。当written为1时,有两个进程同时对共享内存进行读操作时也是如些,当这两个进程都读取完是,written就变成了-1.要想让程序安全地执行,就要有一种进程同步的进制,保证在进入临界区的操作是原子操作。例如,可以使用前面所讲的信号量来进行进程的同步。因为信号量的操作都是原子性的。五、使用共享内存的优缺点1、优点:我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。同时,它也不像匿名管道那样要求通信的进程有一定的父子关系。2、缺点:共享内存没有提供同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段来进行进程间的同步工作。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1787700次
积分:11196
积分:11196
排名:第1288名
原创:126篇
转载:35篇
评论:725条
阅读:18262
文章:28篇
阅读:1188219
(1)(2)(5)(2)(1)(1)(1)(2)(2)(4)(2)(1)(7)(5)(4)(3)(15)(17)(4)(4)(4)(3)(2)(11)(5)(10)(10)(11)(24)

我要回帖

更多关于 如何设置显卡共享内存 的文章

 

随机推荐