如何模拟慢速 DVD 驱动器?

Posted

技术标签:

【中文标题】如何模拟慢速 DVD 驱动器?【英文标题】:How to simulate slow DVD drive? 【发布时间】:2014-08-28 02:18:29 【问题描述】:

有人知道模拟慢速 DVD 驱动器的任何可行方法吗?在已安装的 DMG/ISO 映像上?

目标是针对慢速驱动器进行编程,因此需要模拟。任何想法将不胜感激!

更新:同样,目标是模拟一个缓慢的 I/O 过程。不幸的是,像 Network Conditioner 或 Charles 这样的工具没有提供解决方案。涓流已过时,不再积极开发:(

【问题讨论】:

你为什么首先关心这个? 在第二句中解释。这种担忧值得否决吗? IMO,这是一个完全有效的请求。存在 Network Conditioner 或 Charles 等工具。 投反对票是因为没有努力或研究的迹象。你的第二句话没有解决我的担忧。为什么你的代码依赖于某个 I/O 吞吐量? 研究工作非常广泛。如果有人真的带着解决方案回来,我不会在这里发帖并坐等。如果我找到了解决方案,我就不会发布了!您无法想象软件完全通过可移动媒体运行的场景吗? @BrettHale 我正在尝试查看是否存在可以在不依赖光盘速度的情况下解决的隐藏问题。 【参考方案1】:

使用 hdiutil,您可以将磁盘映像挂载到特制的 HTTP 服务器上,但您无法控制操作系统缓存,并且 I/O 缓慢不会细化。我会建议两种非网络解决方案。

在 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

您可能想尝试为cat 使用高于 25 毫秒的值,例如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 而不是其他文件的 I/O。后一种情况可以通过捕获open(2) 来处理,但需要更多工作。

每次读取访问 25 毫秒足以使任何 AIR 应用程序明显变慢。当然,您应该根据需要调整此值。

使用较慢的文件系统

或者,您可以实现一个 Fuse 插件。如果您从 LoopbackFS(C 或 ObjC)开始,这尤其容易。

确实,您可以非常轻松地在readFileAtPath:userData:buffer:size:offset:error: 方法或loopback_read 函数中调用nanosleep(2)

【讨论】:

感谢您的帖子,Paul,我的工作水平不低,但我一定会检查的。再次感谢! DYLD_INSERT_LIBRARIES 解决方案不是那么低级。我确实详细说明了解决方案,因此您可以非常轻松地对其进行测试。它适用于我在磁盘上的一个虚拟 AIR 应用程序。 如果有人有兴趣,功能代码现在也在github.com/ain/libsnailio 这里的问题是它不会很不幸地工作,因为 dylib 仍然会影响 NetConnection 以便将 NetStream 建立到本地存储。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…【参考方案2】:

嗯,第一批 DVD 驱动器和播放器的读写速度是 of 1350 kB/s (or 1,32 MB/s);此速度通常称为“1×”,是您在任何 DVD 驱动器中可以找到的最慢速度。

USB 1.1 闪存驱动器有nominal speed of 12Mbps 或1,5MB/s, 实际速度非常接近 1x DVD 驱动器。

那么为什么不将映像复制到旧的 USB 1.1 闪存驱动器并从那里挂载呢?如果你没有,你可以在 eBay 上找到二手的。

我还应该提到,ADSL2 或 HSPA (3.5G) 等宽带互联网连接的实际下载速度约为 12Mbps,这正是您想要的。

【讨论】:

以上是关于如何模拟慢速 DVD 驱动器?的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何判断 DVD 驱动器托盘是不是打开?

在 C 中确定 OS X 中 DVD 驱动器的区域代码,而不要求 DVD 位于驱动器中

如何删除在System中打开的iso文件

如何删除在System中打开的iso文件

缺少所需的CD/DVD驱动器设备驱动程序

使用 Aimersoft DVD Ripper 在 Mac 上将家庭 DVD 转换为视频/音频?如何编辑 DVD 电影?