很抱歉应用程序googlekernel是啥(进程:system)意外停止,请重试.这个对话框怎么消除

扫描下面的二维码,或者微信搜索ssdfans关注公众号,每天都能看到一篇SSD精彩文章。
&()是目前的中文网络上介绍SSD最专业的网站,文章都来自于业内技术人士。本文列出几篇适合SSD爱好者技术入门的文章,帮助SSD的选购、使用和技术开发。
何为SSD? Solid State
Disk/Drive,固态硬盘也。现在,想必很多人都知道这东西,并且自觉或者不自觉的在使用着固态硬盘。一台刚买的新机子,如果配有固态硬盘,你看到系统启动只要几秒钟,飞一般的感觉,非常的爽。但你可能认为这是新机,i5+4G/8G内存,速度快是本该如此,SSD在其中起的作用,你可能并没有充分认识到。但是,如果你把你的老机子,硬盘换成固态硬盘,你会惊讶的发现,之前系统启动需要一分多钟,现在只需要十多秒,你会感慨:真的是一分钱一分货呀,SSD真是神奇,让你的机子焕发第二春了。
速度快,可能是用户在使用过程中对SSD最直观的感受。当然,价格高,应该是用户在选购时的第一感受。除此之外,SSD对很多人来说,还是个比较新颖神秘的东西。本文旨在科普SSD。什么是SSD?相比传统硬盘HDD,SSD有什么优劣势呢?本文一一道来。
本文介绍了SSD的一些基本原理,包括SSD底层FLASH阵列的实现,Host Page与Physical
Page的映射及映射表,垃圾回收机制,写放大,OP和Wear
Leveling等。虽然市面上有各种各样的SSD,但它们内部这些基本的东西都是相通的。理解了这些东西,就等于拥有了一把通向SSD世界的钥匙。
包括AS SSD Benchmark, ATTO Disk Benchmark, CristalDiskMark,PC
Mark Vantage,IOMeter的用法和特点。
目前绝大多数SSD都是以NAND FLASH为存储介质的。SSD工作原理很多都是基于NAND
FLASH特性的。比如,NAND FLASH在写之前必须先擦除,而不能覆盖写,于是SSD 才需要垃圾回收(Garbage
Collection,或者叫 Recycle);NAND FLASH
每个块(Block)擦写次数达到一定值,这个块就不能用了(数据丢失,或者写入不了),所以SSD 固件必须做 Wear
Leveling,让数据平均写在所有块上,而不是盯着几个块拼命写(不然没几天SSD就报废了)。&
当我们删除一个文件的时候,我们并没有真正删除HDD或者SSD里面的文件数据,它只是把这些数据占用的地址标记为”空”,即可以覆盖写。但这只是在文件系统层面的操作,HDD或者SSD并不知道哪些地址的数据无效,除非HOST重新在这些地址写入新的数据。
Trim,是一个ATA命令,当用户删除一个文件时,操作系统会发TRIM命令给SSD,告诉SSD哪些HOST
PAGE对应的数据无效了。一旦SSD知道哪些数据是无效后,在做垃圾回收的时候就可以把这些删除掉的数据抛弃掉,不做无谓的数据搬移。这样不仅增强SSD性能,又延长SSD寿命。
替换和略过两种坏块管理策略,没有谁优谁劣,取决于SSD的软硬件架构。在此提这两种策略,只是给设计者一个
参考。但需要提到的是,替换机制策略有一个致命点,那就是如果某个Die坏了(所有Block不可用,或者可用的很少),那么,整个SSD就废了!因为在那个Die上,找不到好块来替换坏块,用户数据无处可写!
替换策略有短板效应,你也许会说,既然这样,那就采用略过策略吧。但是,对某些SSD控制器来说,它只支持替换策略,比如Sandforce
2000系列的Controller。还是那句话,哪种策略适合你SSD的软件硬件架构,就用哪种吧。
SSD的基础浮栅晶体管发明过程中,还有华裔科学家施敏的贡献!
在我们今天看来,SSD是个新鲜事物,但是从事这个行业的前辈们却已经摸爬滚打了将近38年,从大学一毕业就干到了退休。庆幸的是他们中年轻的人在退休后看到了SSD的繁荣。所有重大的技术革新都是这样,需要长期的技术积累,很多人默默的投入,最终改变我们的生活。从当年的蒸汽机、发电机到后来的集成电路、互联网,以及未来的量子计算机、人工可控核聚变发电,无一不是如此。
早在1976年就出现了第一款使用RAM的SSD,1983年Psion公司的计算器使用了Flash存储卡,1991年SanDisk推出了20MB的Flash
SSD。经过了许多人三十多年的努力,SSD终于改变了我们的生活。
很多人可能想不到,互联网巨头百度也自己开发SSD。
在机械硬盘时代,硬盘的制造技术掌握在少数几家大公司手里,用户只能购买。但是进入SSD时代之后,硬盘的制造门槛没有那么高了,简单来说,SSD就是买Flash芯片和控制芯片组装起来就可以了,所以国内很多有技术实力的公司就想自己开发SSD,例如华为、百度等。
荷兰阿姆斯特丹的一个码农Emmanuel
Goossaert写了一系列文章,介绍程序员为SSD编程的秘籍。也有中文翻译,本文介绍其中的要点总结。
只要掌握了这29条准则,基本上使用SSD就能驾轻就熟了。例如,SSD里面有缓存和预读等机制,小数据的混合读写会影响这些机制的发挥,导致读写性能下降。所以最好把读集中在一起,写集中在一起。例如要修改1000个文件,不要读一个,写一个,最好是读出1000个文件,再统一改好写下去。
R-CNN是我科大师弟任少卿在微软研究院实习时完成的,现在用深度学习做图像分割和目标检测最快的算法。
下载代码和数据
git clone --recursive&
下载demo模型数据
[root@localhost py-faster-rcnn]#
./data/scripts/fetch_faster_rcnn_models.sh
Downloading Faster R-CNN demo models (695M)...
Unzipping...
faster_rcnn_models/
faster_rcnn_models/ZF_faster_rcnn_final.caffemodel
faster_rcnn_models/VGG16_faster_rcnn_final.caffemodel
编译cython
进入lib目录,修改setup.py,注释掉GPU相关代码,如下
locate_cuda()
#&&&&&&&&&&&
self.set_executable('compiler_so',
CUDA['nvcc'])
Extension('nms.gpu_nms',
['nms/nms_kernel.cu', 'nms/gpu_nms.pyx'],
library_dirs=[CUDA['lib64']],
libraries=['cudart'],
language='c++',
runtime_library_dirs=[CUDA['lib64']],
# this syntax is specific to this build system
# we're only going to use certain compiler args with nvcc and not
# gcc the implementation of this trick is in customize_compiler()
extra_compile_args={'gcc':
["-Wno-unused-function"],
#&&&&&&&&&&&&&&&&&&&&&&&&&&&
'nvcc': ['-arch=sm_35',
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'--ptxas-options=-v',
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
'--compiler-options',
#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
"'-fPIC'"]},
include_dirs = [numpy_include, CUDA['include']]
[root@localhost lib]# make
安装caffe(自带的,不是通用的)
进入caffe-fast-rcnn目录,大部分跟前面caffe安装记录一文一样,修改Makefile.config为
## Refer to
http://caffe.berkeleyvision.org/installation.html
# Contributions
simplifying and improving our build system are
# cuDNN acceleration
switch (uncomment to build with cuDNN).
# USE_CUDNN :=
# CPU-only switch
(uncomment to build without GPU support).
CPU_ONLY :=
# uncomment to disable
IO dependencies and corresponding data layers
# USE_OPENCV :=
# USE_LEVELDB :=
# USE_LMDB :=
# uncomment to allow
MDB_NOLOCK when reading LMDB files (only if necessary)
& You should not set this flag if you will be
reading LMDBs with any
& possibility of simultaneous read and
# ALLOW_LMDB_NOLOCK :=
# Uncomment if you're
using OpenCV 3
# OPENCV_VERSION :=
# To customize your
choice of compiler, uncomment and set the following.
# N.B. the default for
Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX :=
# CUDA directory
contains bin/ and lib/ directories that we need.
# CUDA_DIR :=
/usr/local/cuda
# On Ubuntu 14.04, if
cuda tools are installed via
# "sudo apt-get install
nvidia-cuda-toolkit" then use this instead:
# CUDA_DIR :=
# CUDA architecture
setting: going with all of them.
# For CUDA & 6.0,
comment the *_50 lines for compatibility.
#CUDA_ARCH := -gencode
arch=compute_20,code=sm_20 \
& & & -gencode
arch=compute_20,code=sm_21 \
& & & -gencode
arch=compute_30,code=sm_30 \
& & & -gencode
arch=compute_35,code=sm_35 \
& & & -gencode
arch=compute_50,code=sm_50 \
& & & -gencode
arch=compute_50,code=compute_50
# atlas for ATLAS
# open for
(MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to
accept the defaults for your choice of BLAS
# (which should
BLAS_INCLUDE :=
/usr/include/atlas-x86_64-base
BLAS_LIB :=
/usr/lib64/atlas
# Homebrew puts
openblas in a directory that is not on the standard search
# BLAS_INCLUDE :=
$(shell brew --prefix openblas)/include
# BLAS_LIB := $(shell
brew --prefix openblas)/lib
# This is required only
if you will compile the matlab interface.
# MATLAB directory
should contain the mex binary in /bin.
# MATLAB_DIR :=
/usr/local
# MATLAB_DIR :=
/Applications/MATLAB_R2012b.app
# NOTE: this is
required only if you will compile the python
interface.
# We need to be able to
find Python.h and numpy/arrayobject.h.
PYTHON_INCLUDE :=
/usr/include/python2.7 \
/usr/lib64/python2.7/site-packages/numpy/core/include
# Anaconda Python
distribution is quite popular. Include path:
# Verify anaconda
location, sometimes it's in root.
# ANACONDA_HOME :=
$(HOME)/anaconda
# PYTHON_INCLUDE :=
$(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include
# Uncomment to use
Python 3 (default is Python 2)
# PYTHON_LIBRARIES :=
boost_python3 python3.5m
# PYTHON_INCLUDE :=
/usr/include/python3.5m \
&/usr/lib/python3.5/dist-packages/numpy/core/include
# We need to be able to
find libpythonX.X.so or .dylib.
PYTHON_LIB :=
/usr/lib64
# PYTHON_LIB :=
$(ANACONDA_HOME)/lib
# Homebrew installs
numpy in a non standard path (keg only)
# PYTHON_INCLUDE +=
$(dir $(shell python -c 'import numpy.
print(numpy.core.__file__)'))/include
# PYTHON_LIB += $(shell
brew --prefix numpy)/lib
# Uncomment to support
layers written in Python (will link against Python
WITH_PYTHON_LAYER :=
# Whatever else you
find you need goes here.
INCLUDE_DIRS :=
$(PYTHON_INCLUDE) /usr/include
LIBRARY_DIRS :=
$(PYTHON_LIB) /usr/lib64
# If Homebrew is
installed at a non standard location (for example your home
directory) and you use it for general dependencies
# INCLUDE_DIRS +=
$(shell brew --prefix)/include
# LIBRARY_DIRS +=
$(shell brew --prefix)/lib
# Uncomment to use
`pkg-config` to specify OpenCV library paths.
# (Usually not
necessary -- OpenCV libraries are normally installed in one of the
above $LIBRARY_DIRS.)
# USE_PKG_CONFIG :=
BUILD_DIR :=
DISTRIBUTE_DIR :=
distribute
# Uncomment for
debugging. Does not work on OSX due to
/BVLC/caffe/issues/171
# DEBUG :=
# The ID of the GPU
that 'make runtest' will use to run unit tests.
# TEST_GPUID :=
# enable pretty build
(comment to see full commands)
修改Makefile
LIBRARIES += satlas tatlas #新版atlas已经不用这两个lib了:cblas
编译caffe和pycaffe
&[root@localhost caffe-fast-rcnn]# make -j8
&& make pycaffe
[root@localhost py-faster-rcnn]# ./tools/demo.py
Traceback (most recent call last):
File "./tools/demo.py", line 17, in
&from fast_rcnn.config import cfg
"/root/zhanxiang/work/py-faster-rcnn/tools/../lib/fast_rcnn/config.py",
line 23, in
from easydict import EasyDict as edict
ImportError: No module named easydict
缺少Python库easydict,所以安装 pip install easydict
[root@localhost py-faster-rcnn]# ./tools/demo.py
Traceback (most recent call last):
& File "./tools/demo.py", line 18, in
& & from fast_rcnn.test
import im_detect
"/root/zhanxiang/work/py-faster-rcnn/tools/../lib/fast_rcnn/test.py",
line 15, in
& & import cv2
ImportError: No module named cv2
缺少Python库cv2,这个是openCV里面的。那就来装openCV python库
yum install opencv-python.x86_64
[root@localhost py-faster-rcnn]# python tools/demo.py
Traceback (most recent call last):
& File "tools/demo.py", line 21, in
& & import
matplotlib.pyplot as plt
"/usr/lib64/python2.7/site-packages/matplotlib/pyplot.py", line 26,
& & from matplotlib.figure
import Figure, figaspect
"/usr/lib64/python2.7/site-packages/matplotlib/figure.py", line 36,
& & from matplotlib.axes
import Axes, SubplotBase, subplot_class_factory
"/usr/lib64/python2.7/site-packages/matplotlib/axes/__init__.py",
line 4, in
& & from ._subplots import
"/usr/lib64/python2.7/site-packages/matplotlib/axes/_subplots.py",
line 10, in
matplotlib.axes._axes import Axes
"/usr/lib64/python2.7/site-packages/matplotlib/axes/_axes.py", line
& & from matplotlib import
unpack_labeled_data
ImportError: cannot import name
unpack_labeled_data
看起来跟matplotlib库有关,pip
install的版本太旧,直接下载源码安装。
按照官网指示,
[root@localhost work]# git clone
git:///matplotlib/matplotlib.git
[root@localhost work]# cd matplotlib/
安装依赖包
[root@localhost matplotlib]# yum-builddep
python-matplotlib
[root@localhost matplotlib]# python setup.py install
[root@localhost py-faster-rcnn]# python tools/demo.py
Traceback (most recent call last):
& File "tools/demo.py", line 19, in
fast_rcnn.nms_wrapper import nms
"/root/zhanxiang/work/py-faster-rcnn/tools/../lib/fast_rcnn/nms_wrapper.py",
line 9, in
& & from nms.gpu_nms import
ImportError: No module named gpu_nms
修改nms_wrapper.py,改force_cpu
[root@localhost py-faster-rcnn]# vi
lib/fast_rcnn/nms_wrapper.py
nms (dets, thresh, force_cpu
[root@localhost py-faster-rcnn]# python
tools/demo.py --cpu
就能看到结果了
EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社区打造,为 RHEL
及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。装上了 EPEL,就像在 Fedora
上一样,可以通过 yum install
package-name,随意安装软件。主要是EPEL源上的rpm是最新的,有些新的rpm,其他repo不一定有。
进入download.fedoraproject.org,会自动选择最近的镜像。我就进入了中国科技大学的镜像,依次按下面的路径找到符合自己CentOS版本epel库的rpm文件,下载安装。
rpm -Uvh epel-release-7-6.noarch.rpm
[root@localhost work]# ls /etc/yum.repos.d/
CentOS-Base.repo&
CentOS-CR.repo&
CentOS-Debuginfo.repo&
CentOS-fasttrack.repo&
CentOS-Sources.repo&
CentOS-Vault.repo& epel.repo&
epel-testing.repo
还没结束,清空缓存,更新缓存,update所有安装包。
yum clean all
yum makecache
yum update
Centos 7 1503
caffe下载,CPU Only
安装epel repo
安装caffe要求的包,有的只有epel有
安装Python库Anaconda 2
Makefile里面改成LIBRARIES += satlas tatlas
#新版atlas已经不用这两个lib了:cblas atlas
Makefile.config
BLAS := atlas&
BLAS_LIB := /usr/lib64/atlas
ANACONDA_HOME := $(HOME)/anaconda2
CPU Only, GPU相关的注掉
在~/.bashrc下加LD_LIBRARY_PATH=/root/anaconda2/lib:/usr/lib64:/usr/lib64/atlas:LD_LIBRARY_PATH,然后source一下这个文件
会有一些anaconda lib文件和/usr/lib64/文件冲突,把anaconda的重命名掉
不能被心灵鸡汤忽悠,孩子的教育没有捷径,不可能一直玩啊玩,要抓大放小,看准主要方向(数学,英语,计算机),不下功夫不会有收获~
品味教育理念的变味鸡汤
本人写教育理念,文章被广泛盗版转载,引发各种评论。针对这些言论,被朋友转来一个心灵鸡汤泡饭的文章,对文章当中的一些观点,特别符合一些被洗脑的人群,这可以让你懂得什么叫做“下士闻道大笑之,不笑不足以为道”的感觉。而且还把其在读博士的学历彰显出来,以此证明自己。这里面充斥着三碗鸡汤,一个是快乐教育,以不学为快乐,但事实上能够通过刻苦努力取得成功才是最快乐的;其二是释放天性,而人的天性很多是恶的,天性是需要教育诱导和培养的;最后是学历无用,把文革的那一套话换了一个说法,在千百万的学渣中找出几个幸运儿来比较高学历的倒霉蛋,搞田忌赛马。下面就其有特点的言论,给大家讲一讲心灵鸡汤应当怎样品尝的。
(上图是六岁女儿最新的画作,她画画很有天分,但她哥哥就学不下去了,本来她去是打酱油的,结果超乎我们想象)
言论1:这是在培养智能机器人吧?将来会批量生产一堆会考试的机器人,但心理素质和人肉健康素质却比机器人弱一个宇宙等级的弱人类吗?创造力想象力决策力恰恰是被这么干掉的,结果就是:比不过有愉悦能力的普通人类,也比不过没有心理波动不用睡觉喝咖啡的机器人。”
刚刚阿法尔狗下棋赢了人类,是不是人类就不要职业棋手了?当年深蓝赢了国际象棋冠军,国际象棋一样普及。我们有了计算器,似乎不用心算笔算了,但事实上是你要有足够的创造力,必须有足够的知识积累和逻辑能力,这些内容都综合到人脑当中,再有逻辑分析串联起来,才会思考出深入的结果,你让一只猪再快乐,也不会有什么有价值的创造。而且对中国社会的崛起,工程能力冠绝全球是关键,这背后就是会解题不出错的所谓“应试”能力,现在我们的各种工程施工,都无法人工智能,更进一步的是人工智能研发所依靠的,是工程能力。讲几个身边的例子,玩4张扑克凑24点,为了成为高手,他把所有的24点的可能性组合全部背了下来;还有一个例子是一个校友怎样让北大美女成为老婆了,他让女孩到街上买新京报或北青报,给他看10分钟,你可以考其报纸当中任何内容,包括广告和所有出现的数据。最后就是有同学与老虎机较量,被赌场贴出照片,不许进入。做这些评论的人,连天才的样子都没有见过。这样的言论的逻辑,就是机器能够做的,孩子就不用训练,这让人想起古代就流传下来的笑话,傻秀才让人盖楼,他只要第三层,不让工匠从一层二层盖起。中国的哲学成为了纯文科,而西方的哲学是包含数学物理的纯理科,中国哲学影响下的各种思潮言论之逻辑经不起推敲,却有文学粉饰之美感,成为了社会的鸡汤。
(看看上图,孩子学了奥数,如何有了内心的小宇宙,连记忆单词,也是找规律的,这思维不是机器所能及。)
言论2:请不以为文章中的孩子是自己乐意上大量补习班的,他们就是快乐的。儿童的快乐跟成年人自由意志中的快乐体验是不同的,儿童的快乐源自天性和童真,文中这位父亲的两个孩子的表现不是儿童的快乐,而是被过早开发出来的成年社会的残酷竞争意识、从众心理,那是一种提前老化了的非常态。
快乐有高级低级的,如果是天性,穷奢极欲是天性,好吃好玩也是天性,人性是恶是善?性恶就不说了,就算是性善,也是“苟不教性乃迁”,为何我们会记住孔融让梨?这算老化的非常态不?而对补习班,众多的孩子是不愿意上的,这不是从众心理而是特立独行,基本的事实前提都没有了,却展开一大堆的分析,讲很多人爱听的内容,不是逻辑让人信服而是立场让人信服,因为众人是不爱学的为主,到底是谁在从众?鸡汤文字都有潜在的从众基础的。孩子的性情,在幼年的培养非常重要,我们孩子能够特别爱学习爱读书,这是要培养的,你读书读出乐趣了,就与为了某种目的死读书的书呆子有了本质的不同。中国讲孩子3岁看大7岁看老,孩子3-7岁的时间段特别关键,也就是我们中国儒家传统的孩子5岁(虚岁5岁实岁4岁)要进学,这是中华文明千年的历史经验,怎么是外来鸡汤就能够颠覆的?很多父母认为这是学龄前不够重视,结果孩子上学后不爱好学习,以后就是无尽的麻烦,这也就是说为何中国讲3岁看大7岁看老的原因。中国的传统教育思维,就是要在7岁之前通过学习的压力期,然后进入快乐学习。我们要知道的就是如果你学钢琴、小提琴,就会有一个特别的厌倦期,只有你通过了,才会体会音乐的美感,其实对其他课程的学习也是一样的,孩子学进去了,就有其思考带来的快乐。现在就是如学琴一样,让她最快速度度过厌倦期,钢琴要是你7岁不打不逼,17岁根本是逼不出来的。而逼过了,9岁就可以有乐趣,而且水平高过你17岁如衡水中学那样军事化苦学的,讲那苦学之痛,其实是你早不学的代价。
言论3:成功究竟是拼上清华北大就“人上人、天之骄子”,还是成功地成长为一个有能力寻找人生的幸福与意义同时又富有社会责任感、正义感的良善公民呢?
对这个论述,您知道有能力寻找人生幸福和意义,是多么高的门槛吗?你让没有财务自由为生计奔忙的人怎么想?若再有社会责任感,还要完全善良,这需要多强大的实力?而上顶级名校,是普通人积累实力最重要的途径,你还有啥好路子?天上掉馅饼和彩票式的小概率机会就别讲出来寒碜人了。能够上名校,让孩子未来成为有能力寻找人生的幸福与意义同时又富有社会责任感、正义感的良善公民的机会大大增加,是你成功的基础。学历不是你成功的充分条件也不是成功的必要条件,但却是成功最重要的条件之一,他极大的成数量级的提高了你成功的概率。
言论4:很多现在的应试教育“既得利益者”,即一部分高知父母们,只想着自己是通过高考“鲤鱼跳龙门”的,大概已经忘记了自己的童年是怎么过的了。
现在的扩招让不好好学习的人也能够考上大学,导致学历贬值,必须拼爹的社会现实,本身很有问题,其实世家子弟,能够立家传家久远的,需要严格学习训练,以前是先生打手板的,而我们都是小时候极为刻苦的学出来的。小学的时候就是妈妈督着早上7点不到起床晚上11点睡觉,这让我们当年小学毕业的语文就可以高考试卷拿高分,给我们中学留下充足的时间学习各种知识丰富自己终身受益,高考很轻松,是比北大清华录取线多几十分的概念。我们没有忘记,而是把经验用到了下一代身上,这叫做传承。现在的博士生的人数,都要相当于我们当年的一本校的招生了,博士生也叫高知也是缩水不少。一些成功家长,能够快乐不学而出头的,是在文革及其遗毒的大背景下,全社会被蛊惑和没有高考等途径,社会都不学留下的空间,当时谁苦学了,现在谁牛逼。这样的空间脱离了文革当年的历史环境,是不会再有了。孩子在记忆和思维训练阶段的苦读,到高中思考能力上来了,反而有时间和空间了。儿子的进程是今年考剑桥的KET,明年PET,后年FCE,考完,高中到大学英语不用读了,会省下多少时间思考和发展创造力?中国儒家传统,孩子5岁开读,只让死记硬背,严苛的打手板,到背完四书五经,才开讲,再到十多岁才开笔写文章。要的就是在幼年打开记忆力和计算力。我祖辈是公认的民国大师,他们都读过私塾,都会多门外语,最后成为大科学家,学部常委,后来学部委员就是大院士了。中国不出大师,恰恰是现在被鸡汤忽悠的教育思维有问题。
言论5:没有深入了解国外的大学生之所以拼命,是源自他们的内在动力,而美国式的儿童教育,却是以多运动多玩耍而不是应试技能培养为主的,这是保护孩子的好奇心、想象力、创造力而有意识地区分出来的阶段性培养任务策略;
我们在名校上大学,拼命更苦,同学出了国的感受是外国大学真轻松。现在扩招放水以后,大学生不学,反过来说外国的大学生刻苦了。而在中学,著名的私立中学的孩子们都特别辛苦,不亚于高考备战,才有爬藤一说。而多运动的背景,是对外扩张民族的特点,贵族是都要从军的,中国传统历来鄙视四肢发达头脑简单的。而外国人搞体育,对平民运动,恰恰是没有上顶级名校通过学历出头的爬藤能力后走体育明星的道路,就如我们的农村和普通人孩子,也有不少人希望苦练体育或者舞蹈等希望体育特招的人群。学习就其本质而言,对于绝大多数初学者就是艰苦的,正因此才能通过学习成就人的无法轻易实现的可能。中国与美国还有的差距,就是孩子必须学习中国的文化和外语,比外国孩子学习的需求多很多,如果孩子不苦学与外国孩子一样,是无法赶上他们的。如果以后中国崛起了,中国的孩子可以不学英语,而外国孩子必须学习汉语,马上我们的孩子童年就比他们快乐的多。这也是我们民族要崛起所必须付出的代价!
言论6:人类如果没有闲暇,创造力想象力是会锐减的,儿童更是,无论这些兴趣班是多么素质教育。无论艺术体育兴趣班还是文化课补习班,只要限定内容,儿童就进入“智能机器人”生产线了,批量生产的是高技能低决策力低想象力低自主性的空心人。
首先是说这个话的前提就有问题,就算他不知道头脑风暴激励法等做法,他也应当知道急中生智的成语吧?压力下创造力会爆发的。更进一步的是,而所谓的闲暇,也是相对的。你认为看书是负担,但有人看书是休闲,人与人不一样。能够把学习变成快乐,能够找到书中颜如玉的人,才有创造的可能,这些评论人本身把学习当作一种痛苦,就不是一个创造者,而是碌碌者。所以我们需要的就是如学习小提琴的厌倦期一样,要尽快的让孩子通过,体会到学习知识和逻辑思考的快乐,这个时候他们有闲暇和思考,才是创造。如果你学琴,不经历当初的枯燥,是体会不到音乐之美感,更谈不上音乐的创作!你什么都不会,怎么能够创作乐曲?这里更换了命题成立的环境,真理就变成鸡汤。中国的问题就是学渣办教育管教育,当初去学师范的是成绩不高的学生,结果就是这些人根本没有谁通过了奥数等学科的厌倦期,没有谁感到过思维的快乐和美感,终身都在奥数痛苦的回忆之中,然后就以小人之心度君子之腹了。现在我老婆也是在北大读过文科的研究生,但已经同时学也跟不上儿子的课程。孩子这个时候是思维最敏捷的,一定要把它打开,我当年这个年龄段也是对各种题目反应超过做物理教授的父母的。
(如上图,孩子的语文课是这样做游戏的,上课与玩耍是结合在一起的,高级课外班非屌丝所想象,这是儿子与名师小牛老师)
言论7:如果,他相信儿童时期需要自由玩耍的空间才能发展他们的创造力;如果,他相信穷什么也不能让孩子在时间上陷入贫困,那样扼杀他们的想象力;如果,他相信拼娃在于拼强健的体魄、高贵的人格、纯真的性格;如果,他相信花大钱提高语数英短期排名不如培养孩子的自学能力、探索能力;家长还会相信给孩子做的一切是为孩子铺路吗?
孩子完全没有目的的玩耍之空间和时间,在学龄前足够了,而好的课外班,课堂上创造出来玩中有学的机会是非常多的,孩子的奥数课可以玩着七巧板、魔方、各种积木等,好的教学方法非常重要,说这番话的人,显然是毛坦厂中学这样的高考工厂出身,对孩子的课外班怎样寓教于乐根本不知道,完全是凭着个人的想象来说现在孩子的教育成长。哪一个音乐大师是靠玩耍出来的?当初都有苦学厌学的阶段,练琴是极为枯燥的,为何对逻辑思考的训练,就不行了呢?!这里有人是双重标准的。等你有了专业音乐基础了,创作新曲的时候,确实是需要闲暇的。我们的经历是在5-7岁让孩子通过厌倦期,有了学习的兴趣,然后就是在文字、外语和逻辑能力上具备基础,然后就可以轻松闲暇了,我的成长,也是小学极为苦学,而高中可以快乐的思考各种问题,但中国很多地方这个是反过来的。
(如上图,你能够想象孩子的奥数课是这样的,让孩子动改锥拆卸玩具,学习玩具构造和空间的想象能力,与你们想的奥数是完全不同的,不是填鸭式的低成本教学)
言论8:所谓测评机构都是些什么地方啊,这位父亲竟然忍心让自己才五岁的女儿接受绞肉机般残忍的审视检阅,而无法由最了解最爱孩子的父亲母亲来为孩子作判断。
说这个话的人,肯定没有参与过孩子的各种测评,在测评当中,是各种小玩具让孩子玩耍表现的,测评人员在旁边观察,这如何成为绞肉机般的审视检阅,真的是能够臆想。我们可以从这言辞当中,可以知道的就是说这话的基本是学渣,就算是上了博士等,也是在数学等学科上的学渣,是扩招才有了上学机会。而这些人推崇的西方教育,也是要主张对孩子的测评,进行因材施教,对天才儿童,有特别的保护和教育机制,真正推动社会创造力的,是这些有天分的孩子。
言论9:测评机构不会告诉你,你的孩子很正常,数学能力有先天智力因素,还有年龄的阶段特质,拔苗助长只会害了孩子;测评机构不会告诉你,同时报N个奥数补习班,让孩子进入人工智能机器人般机械的运算训练,只会把活生生的人训练成为一台能够快速运算的机器;测评机构更加不会告诉你,儿童需要通过玩自己发明的游戏来发展想象力创造力,孩子和小伙伴之间,如果不会发明游戏了,基本上就是失去想象力的表现,这是兴趣班所提供不了的,兴趣班都是给定任务,规定路线的。
这里终于也承认奥数是需要天赋的了,如果孩子没有天赋,你逼他也无用,在培训班是否只能是变成机械,这个不是学渣所能想象的。奥数被妖魔化,其主要原因就是很多人,尤其是教育口管政策的一些人,自己当年根本学不好奥数,按照一个重要的心理定律,他们对自己能力所不及的事情,就要说不重要,这就是吃不到葡萄的狐狸要说葡萄酸。奥数不是英语、语文等学科,你花足够的精力就能够学好的,能够培养的快速运算的机器,考奥数也得不到高分,这才是为何三令五申的禁止,各个学校选拔学生还要偷摸的把变了型的奥数作为最重要的条件。这些说奥数无用的人,怎么不说背唐诗没有用?有几个人长大依靠会被唐诗可以就业和创造?但背好唐诗带来的文学素养对人生非常关键。同样的,奥数培养的逻辑思维能力,是一切创造力的基础,逻辑思维能力对人生太重要了。而好的培训机构,也找好的奥数苗子,根本不是你有钱就能够进入其超常班的,里面一样是严格的考试,测评的时候,也不是屌丝所想象的,他们会为了拉生意故意迎合你说话。
(上图是儿子一年级的时候学习二年级奥数,这不是笔记,是他学完一学期后复习时自己连画带总结的学习心得,自己总结当中还不忘幽默一下,这与一些妖魔化奥数人士口中的死记硬背人工智能等等,是何等的差距)
言论10:高考、进大学只是一个门槛,那些职场上的杰出表现者,却是远远高于这个门槛的——这种“高于”恰恰是通过寻找到应试不过载的合理比例从而腾出空间发展人生的其他能力而获得的。如果应试产业把这种空间堵死了,如果虎爸虎妈们错误地以为考上大学就是万事大吉,他们就必然会忽略高考以外的很多素质的培育。
大学只不过是门槛,这句话不错,但门槛都跨不进其他都免谈。大学更是一种门第,不同品牌的大学,门第的高低是不同的,想要跨越门第是非常困难的,就算你大学肄业,也要是比尔盖茨那样,到哈佛这样的学校主动当肄业生才有价值,普通学校的肄业是一地鸡毛!这里让人又想起当年流转的状元与落第秀才的两张名单了,学历无用论的毒草到处都是,在百万分之一的成功者里面,成功有特别的机遇如同彩票,人口基数大的低学历者看似很多,但在万分之的成功者里面,实力是主要因素,学习都搞不好的人,机会太少!不要说中国大变革时期的特殊性,因为那个时候很多天才是没有学习机会的,现在机会相对均等了,再没有以往的现象了。
言论11:这位海淀爸爸是当前社会中的“夹心层”,即,他既不是富得可以轻轻松松上国际学校,对高考用脚投票的那一类群体,也不是农村留守儿童的打工父母们那样的底层,对底层来说,也不存在这样的两难选择,他们连基本的教育往往也无法负担,无暇考虑什么课外兴趣班补习班。夹心层现象值得引起关注。未来的教育难题,底层困境主要依靠国家制度的教育投入和福利保障来改善,富裕阶层自然不必说,选择太多了,最为纠结最为挣扎的,恰恰就是教育观念不整全又陷入从众心理的夹心层,他们最有可能成为教育的观念竞争和急遽变革时代的牺牲品。
说这些话的人,基本都是夹心层,推己及人。他们最爱干的事情不是讲逻辑而是给人贴上标签,然后按照标签进行批驳体现他的优越感,这样就更可以看到自称博士说这话的奥数训练不足逻辑思维不灵的可悲。你说我说假话还可以,如果说没有能力上国际学校,则我原来的文章当中早已经说要话几十万了,这个钱多于留学和国际学校,所以他说话分析的本身,就是逻辑不严密的,逻辑能力不佳非常明显,这也是中国进一步崛起的障碍,带路党们是希望中国人的社会永远没有足够的逻辑思维能力的。至于个人经济能力,本人在9年前就因为匿名的帖子说身家过亿名门世家顶级大学毕业,被广州的媒体认为是编故事,联合央视发起浩大的声讨。当时与方舟子关系还不错,特让方舟子给证实了一下,记得这是唯一的一次方舟子不是打假而是证实的,现在央视的很多节目我也是嘉宾和专家了。我不说我们家的世家传承在学术界应当排第几,起码国家专门给我的祖辈出过纪念邮票,谁能够找出一些可以几代对比的?不是上不起国际学校,而是上国际学校是不得已的选择,现在海归已经成为了海待,以后问题会更严重。
中国的崛起,中国的核心大学的社会价值,是你花大钱留学买不来的,对这一点,井底蛙是看不到的。2016年总部设在伦敦的国际高等教育资讯机构QS公布第六版《QS世界大学学科排名》。中国内地大学自2015年9月创纪录地拥有30所世界一流大学后,本次更有98所大学的学科达到世界一流学科入选标准。有88所大学(内地58所、港澳台30所)的学科入选全球400强,仅次于有164所大学进入400强的美国,位列全球第二。清华大学有三项学科入选全球前10强(建筑、土木工程第8,材料第10)。北京大学有两项学科入选全球前10(现代语言第8,语言学第10)。中国7所大学的65个学科全球排名前50,其中北大26个,清华21个,上海交通大学9个,复旦大学4个,同济大学3个。按照这个排名,不但增长快,而且清华已经与常青藤学校相当了,再加上国内和民族的优势,肯定是中国人的首选。从中国的崛起,这个趋势会越来越明显,中国的核心大学的价值,会比你留学海外更有意义,因为你是要在华人圈发展的。
《长歌行》青青园中葵,朝露待日唏。 阳春布德泽,万物生光辉。常恐秋节至,焜黄华叶衰。
dma_alloc_coherent(dev,
size, &dma_handle, gfp);
dma_map_single(dev, addr, size,
direction);
dma_unmap_single(dev,
dma_handle, size, direction);
一致性DMA可以认为是“同步的”,就是DMA和CPU之间看到的物理内存是一致的。流式DMA则不然。
DMA操作和CPU之间的主要隔阂就是cache,因为一般来说DMA只操作物理内存,不会动cache,但CPU却首先看到的是L1
L2cache,所以设备驱动就需要调用正确的DMA函数来操作cache。拿网卡收发包为例,假如CPU发包给网卡,那CPU填好skb的数据之后,得先把cache里有关这个skb数据的行给刷到物理内存,否则网卡从物理内存拿到的数据不是真正所要的数据。反之,CPU把skb数据装配好DMA
descriptor的时候,得先invalid掉这个skb数据在cache里的行。这样DMA把收到的包填到物理内存后再中断告知CPU时,CPU就可以避免从cache拿到关于这个skb的老(脏)数据,而会从物理内存取包而重新建立数据cache。dma_map_single&dma_unmap_single做的就是这个事情,它会根据数据的方向来判断该是clean
cache还是incalid cache。
那么DMA描述符呢,DMA控制器和CPU都要对DMA描述符做频繁操作,当CPU和DMA需要频繁的操作一块内存区域的时候,一致性DMA映射就比较合适。所以DMA描述符特别适用于一致性DMA。当然,你也可以对DMA描述符用流式操作,但那样开销就比较大了。
顺便说一句,刷cache是比较耗时的,特别是刷的区域比较大的时候。现代的很多处理器,CPU和DMA控制器之间从硬件上就能保证cache一致性,如ARM的ACP功能,这样像dma_map_single只是返回物理地址,而dma_unmap_single什么都不做。极大的提高了系统性能。
今天花了整整一天时间查各种资料,终于搞清楚了怎么使用MNIST数据库。哈哈,MNIST,是不是高端洋气上档次?是不是不知道是什么东东?
MNIST是一个据说很出名的手写数字数据库,据说是美国中学生手写的数字,说实话大部分都写得挺丑的。。。Anyway,幸好能看得懂是哪个数字。现在课题是用CNN(卷积神经网络)识别这个数据库的数字。我想,CNN还真没懂,不过先搞清楚怎么读入数据库吧,不然空有理论无法实操。一般人会用MATLAB来做神经网络的东东,而我正是一个一般人。当然,非一般的人可能用python之类的高端平台,反正我是不会。。。
首先上搜索引擎,无论是百度还是google,搜“MNIST”第一个出来的肯定是
&没错,就是它!这个网页上面有四个压缩包的链接,下载下来吧少年!然后别忙着关掉这个网页,因为后面的读取数据还得依靠这个网页的说明。
下面用其中一个包t10k-images_idx3为例子,写代码说明如何使用这个数据库。
这是从上面下载的源码,赞一个!and再赞一个!
% Matlab_Read_t10k-images_idx3.m
% 用于读取MNIST数据集中t10k-images.idx3-ubyte文件并将其转换成bmp格式图片输出。
% 用法:运行程序,会弹出选择测试图片数据文件t10k-labels.idx1-ubyte路径的对话框和
% 选择保存测试图片路径的对话框,选择路径后程序自动运行完毕,期间进度条会显示处理进度。
图片以TestImage_00001.bmp~TestImage_10000.bmp的格式保存在指定路径,10000个文件占用空间39M。。
% 整个程序运行过程需几分钟时间。
% Written By DXY@HUST IPRAI
%读取训练图片数据文件
[FileName,PathName] =
uigetfile('*.*','选择测试图片数据文件t10k-images.idx3-ubyte');
TrainFile = fullfile(PathName,FileName);
fid = fopen(TrainFile,'r'); %fopen()是最核心的函数,导入文件,‘r’代表读入
a = fread(fid,16,'uint8');
%这里需要说明的是,包的前十六位是说明信息,从上面提到的那个网页可以看到具体那一位代表什么意义。所以a变量提取出这些信息,并记录下来,方便后面的建立矩阵等动作。
MagicNum = ((a(1)*256+a(2))*256+a(3))*256+a(4);
ImageNum = ((a(5)*256+a(6))*256+a(7))*256+a(8);
ImageRow = ((a(9)*256+a(10))*256+a(11))*256+a(12);
ImageCol = ((a(13)*256+a(14))*256+a(15))*256+a(16);
%从上面提到的网页可以理解这四句
if ((MagicNum~=2051)||(ImageNum~=10000))
& & error('不是 MNIST
t10k-images.idx3-ubyte 文件!');
& & fclose(fid);
end %排除选择错误的文件。
savedirectory = uigetdir('','选择测试图片路径:');
h_w = waitbar(0,'请稍候,处理中&&');
for i=1:ImageNum
fread(fid,ImageRow*ImageCol,'uint8'); &
%fread()也是核心的函数之一,b记录下了一副图的数据串。注意这里还是个串,是看不出任何端倪的。
& & c = reshape(b,[ImageRow
ImageCol]);
%亮点来了,reshape重新构成矩阵,终于把串转化过来了。众所周知图片就是矩阵,这里reshape出来的灰度矩阵就是该手写数字的矩阵了。
& & d = c';
%转置一下,因为c的数字是横着的。。。
& & e = 255-d;
%根据灰度理论,0是黑色,255是白色,为了弄成白底黑字就加入了e
& & e = uint8(e);
& & savepath =
fullfile(savedirectory,['TestImage_' num2str(i,'d') '.bmp']);
imwrite(e,savepath,'bmp'); %最后用imwrite写出图片
waitbar(i/ImageNum);
fclose(fid);
close(h_w);
在选择好的路径中,就有了一大堆MNIST的手写数字的图片。想弄哪个,就用imread()弄它!
有了这个,相信我的小题目很快有着落了,嘿嘿。
那么,第五篇,大概,就这样吧。。。
转载请标明出处:
&红色部分为linux源码,蓝色部分注意
在linux内核代码的includelinuxkernel.h文件中有如下代码:
#define container_of(ptr, type,
const typeof( ((type *)0)-&member ) *__mptr =
(type *)( (char *)__mptr - offsetof(type,member)
此段代码并不是返回某结构中某成员的入口地址,而是返回包含某成员的结构的入口地址。
1、const typeof( ((type
*)0)-&member ) *__mptr =
sizeof()是返回变量类型的的大小,typeof()作用是返回变量的类型。
在此处的0你可以不必理会,它可以是1,也可以是7,此句话相当于把0强制转化为指向type类型的指针,自然typeof( ((type
*)0)-&member
)就是返回type结构中member成员的类型,__mptr是一个指向与member的类型相同的指针,并把ptr赋值给__mptr。
2、(type *)( (char *)__mptr
- offsetof(type,member) );
①、offsetof(TYPE,MEMBER)宏是在includelinuxstddef.h文件中定义的,如下:
&&&#define
offsetof(TYPE, MEMBER) ((size_t) &((TYPE
*)0)-&MEMBER)
该宏用于求结构体中一个成员在该结构体中的偏移量。
在上面这段宏定义的代码中也有一段“(TYPE
*)0)”,在此处必须是0,不可以是其他的整型数。原因:把0作为地址的一个基值,你可以这样理解,把0替换成p,那么p就是指向TYPE结构的指针,只不过p所指向的结构体,被存储在0位置上,这样取成员变量MEMBER的地址,实际就是成员在该结构体中的偏移量。
②、__mptr在上一行代码被赋值为ptr,而ptr是一个实实在在的内存地址,这样减去member在type中的偏移量,就得到了包含‘ptr所指的成员’的结构体的入口地址。
举例:在linux内核代码的driversbaseplatform.c中有一段代码,如下:(为了理解,做了一个简单的修改:
把原struct device * dev改为struct
device * memdev)
static int
platform_match(struct device * memdev, struct device_driver *
&struct platform_device *pdev =
container_of(memdev, struct platform_device, dev);
...........
platform_device是linux中定义的一个结构体,此结构体有个成员变量为&struct
container_of(memdev, struct
platform_device, dev);函数就是把 *memdev 所在的类型为
platform_device的结构体变量的入口地址返回。
如有错误,请指点。
外语学习须知。四六级什么的并不能提高英语水平,纯英语语境多看多说才是王道!
暑假的时候,我跟开补习班的表弟说,你教孩子英语的话,千万不要让他们做选择题,表弟认为有一定道理,但是依然不能完全接受,今天又有朋友在网上问我这个问题。下面是我的回答:
首先,语言学习的本质不是完全理性的学习,而是更多的感性。我的专业是语言文学,常常需要各种文本分析,然而所有这些分析都只是针对语言的某一个角度,理性的分析能够帮助我理解从这个角度看到的问题,但是却无法掌握这个句子“是怎样形成的”。
事实上,人类的语言智能远远超出我们的想象,用理性的方法几乎没有能力解释“一个句子是如何形成的”。索绪尔认为语言是一个系统,也就是说,当人在说出任何一句话的时候,他都是在以整个语言系统作为参照系,说出一句普通的话,这个运算过程远远超出一道复杂的几何题,但是人脑却可以几乎不需要思索就说出来,这是习得的感性力量。
如果经常做选择题其实就是在伤害人的语言能力,因为选择题是一个理性的思考方法,他所使用的是逻辑(语法知识判断)和运筹学(揣摩出题人的想法),而不是真正的运用语言能力。
其次,语言学习跟一切习得技巧一样,最重要的是不断接触正确的好的东西,逐渐培养良好的感觉,但是做选择题却是在跟错误的东西打交道,一道选择题,有三个可能的答案都是错的,只有一个是对的。反复接触错误的案例,他的判断力就是建立在语法分析之上,而不是建立在正确的感性之上——说出正确的句子,阅读出正确的意思。
第三,做选择题会养成一个特别不良的习惯,使人不敢开口说话。事实上,即便是说母语,如果以书面典雅语言为标准,在口语中会出现大量的所谓“病句”。无论是英美人还是中国人都一样。这些病句作为口语表达,其实是无关紧要的,由于有特定语境的帮助,并不妨碍意思的表达。常常做选择题,会强化书面用语的所谓”对错“问题的严重性,使人总是担心说出语法不够正确的句子,破坏口语表达的自信。
考试的时候,采用选择题也许是一种无奈,但是学习过程中完全不应该使用选择题,弊大于利是非常明显的。
中国的大学外语系和老外校(中学)的外语教学中很少会在平时的学习中进行选择题训练,他们的效果无疑也是最好的。我现在想起来这一点就感到幸运,我们中学的老师几乎没有选择题的作业。但是我非常不能理解为什么普通中学不去学习他们的先进经验,一味用选择题来伤害孩子们的语言学习能力。
我的侄子刚刚上初中,对英语也感到发怵和厌学。我跟他说,平时老师布置的选择题练习作业不要做,ABCD随便乱填,节约下来的时间用来大声朗读,自然英语就学好了。果然,半年之后,他的英语成绩就突飞猛进,考试的选择题也是会做的,而且对于学外语也不再感到恐惧,甚至有兴趣。
其实,学会一门语言,如果不是要求达到莎士比亚或者李白的水平,而只是会听会说会读,并不需要任何天才,也无需苦读,只要不伤害他的学习能力,进行适当的训练,就可以做到。可惜,中国的孩子就是在日复一日的选择题和背单词中浪费了大好青春,事倍功半,想说恨你不容易。
下面是我几年前写的外语学习须知:
iozone介绍:&
iozone(www.iozone.org)是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能。
& 可以测试 Read, write, re-read,re-write, read
backwards, read strided, fread, fwrite, random read, pread,
& mmap, aio_read, aio_write
等等不同的模式下的硬盘的性能。
&&&测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存。会使数值非常不真实.
iozone常用的几个参数.
-a 全面测试,比如块大小它会自动加
-i N 用来选择测试项, 比如Read/Write/Random 比较常用的是0 1 2,可以指定成-i 0 -i 1
-i2.这些别的详细内容请查man
& 0=write/rewrite&
1=read/re-read
& 2=random-read/write
& 3=Read-backwards
& 4=Re-write-record
& 5=stride-read
& 6=fwrite/re-fwrite
& 7=fread/Re-fread
& 8=random mix
& 9=pwrite/Re-pwrite
& 10=pread/Re-pread
& 11=pwritev/Re-pwritev
& 12=preadv/Re-preadv
-r block size 指定一次写入/读出的块大小
-s file size 指定测试文件的大小
-f filename 指定测试文件的名字,完成后会自动删除(这个文件必须指定你要测试的那个硬盘中)
-F file1 file2... 指定多线程下测试的文件名
批量测试项:
-g -n 指定测试文件大小范围,最大测试文件为4G,可以这样写 -g 4G
-y -q 指定测试块的大小范围
下面是几个日志记录的参数.好象要输出成图象进行分析,需要指定-a的测试才能输出
-R 产生Excel到标准输出
-b 指定输出到指定文件上. 比如 -Rb ttt.xls
我的测试实例:
#./iozone -a -n 512m -g 4g -i 0 -i 1 -i 5 -f /mnt/iozone -Rb
./iozone.xls
注:进行全面测试.最小测试文件为512M直到测试到4G.测试read,write,和Strided
Read.测试的地方在mnt下。生成Excel的文件.
./iozone -i 0 -i 1 -f /iozone.tmpfile -Rab /test-iozone.xls -g
8G -n 4G -C
结果分析:
使用这条测试命令测试NAS后,我对下边产生的Execl文件中的一段表进行下解释,很简单的:
Writer Report
在Execl文件中的这段表,它说明了这个表单是关于write的测试结果,左侧一列是测试文件大小(Kbytes),
最上边一行是记录大小,中间数据是测试的传输速度。举例说明,比如表中的“5300”,意思是测试文件大小为
32M,以记录大小为4K来进行传输,它的传输速度为5300 Kbytes/s
关于各种测试的定义&
&&& Write:
测试向一个新文件写入的性能。当一个新文件被写入时,不仅仅是那些文件中的数据需要被存储,还包括那些用于定位数据存储在存储介质的具体位置的额外信息。这些额外信息被称作“元数据”。它包括目录信息,所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。拜这些额外信息所赐,Write的性能通常会比Re-write的性能低。
测试向一个已存在的文件写入的性能。当一个已存在的文件被写入时,所需工作量较少,因为此时元数据已经存在。Re-write的性能通常比Write的性能高。
测试读一个已存在的文件的性能。
测试读一个最近读过的文件的性能。Re-Read性能会高些,因为操作系统通常会缓存最近读过的文件数据。这个缓存可以被用于读以提高性能。
&&& Random
测试读一个文件中的随机偏移量的性能。许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。
&&& Random
测试写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。
&&& Random
测试读写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。这个测试只有在吞吐量测试模式下才能进行。每个线程/进程运行读或写测试。这种分布式读/写测试是基于round
robin 模式的。最好使用多于一个线程/进程执行此测试。
Backwards Read: 测试使用倒序读一个文件的性能。这种读文件方法可能看起来很可笑,事实上,有些应用确实这么干。MSC
Nastran是一个使用倒序读文件的应用程序的一个例子。它所读的文件都十分大(大小从G级别到T级别)。尽管许多操作系统使用一些特殊实现来优化顺序读文件的速度,很少有操作系统注意到并增强倒序读文件的性能。
&&& Record
测试写与覆盖写一个文件中的特定块的性能。这个块可能会发生一些很有趣的事。如果这个块足够小(比CPU数据缓存小),测出来的性能将会非常高。如果比CPU数据缓存大而比TLB小,测出来的是另一个阶段的性能。如果比此二者都大,但比操作系统缓存小,得到的性能又是一个阶段。若大到超过操作系统缓存,又是另一番结果。
&&& Strided
测试跳跃读一个文件的性能。举例如下:在0偏移量处读4Kbytes,然后间隔200Kbytes,读4Kbytes,再间隔200Kbytes,如此反复。此时的模式是读4Kbytes,间隔200Kbytes并重复这个模式。这又是一个典型的应用行为,文件中使用了数据结构并且访问这个数据结构的特定区域的应用程序常常这样做。
许多操作系统并没注意到这种行为或者针对这种类型的访问做一些优化。同样,这种访问行为也可能导致一些有趣的性能异常。一个例子是在一个数据片化的文件系统里,应用程序的跳跃导致某一个特定的磁盘成为性能瓶颈。
&&& Fwrite:
测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
这个测试是写一个新文件,所以元数据的写入也是要的。
Frewrite:测试调用库函数fwrite()来写文件的性能。这是一个执行缓存与阻塞写操作的库例程。缓存在用户空间之内。如果一个应用程序想要写很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
这个测试是写入一个已存在的文件,由于无元数据操作,测试的性能会高些。
Fread:测试调用库函数fread()来读文件的性能。这是一个执行缓存与阻塞读操作的库例程。缓存在用户空间之内。如果一个应用程序想要读很小的传输块,fwrite()函数中的缓存与阻塞I/O功能能通过减少实际操作系统调用并在操作系统调用时增加传输块的大小来增强应用程序的性能。
Freread: 这个测试与上面的fread
类似,除了在这个测试中被读文件是最近才刚被读过。这将导致更高的性能,因为操作系统缓存了文件数据。
几个特殊测试:
Mmap:许多操作系统支持mmap()的使用来映射一个文件到用户地址空间。映射之后,对内存的读写将同步到文件中去。这对一些希望将文件当作内存块来使用的应用程序来说很方便。一个例子是内存中的一块将同时作为一个文件保存在于文件系统中。
文件的语义和普通文件略有不同。如果发生了对内存的存储,并不是立即发生相应的文件I/O操作。使用MS_SYNC
和MS_ASYNC标志位的 msyc()函数调用将控制内存和文件的一致性。调用msync()
时将MS_SYNC置位将强制把内存里的内容写到文件中去并等待直到此操作完成才返回。而MS_ASYNC
置位则告诉操作系统使用异步机制将内存刷新到磁盘,这样应用程序可以直接返回而不用等待此操作的完成。
这个测试就是测量使用mmap()机制完成I/O的性能。
I/O: 许多操作系统支持的另外一种I/O机制是POSIX
标准的异步I/O。本程序使用POSIX标准异步I/O接口来完成此测试功能。
&&& 例如:
aio_write(), aio_read(), aio_error()。这个测试测量POSIX异步I/O机制的性能。
命令行参数:
接下来解释每个参数的用法。
Usage: iozone [-s filesize_Kb] [-r record_size_Kb ] [-f
[path]filename]
[-i test] [-E] [-p] [-a] [-A] [-z] [-Z] [-m] [-M] [-t
children] [-h] [-o]
[-l min_number_procs] [-u max_number_procs] [-v] [-R]
[-d microseconds] [-F path1 path2...] [-V pattern] [-j
[-T] [-C] [-B] [-D] [-G] [-I] [-H depth] [-k depth] [-U
mount_point]
[-S cache_size] [-O] [-K] [-L line_size] [-g
max_filesize_Kb]
[-n min_filesize_Kb] [-N] [-Q] [-P start_cpu] [-c] [-e] [-b
[-J milliseconds] [-X filename] [-Y filename] [-w] [-W]
[-y min_recordsize_Kb] [-q max_recordsize_Kb] [-+m
[-+u ] [ -+d ] [-+p percent_read] [-+r] [-+t ] [-+A #]
它们都是什么意思 ?
用来使用全自动模式。生成包括所有测试操作的报告,使用的块 大小从4k到16M,文件大小从64k到512M。
这种版本的自动模式提供更加全面的测试但是消耗更多时间。参数&a在文件不小于
&32MB时将自动停止使用低于64K的块
大小测试。这节省了许多时间。而参数&A
则告诉Iozone你不介意等待,即使在文件非常大时也希望进行小块 的测试。
注意: 不推荐在Iozone3.61版中使用这个参数。使用&az &i 0 &i 1替代。
-b filename
Iozone输出结果时将创建一个兼容Excel的二进制格式的文件。
使用mmap()文件。这将使用mmap()接口来创建并访问所有测试用的临时文件。一
些应用程序倾向于将文件当作内存的一块来看待。这些应用程序对文件执行mmap()
调用,然后就可以以读写内存的方式访问那个块来完成文件I/O。
计算时间时将close()包括进来。This is useful only if you suspect that
close() is
broken in the operating system currently under test.
对于NFS版本3测试而言这将会
很有用,同时它也能帮助我们识别nfs3_commit 是否正常工作。
显示吞吐量测试中每个客户传输的字节数。如果你的操作系统在文件I/O或进程管
理方面存在饥饿问题时这将派上用场。
穿过“壁垒”时微秒级的延迟。在吞吐量测试中所有线程或进程在执行测试前都必
须挂起在一道“壁垒”之前。通常来说,所有线程或进程在同一时间被释放。这个
参数允许在释放每个进程或线程之间有一定的延迟(微秒级)。Microsecond delay out of
barrier.& During the throughput tests all threads
or processes are
forced to a barrier before beginning the test.
对mmap文件使用msync(MS_ASYNC) 。这告诉操作系统在mmap空间的所有数据
需要被异步地写到磁盘上。
计算时间时将flush (fsync,fflush) 包括进来。
用来进行一些扩展的测试。只在一些平台上可用。使用pread 接口。
-f filename
用来指定测试时使用的临时文件的文件名。当使用unmount参数时这将很有用。测试时在每个测试之间进行unmount的话,测试使用的临时文件在一个可以被卸载的文件夹中是很有必要的。卸载当前工作目录是不可能的,因为Iozone进程运行于此。
-F filename filename filename …
指定吞吐量测试中每个临时文件的文件名。文件名的数量应该和指定的进程或线程
设置自动模式可使用的最大文件大小(Kbytes)。
对mmap文件使用msync(MS_SYNC)。这告诉操作系统在mmap空间的所有数据
需要被同步地写到磁盘上。
显示帮助。
使用POSIX异步I/O接口中的#号异步操作。Iozone使用POSIX 异步I/O接口,并使
用bcopy 从异步缓存拷贝回应用程序缓存。一些版本的MSC NASTRAN就是这么进
行I/O操作的。应用程序使用这一技术以便异步I/O可以在一个库中实现,而不需要
更改程序内模。
This technique is used by applications so that the async
I/O may be performed in a library and requires no changes to
the applications internal model.
用来指定运行哪个测试。 (0=write/rewrite, 1=read/re-read,
2=random-read/write
3=Read-backwards, 4=Re-write-record, 5=stride-read,
6=fwrite/re-fwrite, 7=fread/Re-fread,
8=random mix, 9=pwrite/Re-pwrite, 10=pread/Re-pread,
11=pwritev/Re-pwritev,
12=preadv/Re-preadv).&
总是需要先进行0号测试以便后面的测试有文件可以测试。
也支持使用-i # -i # -i # 以便可以进行多个测试。
对所有文件操作使用VxFS VX_DIRECT 。告诉VXFS 文件系统所有对文件的操作将跨
过缓存直接在磁盘上进行。
设置访问文件的跨度为 (# * 块 大小). Stride read测试将使用这个跨度来读块 。
-J # (毫秒级)
在每个I/O操作之前产生指定毫秒的计算延迟。看 -X 和-Y来获取控制计算延
迟的其他参数。
Use POSIX async I/O (no bcopy) with # async operations. Iozone
will use POSIX async
I/O and will not perform any extra bcopys. The buffers used by
Iozone will be handed to
the async I/O system call directly.
在普通测试时生成一些随机访问。
Set the lower limit on number of processes to run. When
running throughput tests this
option allows the user to specify the least number of
processes or threads to start. This
option should be used in conjunction with the -u option.
Set processor cache line size to value (in bytes). Tells
Iozone the processor cache line size.
This is used internally to help speed up the test.
Tells Iozone to use multiple buffers internally. Some
applications read into a single
buffer over and over. Others have an array of buffers. This
option allows both types of
applications to be simulated.& Iozone’s
default behavior is to re-use internal buffers.
This option allows one to override the default and to use
multiple internal buffers.
Iozone will call uname() and will put the string in the output
为自动模式设置最小文件大小(Kbytes)。
报告结果以毫秒每操作的方式显示。
写操作是同步写到磁盘的。 (O_SYNC). Iozone 会以O_SYNC
标志打开文件。这强制所有写操作完全写入磁盘后才返回测试。
报告结果以操作每秒的方式显示。
This purges the processor cache before each file operation.
Iozone will allocate another
internal buffer that is aligned to the same processor cache
boundary and is of a size that
matches the processor cache. It will zero fill this alternate
buffer before beginning each test.
This will purge the processor cache and allow one to see the
memory subsystem without
the acceleration due to the processor cache.
Bind processes/threads to processors, starting with this cpu
#. Only available on some
platforms. The first sub process or thread will begin on the
specified processor. Future processes or threads will be placed on
the next processor. Once the total number of cpus is exceeded then
future processes or threads will be placed in a round robin
设置自动模式下使用的最大块大小(Kbytes) 。也可以通过-q #k ( Kbytes) 或 -q #m (
Mbytes) 或 -q #g ( Gbytes)。设置最小块大小见 &y 。
Create offset/latency files. Iozone will create latency versus
offset data files that can be
imported with a graphics package and plotted. This is useful
for finding if certain offsets
have very high latencies. Such as the point where UFS will
allocate its first indirect block.
One can see from the data the impacts of the extent
allocations for extent based filesystems
with this option.
指定测试块 大小,K字节。也可以通过-r #k (Kbytes) 或 -r #m (Mbytes) 或 -r #g
生成Excel报告. Iozone将生成一个兼容Excel的标准输出报告。这个文件可以使用
&Microsoft
Excel打开,可以创建一个文件系统性能的图表。注意:3D图表是面向列
的。画图时你需要选择这项因为Excel默认处理面向行的数据。
指定测试文件大小,K字节。也可以通过-s #k (Kbytes) 或 -s #m (Mbytes) 或 -s #g
Set processor cache size to value (in Kbytes). This tells
Iozone the size of the processor cache.
It is used internally for buffer alignment and for the purge
functionality.
以吞吐量模式运行Iozone。这一选项允许用户指定测试时使用多少个线程或者进程。
吞吐量测试时使用POSIX线程。仅在兼容POSIX线程的平台上可用。
Set the upper limit on number of processes to run. When
running throughput tests this
option allows the user to specify the greatest number of
processes or threads to start.
This option should be used in conjunction with the -l
-U mountpoint
在测试之间卸载并重新挂载挂载点。这保证了缓存cache不包含任何测试过的文件。
显示Iozone的版本号。
Specify a pattern that is to be written to the temporary file
and validated for accuracy in
each of the read tests.
当临时文件使用完毕时不删除它们。把它们留在文件系统中。
读或写时锁文件。
关闭“stone-walling”. Stonewalling 是
Iozone内部使用的一种技术。它是在进行吞吐量测试时使用的。程序启动所有线程或进程然后将它们暂停在“壁垒”前。
一旦它们都做好准备工作,它们将被同时释放。当其中任何一个线程或进程完成工作,整个测试就终止了并计算到达这个点时所有I/O的吞吐量。这保证了整个测试进行时所有的进程和线程都是并行的。这个标志位允许取消
stonewalling并看看会发生什么。
-X filename
Use this file for write telemetry information. The file
contains& triplets of information:
Byte offset, size of transfer, compute delay in
milliseconds.& This option is useful if one
taken a system call trace of the application that is of
interest.& This allows Iozone to replicate the I/O
operations that this specific application generates and provide
benchmark results for this file behavior.& (if
column 1 contains # then the line is a comment)
设置自动模式下使用的最小块大小(Kbytes) 。也可以通过-y #k ( Kbytes) 或 -y #m (
Mbytes) 或 -y #g ( Gbytes)。设置最大块大小见 &y 。
-Y filename
Use this file for read telemetry information. The file
contains triplets of information:
Byte offset, size of transfer, compute delay in
milliseconds.& This option is useful if one
taken a system call trace of the application that is of
interest.& This allows Iozone to replicate the I/O
operations that this specific application generates and provide
benchmark results for this file behavior. (if column 1 contains #
then the line is a comment)
Used in conjunction with -a to test all possible record sizes.
Normally Iozone omits testing
of small record sizes for very large files when used in full
automatic mode.& This option forces
Iozone to include the small record sizes in the automatic
tests also.
启动混合 mmap I/O 和文件 I/O.
-+m filename
Use this file to obtain the configuration information of the
clients for cluster testing. The file contains one line for each
client. Each line has three fields. The fields are space delimited.
A # sign in column zero is a comment line. The first field is the
name of the client. The second field is the path, on the client,
for the working directory where Iozone will execute. The third
field is the path, on the client, for the executable Iozone.
To use this option one must be able to execute commands on the
clients without being challenged for a password. Iozone will start
remote execution by using “rsh”.
Enable CPU utilization mode.
启动诊断模式。在这一模式下每个字节都将被验证。这在怀疑I/O子系统出错时有用。
-+p& percent_read
Set the percentage of the thread/processes that will perform
random read testing. Only valid in throughput mode and with more
than 1 process/thread.
Enable O_RSYNC and O_SYNC for all I/O testing.
启动网络性能测试。需要 -+m
Enable madvise. 0 = normal, 1=random, 2=sequential,
3=dontneed, 4=willneed.
For use with options that activate mmap() file I/O. See:
第一部分 问题描述
在阅读2.6内核代码时经常出现likely()和unlikely()两个宏函数,下面来解释一下这两个宏函数的函数含义。
例如在Linux 2.6.38内核include/linux/compiler.h中,这两个宏的定义如下:
likely(x)&&&&__builtin_expect(!!(x),
#define unlikely(x)&
__builtin_expect(!!(x), 0)
____builtin_expect是gcc编译器(版本&=2.96)提供给程序员使用,目的是使得程序员可以把分支预测的信息提供给编译器,以降低因为指令跳转带来的分支下降,它的返回值就是它的第一个参数(这个参数必须是整数)传给它的值。
所以在linux2.6.38中,____builtin_expect的返回值就是x的值,所以:
if(likely(value))& 等价于
if(unlikely(value))等价于
这样我们在阅读代码时,就可以把if(likely(value)),if(unlikely(value))看做if(value),便于我们阅读代码。
下面我们来分析__builtin_expect()的机制,在gcc使用手册中有下面一则例子:
if (__builtin_expect (x, 0))
&&&&&&&&&&&
这段程序暗示我们,既然我们期望__builtin_expect (x,
0)返回值为0,那么我们不希望调用foo()函数。
第二部分 机制详解
__builtin_expect()是如何优化代码的呢?
它通过改变汇编指令的执行顺序,来充分利用处理器的流水线。为了达到这样的目的,它直接执行最有可能的分支指令,而尽可能的避免执行跳转指令(jmp),因为jmp指令会刷新CPU的流水线,而影响执行时间。
我们看下面的例子:
//example_likely.c
likely(x)&&&
__builtin_expect(!!(x), 1)
#define unlikely(x)&
__builtin_expect(!!(x), 0)
int main(int argc,char *argv[])
atoi (argv[1]);
(likely (a == 2))
printf ("%dn", a);
用下面的命令编译:
对应的汇编指令如下:
//example_unlikely.c
#define likely(x)&&&
__builtin_expect(!!(x), 1)
#define unlikely(x)&
__builtin_expect(!!(x), 0)
int main(int argc,char *argv[])
atoi (argv[1]);
(unlikely (a == 2))
printf ("%dn", a);
第三部分 总结
__builtin_expect()__builtin_expect()
(28)(30)(40)(3)(13)(6)(2)(8)(1)(11)(4)(3)(50)
国内 (16篇)
国外 (0篇)}

我要回帖

更多关于 kernel是啥 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信