Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过许多不同的GCD队列访问硬盘是否安全?_Objective C_Cocoa_Grand Central Dispatch - Fatal编程技术网

Objective c 通过许多不同的GCD队列访问硬盘是否安全?

Objective c 通过许多不同的GCD队列访问硬盘是否安全?,objective-c,cocoa,grand-central-dispatch,Objective C,Cocoa,Grand Central Dispatch,安全吗?例如,如果我创建了一组不同的GCD队列,每个队列压缩(tar cvzf)一些文件,我是否做错了什么?硬盘会被销毁吗 或者系统是否正确地处理了这些事情?如果您处理了一些通常受IO限制的内容,例如tar,并在GCD中运行一组副本 它会运行得更慢,因为在一个IO绑定的任务中会投入更多的CPU,这意味着IO会更分散,同时会有更多的CPU 一次运行的任务不超过N,这是GCD的要点,因此如果少于10个线程,“10亿个队列条目”和“10个队列条目”将提供相同的结果 你的硬盘会好的 迪特里希的回答是正确

安全吗?例如,如果我创建了一组不同的GCD队列,每个队列压缩(tar cvzf)一些文件,我是否做错了什么?硬盘会被销毁吗


或者系统是否正确地处理了这些事情?

如果您处理了一些通常受IO限制的内容,例如
tar
,并在GCD中运行一组副本

  • 它会运行得更慢,因为在一个IO绑定的任务中会投入更多的CPU,这意味着IO会更分散,同时会有更多的CPU
  • 一次运行的任务不超过
    N
    ,这是GCD的要点,因此如果少于10个线程,“10亿个队列条目”和“10个队列条目”将提供相同的结果
  • 你的硬盘会好的

  • 迪特里希的回答是正确的,只留下一个细节(这是完全不明显的)

    如果您打算通过GCD剥离(比如)100个异步
    tar
    执行,您很快就会发现您的应用程序中运行了100个线程(由于严重滥用I/O子系统,这也会非常慢)

    在具有队列的完全异步并发系统中,无法知道特定的工作单元是否被阻塞,因为它正在等待系统资源或其他排队的工作单元。因此,任何时候任何阻塞,您都必须启动另一个线程并消耗另一个工作单元,否则就有可能锁定应用程序

    在这种情况下,“显而易见”的解决方案是,当一个工作单元阻塞时,先等待一段时间,然后再启动另一个线程,以解队列并处理另一个工作单元,希望第一个工作单元“解锁”并继续处理

    然而,这样做意味着任何在工作单元之间进行交互的异步并发系统(一种常见的情况)都将非常缓慢,以至于毫无用处


    更有效的方法是限制在任何时候都在全局异步队列中排队的工作单元的数量。GCD信号量使这变得非常容易;您有一个单一的串行队列,所有工作单元都将排队进入该队列。每次将工作单元出列时,都会增加信号量。每完成一个工作单元,就减少信号量。只要信号量低于某个最大值(例如,4),那么您就可以将一个新的工作单元排队。

    即使这个问题在5月份被问到,仍然值得注意的是,GCD现在在10.7(OS X Lion)的发行版中提供了I/O原语。请参阅dispatch_read和dispatch_io_create手册页,以获取有关如何使用新API进行高效I/O的示例。他们足够聪明,能够针对单个磁盘(或多个磁盘)正确地安排I/O,并知道实际I/O请求中可能存在或不存在多少并发性。

    我对苹果公司持保留态度,但我认为即使他们也可以编写一个没有硬盘破坏风险的API。不太正确;现实情况更加微妙,可能由于不明显的原因导致性能更差。如果不知道任何两个工作单元之间的所有依赖关系,GCD就无法知道排队的B是否需要完成当前阻塞的A。