在 disksim_main.c 中会先调用 disksim_initialize_disksim_structure()
和 disksim_setup_disksim()
来初始化 disksim。然后调用 initFlash()
来初始化闪存。
下面主要介绍闪存的初始化过程。
ninitFlash()
函数主要分为两个步骤,首先是调用 nand_init()
初始化闪存基本信息,然后调用 FTL 的 init()
函数,初始化FTL。
disksim-3.0 with flashim 和前面的 disksim-4.0 with ssdmodel 在逻辑上基本相似,只是多了些 FTL 层的东西。和前面介绍的 disksim-4.0 with ssdmodel 一样,程序仍然是从 disksim_device.c
中的 device_event_arrive()
函数中进入到 ssd 模块的。
进入到 ssd 模块后首先进入的是 disksim_simpleflash.c 文件,这就类似于 disksim-4.0 with ssdmodel 中的 ssd.c 文件,他们实现的功能有很多是相同的。
最后在 simpleflash_get_acctime()
函数中调用 callFsim()
函数。callFsim()
函数以后的内容才是 flashsim 重点实现的部分。
flashsim 的源码目录下有个 ssd.conf
文件,对于 SSD 的一些参数可以在这个文件里面进行设置。还有一些默认的参数会在 ssd_config.cpp
文件中作为全局变量进行设置。
当需要模拟一个 SSD 时,首先需要调用 load_config()
, 这个函数会读取配置文件,将配置文件中的信息保存在一些全局变量中。
flashsim 模拟器是事件驱动型的。每一个请求对应一个事件(event对象)。event 对象会在闪存内部的各个器件之间相互传递,从而来模拟闪存处理IO请求。
前面介绍了,总线通道(bus channel)中的交叉操作。现在结合源码来了解下,flashsim 是如何来模拟总线占用的。
more >>在 SSD 的读写中,很多过程都需要占用总线,有效利用总线的空闲时间可以降低 SSD 的响应时间。如果交叉地进行读写操作,这样可以提高总线的利用效率。
每一个总线通道(bus channel)上连接一个 package 里的所有 die。每个总线通道都是独立和并行的,不同通道上的操作是互相不干扰的。
more >>关于 flashsim,现在有两个版本,一个是需要结合 disksim-3.0 一起使用的,一个是可以独立运行的。
关于与 disksim-3.0 结合使用的 flashsim,参见:http://cighao.com/2016/12/06/disksim-3.0-with-flashsim-source-analysis-01-how-to-install/
推荐:http://cighao.com/2016/12/06/disksim-3.0-with-flashsim-source-analysis-01-how-to-install/
即使不推荐,还是介绍下吧,接下来介绍的是在 github 开源的可以独立运行的那个 flashsim。
这个版本的 flashsim 是利用 C++ 开发的闪存模拟工具,同时还实现了几种不同的 FTL 算法。需要运行在 64 位的操作系统上。
more >>前面介绍了通过回溯法求解八皇后问题
但是当皇后的数量较多时,回溯法非常地耗时。所以提出了一种基于概率地随机放置皇后的方法。
每次都将8个皇后随机放在8行,如果满足条件就成功,否则全部重新放置,直到成功为止。
实验表明,这样地放置方法比回溯法更快。
还有一种优化就是对于一部分皇后随机放置,另一部分皇后采用回溯法放置,这样效果会更好。
more >>tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true