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

时间:2015-09-23 01:16:05

标签: c# c++ .net io

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

  

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

鉴于未指定的接口,如何仅使用该数据优化调度程序?

2 个答案:

答案 0 :(得分:1)

它说“......以某种方式优化写入 ”。

因此,您尝试优化 的内容显然非常适合您。就此而言,您尝试的优化高度(或根本没有)成功可能甚至不是特别重要。

如果我不得不猜测,我会说他们可能最基本的想法是你可以定义一个抽象的接口,然后编写一些不同的接口,至少有一些半有意义的方式(但仍符合界面规范)。

答案 1 :(得分:1)

我认为标签c ++是个错误?

好的,主题:

我可以想象一下您提供给我们的界面......

IDevice:这个界面甚至可以是空接口

设备:

  • 必须实现IDevice接口,
  • 构造函数使用IWriteScheduler instannce,
  • 必须是下一个操作的线程安全,
  • 方法打开(字符串路径),
  • 方法create(字符串路径),
  • 方法read(out byte [] buffer,int attempt_read_n),
  • 方法write(在byte []缓冲区中),
  • 方法close(),
  • 设备将锁定所有公共方法,
  • 所有方法都可能会阻止,

现在IWriteScheduler:

  • 任务WriteAsync(IDevice device,int size,Action writing_task)

设备行为:

  • 写入操作中的设备将创建具有操作的操作 将数据写入文件,
  • 调用IWriteScheduler的实例: IWriteScheduler.WriteAsync(this,41561,action)然后等待它,
  • 或者设备可以将Task返回给Write操作的调用者, 让它决定是否合适,
  • 就是这样,

WriteScheduler:

  • 将实现IWriteScheduler,
  • 必须锁定WriteAsync操作,
  • 私有类DevicesData {IDevice,total_bytes,pending_writes,total_writes,Task last_task} 初始last_task必须是task_completed,可以在下创建 旧的.net版本,
  • 必须实现字典,
  • 虚拟WriteAsync方法,默认实现方式 循环赛, 这意味着在BlockingWrite方法中,调度程序会更新 基于字典键IDevice更正DeviceData并使用last_task DeviceData通过基于ContinueWith链接来启动下一个,
  • 简单的任务链接将确保循环调度,

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

虚拟任务WriteAsync(IDevice设备,int size,Action writing_task);

任务链接允许在写入操作和更多技巧上产生延迟。

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

  • 每秒可能有写入,
  • 每秒可能有字节数,
  • 这些可以帮助防止硬盘烧坏:),
  • 可以通过插入任务来处理数据结构 thread.sleep什么会起作用,但会很糟糕:),
  • 更好的延迟解决方案是DeviceData内的Thread.Timer 以及写作任务的队列。

我希望它有用,我提供了有关界面实施的分析以及调度方案的一些想法......

<强> / IP /