gpt4 book ai didi

macos - 如何模拟慢速DVD驱动器?

转载 作者:行者123 更新时间:2023-12-04 04:17:10 24 4
gpt4 key购买 nike

有谁知道模拟慢速DVD驱动器的任何可行方法,例如在已安装的DMG/ISO镜像上?

目的是针对慢速驱动进行编程,从而满足仿真要求。任何想法将不胜感激!

更新:再次,目标是模拟一个缓慢的I/O过程。不幸的是,诸如Network Conditioner或Charles之类的工具无法提供解决方案。 le流已经过时,不再积极发展了:(

最佳答案

使用hdiutil,您可以在特制的HTTP服务器上挂载磁盘镜像,但是您无法控制OS缓存,因此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的值大于25ms的值,例如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( CObjC)开始,这特别容易。

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

关于macos - 如何模拟慢速DVD驱动器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613314/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com