可以使用挂起写、总写和总写字节数来优化写调度程序吗?



我想确认一下这个面试问题基本上是不可能的:

这个项目的目标是创建一个设备的实现即可以将文件写入到一个目录,然后再设计一个写入一组设备的调度系统。写调度程序系统应该包含一个名为writesscheduler的接口和至少两个具体实现。第一轮应该是公平的循环赛调度器,第二个应该是写调度器,它使用一些挂起写、总写和总写字节的组合以某种方式优化写操作。这个项目的所有代码应该是线程安全的。

给定一个未指定的接口,如何使用该数据优化调度程序?

上面写着"…以某种方式优化写".

因此,您尝试为优化的具体内容显然取决于您。就此而言,您尝试的优化是否高度(或根本)成功可能并不特别重要。

如果要我猜的话,我想他们可能最感兴趣的基本思想是,您可以定义一个抽象接口,然后编写该接口的几个实现,这些实现至少在某些半有意义的方式上有所不同(但仍然满足接口的规范)。

我推测,标记c++是一个错误?

好,回到主题:

我可以想象你提供给我们的接口是这样的

IDevice:此接口甚至可以为空接口

设备:

  • 必须实现IDevice接口,
  • 构造函数使用iwritesscheduler实例,
  • 对于下一个操作必须是线程安全的,
  • 方法打开(字符串路径),
  • 方法创建(字符串路径)
  • 方法读取(输出字节[]缓冲区,int attempt_read_n),
  • 方法写(in byte[] buffer),
  • 方法close (),
  • 设备将锁定所有的公共方法,
  • 所有方法都可能被阻塞,
现在IWriteScheduler:

  • 任务WriteAsync(device, int size, Action writing_task)
设备行为:

  • 正在写操作的设备将创建一个带有operation的操作将数据写入文件,
  • 调用iwritesscheduler的实例:IWriteScheduler。WriteAsync(this, 41561, action),然后等待,
  • 或者设备可以将任务返回给写操作的调用者,让它决定等待是否合适,
  • 就这些,

WriteScheduler:

  • 将实现iwritesscheduler,
  • 必须锁定WriteAsync操作,
  • 私有类DevicesData{IDevice, total_bytes, pending_writes, total_writes, tasklast_task}初始last_task必须是task_completed,可以在下面创建.net旧版本,
  • 必须实现字典,
  • 虚拟WriteAsync方法,默认实现为循环赛,这意味着在BlockingWrite方法中,调度器将更新根据字典关键字IDevice和使用的last_task正确的DeviceData基于ContinueWith,
  • 链接DeviceData以开始下一个
  • 简单的任务链将确保轮询调度,

其他调度方法,只需从writesscheduler继承,覆盖:

虚拟任务WriteAsync(device, int size, Action writing_task);

任务链允许甚至延迟写操作和更多的技巧。

对于基于pending_writes, total_writes和total_bytes的调度,有很多方法可以调度和构建特定的规则,这种数据结构可以处理:

  • 每秒可以有写,
  • 可以是字节/秒,
  • 这些可以帮助防止硬盘烧坏:),
  • 都可以通过插入任务来处理数据结构线程。睡什么会有效,但会很糟糕:),
  • 一个更好的延迟解决方案是Thread。DeviceData内部的定时器和一个写任务队列。

希望对大家有所帮助,我提供了接口实现的分析和调度场景的一些思路

/IP/

最新更新