介绍---memory和client/server

本文探讨了OpenGL中的三种内存类型及其应用场景,包括系统内存、视频内存及帧缓冲区内存。详细介绍了驱动程序如何处理应用数据,以及OpenGL状态机的概念和工作原理。

很粗略的,我们可以从三个主要角度来看待memory:

1. CPU可以读写的,称为system memory,我们一般写的程序都是使用system memory。

2. CPU可写GPU可读的,属于video memory,这种memory在驱动程序中具有重要意义,是驱动程序软件和GPU硬件的桥梁。驱动程序往此memory写入硬件指令,GPU读取指令然后执行。

3. CPU可读GPU可写的,也属于video memory,在驱动开发中也很重要。GPU将某些执行状态或者反馈数据写入此memory,驱动程序读取就可以了解GPU的状态。

frame buffer也属于video memory,它是GPU可写的,一般来说,也是GPU可读但CPU不可读的。

【说明】应用程序和驱动程序都是由CPU执行的,所以,所谓的CPU的读写,就是应用程序/驱动程序的读写属性。

考察一个OpenGL应用程序,如下图所示,应用程序在system memory中准备好数据,将指针传递给driver。driver有两种处理方法:

1. driver在自己内部分配memory,即时的将应用程序system memory中的数据拷贝过来。这样,接下去假如在应用程序中修改了其system memory中的数据,并不影响已经被拷贝到driver中的数据。

2. driver只是简单的记录下指针值,然后,只在这块数据真正被需要用到的时候,driver才去指针对应位置去获取数据。在这中间,假如在应用程序中修改了其system memory中的数据,显然driver所取得的数据是修改后的值。

【说明】opengl一开始只定义了第二种方式,由于存在局限性(后面会详述),在03年提出的verter buffer object技术开始支持第一种方式。

不管是哪种方式,driver都需要分配出video memory,用恰当的方法将app的system memory中的数据拷贝转换到video memory中,然后GPU读取执行即可。

但是,在第一种方式下,考虑到可能存在video memory不足的情况,此时,video memory可能会被其他数据覆盖另作他用,所以,driver往往还会分配出system memory作为备份。换而言之,app的system memory中的数据,在driver中会有两份拷贝,一份在driver的system memory中,另一份在video memory中。

5

【说明】写完后才觉得,可能以下内容并不适合新手,假如对ogl有一定了解的,可以继续往下看。

现在是介绍state概念的合适时机了,根据Spec,OpenGL是一个状态机state machine,意指OpenGL Pipeline中存在多个属性,glAPI可以修改这些属性,而glAPI的执行结果也取决于这些属性的当前值。所有的属性值构成了一个状态,此即状态机的名称由来。换句话说,见上图,ogl是一个有记忆效果的模块,前面glAPI的不同调用会影响后面glAPI的结果。

【说明】这这里,属性并不是一个专业术语,只是为了解释方便使用的一个词语,其意思是状态机中的一个个子状态。比如说,有没有启用光照,当前眼睛位置在哪里,等等,这些都是子状态(属性),所有的子状态构成了一个状态机,有时候我们也简称为状态。我们也往往会称呼子状态为状态。一般来说,并不会引起歧义。

所以,在driver中,都会存在一个数据结构,其变量名一般都叫gc,取OpenGL Context的意思,它维护着在ogl中的当前状态。ogl状态由两部分组成,client state和server state,大部分的状态都是server state,是完全属于driver/ogl内部维护的state;回想上面介绍的driver对app system memory处理的两种方法中的第二种,不可避免的,有些状态是和app相关的,被称为client state。

那么,为什么app相关的是client state,而完全从属于driver/ogl的是server state,而不是将两者的client/server名称换一下呢。我们可以从linux/X的角度去考量。

当一切都在一台机器上执行的时候,比较难以理解。所以,下图示意了两台电脑通过网络连接在一起的情况。电脑A上跑着Linux/X,最终用户坐在电脑B前面,用和电脑B连接的键盘鼠标进行输入,远程登录到电脑A上,并启动了一个应用程序,在和电脑B连接的显示器上看到这个应用程序的图形图像输出。根据X协议的规定,电脑A被称为client端,而电脑B被称为server端。

假如这个应用程序是一个OpenGL程序的话,opengl driver是处于机器B上的,因为这样才能操作机器B上的显卡最终在机器B的显示器上显示绘制结果。

当app和driver在同一台电脑上时,两者是处于同一个进程中的;而当我们将app和driver分到两台电脑时,两者是无法处于一个进程中的,我们就会明白client state和server state确实是有区别的。假如采用第二种方式,每次需要时driver都需要借助X协议通过网络获取app system memory的数据,那会是非常缓慢的;因此,诸如vertex buffer object等技术就引入了第一种方式,数据在一开始就被拷贝到driver中,不在需要缓慢的X协议了,甚至,即使是在同一台电脑中,假如video memory足够多或者分配策略足够好,vertex buffer object技术也能提高速度,因为假如数据一直都在video memory中,就不需要频繁的进行从system memory到video memory的拷贝了。

6

 

[root@ljm1 apache-flume-1.8.0-bin]# bin/flume-ng agent --conf ./conf --conf-file flume-conf.properties --name agent -Dflume.root.logger=INFO,console Info: Sourcing environment configuration script /home/ljm1/daolun/servers/apache-flume-1.8.0-bin/conf/flume-env.sh Info: Including Hadoop libraries found via (/home/ljm1/daolun/servers/hadoop-2.7.4/bin/hadoop) for HDFS access Info: Including HBASE libraries found via (/home/ljm1/daolun/servers/hbase-1.4.0/bin/hbase) for HBASE access Info: Including Hive libraries found via (/home/ljm1/daolun/servers/apache-hive-1.2.1-bin) for Hive access + exec /home/ljm1/daolun/servers/jdk/bin/java -Xmx20m -Dflume.root.logger=INFO,console -cp '/home/ljm1/daolun/servers/apache-flume-1.8.0-bin/conf:/home/ljm1/daolun/servers/apache-flume-1.8.0-bin/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/etc/hadoop:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/common/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/common/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/hdfs:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/hdfs/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/hdfs/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/yarn/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/yarn/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/mapreduce/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/mapreduce/*:/home/ljm1/daolun/servers/hadoop-2.7.4/contrib/capacity-scheduler/*.jar:/home/ljm1/daolun/servers/hbase-1.4.0/conf:/home/ljm1/daolun/servers/jdk/lib/tools.jar:/home/ljm1/daolun/servers/hbase-1.4.0:/home/ljm1/daolun/servers/hbase-1.4.0/lib/activation-1.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/apacheds-i18n-2.0.0-M15.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/apacheds-kerberos-codec-2.0.0-M15.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/api-asn1-api-1.0.0-M20.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/api-util-1.0.0-M20.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/asm-3.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/avro-1.7.7.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-beanutils-1.7.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-beanutils-core-1.8.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-cli-1.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-codec-1.9.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-collections-3.2.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-compress-1.4.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-configuration-1.6.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-daemon-1.0.13.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-digester-1.8.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-el-1.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-httpclient-3.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-io-2.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-lang-2.6.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-logging-1.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-math-2.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-math3-3.1.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/commons-net-3.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/curator-client-2.7.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/curator-framework-2.7.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/curator-recipes-2.7.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/disruptor-3.3.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/findbugs-annotations-1.3.9-1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/gson-2.2.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/guava-12.0.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-annotations-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-auth-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-client-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-common-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-hdfs-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-mapreduce-client-app-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-mapreduce-client-common-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-mapreduce-client-core-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-mapreduce-client-jobclient-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-mapreduce-client-shuffle-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-yarn-api-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-yarn-client-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-yarn-common-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hadoop-yarn-server-common-2.7.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-annotations-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-annotations-1.4.0-tests.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-client-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-common-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-common-1.4.0-tests.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-examples-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-external-blockcache-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-hadoop2-compat-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-hadoop-compat-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-it-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-it-1.4.0-tests.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-metrics-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-metrics-api-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-prefix-tree-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-procedure-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-protocol-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-resource-bundle-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-rest-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-rsgroup-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-server-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-server-1.4.0-tests.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-shell-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/hbase-thrift-1.4.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/htrace-core-3.1.0-incubating.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/httpclient-4.5.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/httpcore-4.4.4.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jackson-core-asl-1.9.13.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jackson-jaxrs-1.9.13.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jackson-mapper-asl-1.9.13.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jackson-xc-1.9.13.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jamon-runtime-2.4.1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jasper-compiler-5.5.23.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jasper-runtime-5.5.23.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jaxb-api-2.2.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jaxb-impl-2.2.3-1.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jcodings-1.0.8.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jersey-client-1.9.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jersey-core-1.9.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jersey-json-1.9.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jersey-server-1.9.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jettison-1.3.3.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jetty-6.1.26.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jetty-sslengine-6.1.26.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jetty-util-6.1.26.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/joni-2.1.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jruby-complete-1.6.8.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jsch-0.1.54.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jsp-2.1-6.1.14.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/jsp-api-2.1-6.1.14.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/junit-4.12.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/leveldbjni-all-1.8.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/libthrift-0.9.3.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/log4j-1.2.17.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/metrics-core-2.2.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/metrics-core-3.1.2.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/netty-all-4.1.8.Final.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/paranamer-2.3.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/protobuf-java-2.5.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/servlet-api-2.5-6.1.14.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/slf4j-api-1.7.7.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/slf4j-log4j12-1.7.10.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/snappy-java-1.0.5.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/spymemcached-2.11.6.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/xmlenc-0.52.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/xz-1.0.jar:/home/ljm1/daolun/servers/hbase-1.4.0/lib/zookeeper-3.4.10.jar:/home/ljm1/daolun/servers/hadoop-2.7.4/etc/hadoop:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/common/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/common/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/hdfs:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/hdfs/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/hdfs/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/yarn/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/yarn/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/mapreduce/lib/*:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/mapreduce/*:/home/ljm1/daolun/servers/hadoop-2.7.4/contrib/capacity-scheduler/*.jar:/home/ljm1/daolun/servers/hbase-1.4.0/conf:/home/ljm1/daolun/servers/apache-hive-1.2.1-bin/lib/*' -Djava.library.path=:/home/ljm1/daolun/servers/hadoop-2.7.4/lib/native:/home/ljm1/daolun/servers/hadoop-2.7.4/lib/native org.apache.flume.node.Application --conf-file flume-conf.properties --name agent SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/home/ljm1/daolun/servers/apache-flume-1.8.0-bin/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/ljm1/daolun/servers/hadoop-2.7.4/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/ljm1/daolun/servers/hbase-1.4.0/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. 2025-07-04 11:08:36,654 (main) [ERROR - org.apache.flume.node.Application.main(Application.java:348)] A fatal error occurred while running. Exception follows. org.apache.commons.cli.ParseException: The specified configuration file does not exist: /home/ljm1/daolun/servers/apache-flume-1.8.0-bin/flume-conf.properties at org.apache.flume.node.Application.main(Application.java:316) 这是怎么回事
07-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值