有谁知道模拟慢速 DVD 驱动器的任何可行方法,例如通过安装的 DMG/ISO 映像?
目标是针对慢速驱动器进行编程,因此需要模拟。任何想法将不胜感激!
更新:同样,目标是模拟一个缓慢的 I/O 过程。不幸的是,像 Network Conditioner 或 Charles 这样的工具没有提供解决方案。涓涓细流已过时,不再积极开发:(
有谁知道模拟慢速 DVD 驱动器的任何可行方法,例如通过安装的 DMG/ISO 映像?
目标是针对慢速驱动器进行编程,因此需要模拟。任何想法将不胜感激!
更新:同样,目标是模拟一个缓慢的 I/O 过程。不幸的是,像 Network Conditioner 或 Charles 这样的工具没有提供解决方案。涓涓细流已过时,不再积极开发:(
使用 hdiutil,您可以在特制的 HTTP 服务器上挂载磁盘映像,但您无法控制操作系统缓存,并且 I/O 缓慢不会细粒度。我会建议两种非网络解决方案。
您可以减慢 I/O 系统调用,例如通过DYLD_INSERT_LIBRARIES
. 这种方法很简单,这是我首先要尝试的。
您只需创建一个包含以下实现read(2)
的库pread(2)
:
/* slow.c */
#define SLEEP_TIMESPEC {0, 25000000} // 25ms
ssize_t
read(int fildes, void *buf, size_t nbyte) {
struct timespec s = SLEEP_TIMESPEC;
(void) nanosleep(&s, NULL);
return (ssize_t) syscall(SYS_read, fildes, buf, nbyte);
}
ssize_t
pread(int d, void *buf, size_t nbyte, off_t offset) {
struct timespec s = SLEEP_TIMESPEC;
(void) nanosleep(&s, NULL);
return (ssize_t) syscall(SYS_pread, d, buf, nbyte, offset);
}
您可能还需要实施readv(2)
. 您只需将此 C 代码编译为共享库并设置DYLD_INSERT_LIBRARIES
为在运行程序之前加载此库。您可能还需要定义DYLD_FORCE_FLAT_NAMESPACE
. 见dyld(1)
。
clang -arch i386 -arch x86_64 -shared -Wall slow.c -o slow.dylib
(该库是通用编译的,因为我在磁盘上的 AIR 应用程序实际上是 i386,而不是 x86_64)。
要测试库,只需执行以下操作:
env DYLD_INSERT_LIBRARIES=slow.dylib DYLD_FORCE_FLAT_NAMESPACE=1 cat slow.c
您可能想尝试使用高于 25ms 的值cat
,例如 1 秒,它可以内联为{1, 0}
. 同样,您应该从命令行启动您的应用程序:
env DYLD_INSERT_LIBRARIES=slow.dylib DYLD_FORCE_FLAT_NAMESPACE=1 path/to/YourApp.app/Contents/MacOS/YourApp
这将减慢每次读取调用(甚至通过更高级别的 API)。但是,某些读取操作不会受到影响(例如mmap(2)
),您可能希望减慢某些文件的 I/O 速度,而不是其他文件的速度。后一种情况可以通过陷印来处理,open(2)
但需要更多的工作。
每次读取访问 25 毫秒足以使任何 AIR 应用程序明显变慢。当然,您应该根据需要调整此值。
或者,您可以实现一个 Fuse 插件。如果您从 LoopbackFS(C或ObjC)开始,这尤其容易。
实际上,您可以非常轻松地调用nanosleep(2)
方法readFileAtPath:userData:buffer:size:offset:error:
或loopback_read
函数。
好吧,第一批 DVD 驱动器和播放器的读写速度为1350 kB/s(或 1.32 MB/s);此速度通常称为“1×”,是您在任何 DVD 驱动器中可以找到的最慢速度。
USB 1.1 闪存驱动器的标称速度为 12Mbps或1.5MB/s,实际速度非常接近 1x DVD 驱动器。
那么为什么不将映像复制到旧的 USB 1.1 闪存驱动器并从那里挂载呢?如果你没有,你可以在 eBay 上找到二手的。
我还应该提到,像 ADSL2 或 HSPA (3.5G) 这样的宽带互联网连接的实际下载速度约为 12Mbps,这正是您想要的。