Questions tagged «io»

与系统之间的数据输入/输出。这通常意味着文件存储或网络通信,但也可能意味着通过用户界面与用户进行交互。

5
批评IO monad被视为在世界上运作的州monad
IOHaskell中的单子通常被解释为州是世界的州单子。因此,将IO amonad 类型的值视为worldState -> (a, worldState)。 前一段时间,我读了一篇文章(或博客/邮件列表帖子),该文章批评了这种观点,并提出了一些不正确的原因。但是我既不记得这篇文章,也不记得原因。有人知道吗 编辑:这篇文章似乎丢失了,所以让我们在这里开始收集各种参数。 我开始悬赏以使事情变得更有趣。 编辑:该文章中,我一直在寻找的应对尴尬的阵容:单子输入/输出,并发性,异常和外国语言的Haskell中调用由西蒙·佩顿-琼斯。(感谢TacTics的回答。)

6
为什么我们必须等待I / O?
众所周知,磁盘操作速度很慢,我们知道它们速度很慢的原因。所以这里的问题是为什么我们必须等待I / O或为什么会有IOWait之类的东西? 我的意思是我已经注意到,当您在后台执行一些I / O任务时,您的计算机基本上会变慢很多,我特别注意到,在使用Linux时,如果您要执行更长的I / O任务,直到操作系统完成,操作系统几乎变得无法使用。 确实,我也在文章中找到了这个主题,其中有一个摘要: I / O等待率为12.1%。该服务器具有8个核心(通过cat / proc / cpuinfo)。这非常接近(1/8核心= 0.125) 所以从根本上讲,这意味着它会降低计算机的运行速度,为什么?我的意思是,好的,现在普通计算机至少有2个核心,有时是4个,有时是由于超线程等而拥有更多。但是现在的问题是,为什么CPU实际上必须呆在那里,除了等待IO之外,实际上不做其他任何事情?我的意思是流程管理的基本思想或体系结构,现在我不知道是操作系统负责还是将其归结为硬件部分,但应该让CPU等待或执行定期检查,同时实际执行许多其他任务,并且仅在准备就绪时返回IO流程。确实,如果这是一项艰巨的任务,而CPU必须等待,那为什么呢?这样可以更有效地利用硬件进行管理吗?例如,可能会有某种小型cpu会等待它,并在返回到流程后立即将一小部分数据传递到实际cpu,因此该流程将重复进行,而我们不必几乎将整个cpu核心专用于数据复制过程...还是我应该发明这种东西并为此获得诺贝尔奖?:S 现在,好了,我真的是从观察者的角度出发,我确实还没有深入探讨这个话题,但是我真的不明白为什么cpu必须以HDD的速度工作,尽管它可能只是做其他事情,一旦准备好就回到硬盘。这个想法不是要加快需要IO操作或复制过程或其他操作的应用程序的速度,而是要在执行该操作时将CPU占用的影响降到最低,以便OS可以将其用于其他进程和用户。进行某些复制操作时不必感到一般的计算机延迟...
28 cpu  io  operations 

2
为什么在Python中不推荐使用通用换行模式?
我只是注意到文件操作的通用换行符功能似乎即将退出。 为Python 3.5的文档open的mode参数表明它弃用: 'U' 通用换行模式(不建议使用) 在open记录mode参数用法时,至少追溯到Python 3.2 包含类似的“仅向后兼容”警告: 'U' 通用换行模式(为了向后兼容;不应在新代码中使用) 即使在Python 2.7中,的文档中也有类似的警告io.open。 这是什么原因?
26 python  io  deprecation 

4
与将字符串连接在一起并一次调用相比,经常调用println()有多糟糕?
该问题是从Code Review Stack Exchange 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 5年前。 我知道输出到控制台是一项昂贵的操作。出于代码可读性的考虑,有时最好调用一个函数两次输出文本,而不是将一长串文本作为参数。 例如,效率降低多少 System.out.println("Good morning."); System.out.println("Please enter your name"); 与 System.out.println("Good morning.\nPlease enter your name"); 在该示例中,区别仅在于一个呼叫,println()如果更多,该怎么办? 与此相关的是,如果要打印的文本很长,则在查看源代码时,涉及打印文本的语句可能看起来很奇怪。假设文本本身不能简短,该怎么办?是否应该出现多次println()通话的情况?曾经有人告诉我,代码行不应超过80个字符(IIRC),那么您将如何处理 System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how …
23 java  c++  performance  c  io 

5
在什么时候异步读取磁盘I / O比同步更有效?
假设有一些代码可以读取多个使用者的文件,并且文件的大小是任意的:异步读取文件的效率如何提高?或者换一种说法,要同步读取文件,文件必须快到多小? 我注意到(也许我不正确),当读取非常小的文件时,异步读取它们比同步读取(尤其是.NET)需要更长的时间。我假设这与设置时间有关,例如I / O完成端口,线程等。 有什么经验法则可以帮助您吗?还是取决于系统和环境?
22 efficiency  async  io 

4
为什么我们必须提到C中变量的数据类型
通常在C语言中,我们必须在变量声明中告诉计算机数据的类型。例如,在下面的程序中,我要打印两个浮点数X和Y的总和。 #include<stdio.h> main() { float X=5.2; float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } 我不得不告诉编译器变量X的类型。 编译器不能自行确定其类型X吗? 是的,我可以这样做: #define X 5.2 现在,我可以编写程序而无需告诉编译器Xas 的类型: #include<stdio.h> #define X 5.2 main() { float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } 因此,我们看到C语言具有某种功能,通过它可以自行确定数据类型。就我而言,它确定X为float类型。 在main()中声明某些内容时,为什么还要提及数据类型?为何编译器无法main()像in中那样自行确定变量的数据类型#define。

2
DMA控制器如何工作?
摘自Andrew S. Tanenbaum(第5.1.4节,现代操作系统中的直接内存访问),Herbert Bos,2014年, 为了简化说明,我们假定CPU通过连接CPU,内存和I / O设备的单个系统总线访问所有设备和内存,如图5-4所示。 为了解释DMA的工作原理,让我们首先看一下不使用DMA时如何进行磁盘读取。 首先,磁盘控制器逐位从驱动器逐位顺序读取该块(一个或多个扇区),直到整个块都在控制器的内部缓冲区中为止。 接下来,它计算校验和以验证没有发生读取错误。然后,控制器引起中断。操作系统开始运行时,它可以通过执行循环从控制器缓冲区一次读取一个字节或一个字的磁盘块,每次迭代都从控制器设备寄存器中读取一个字节或一个字并将其存储在主存储器中。 问:在第二步中 数据不是从“控制器的缓冲区 ”传输到主存储器吗?为什么既说“ 来自控制器的缓冲区 ” 又说“ 来自控制器设备寄存器 ”? 在第二步中,控制器可以将数据从其缓冲区传输到主存储器,而不会中断cpu,也无需再次涉及OS吗? 使用DMA时,过程不同。 首先,CPU通过设置其寄存器来对DMA控制器进行编程,以使其知道在何处传输(图5-4中的步骤1)。 它还向磁盘控制器发出命令,告诉它将数据从磁盘读入其内部缓冲区并验证校验和。 当有效数据位于磁盘控制器的缓冲区中时,DMA可以开始。DMA控制器通过在总线上向磁盘控制器发出读取请求来启动传输(步骤2)。此读取请求看起来与其他任何读取请求一样,并且磁盘控制器不知道(或不在乎)它是来自CPU还是来自DMA控制器。通常,要写入的内存地址在总线的地址线上,因此,当磁盘控制器从其内部缓冲区中提取下一个字时,它便知道将其写入哪里。写入内存是另一个标准的总线周期(步骤3)。 写入完成后,磁盘控制器也会通过总线将确认信号发送到DMA控制器(步骤4)。然后,DMA控制器增加要使用的存储器地址,并减少字节数。如果字节计数仍大于0,则重复步骤2至4,直到计数达到0。 那时,DMA控制器中断CPU,以告知传输现在已完成。操作系统启动时,不必将磁盘块复制到内存;它已经在那里。 问:在第二步中,DMA控制器请求磁盘控制器将数据从磁盘控制器的缓冲区传输到主内存。第一步,CPU向磁盘控制器发出命令,告诉它将数据从磁盘读入其内部缓冲区。同时,当磁盘控制器完成将数据从磁盘传输到磁盘控制器的缓冲区时,CPU是否还可以告知磁盘控制器将数据从磁盘控制器的缓冲区传输到主内存,因此不需要DMA控制器告诉磁盘控制器将数据从磁盘控制器的缓冲区传输到主存储器?(我不明白为什么我们需要一个DMA控制器在磁盘和主内存之间进行数据传输,所以我想我错过了理解报价的重要内容)。 设备的设备控制器控制该设备并在该设备上执行操作。DMA控制器在什么设备上控制和执行操作? 谢谢!


2
准备就绪与完成异步IO内存使用情况?
我看这次谈话有关实现异步IO在锈和卡尔提到了两个潜在的车型。准备和完成。 准备模型: 您告诉内核您要从套接字读取 暂时做其他事情…… 内核会告诉您套接字准备就绪的时间 您阅读(填充缓冲区) 做你需要的一切 释放缓冲区(Rust自动发生) 完成模型: 您为内核分配缓冲区以填充 暂时做其他事情…… 内核会告诉您何时缓冲区已满 对数据做您需要做的一切 释放缓冲区 在使用准备模型的卡尔例如,你可以遍历准备插槽填充和释放一个全球性的缓冲,这使得它看起来像它会使用很多的内存更少。 现在我的假设是: 在底层(在内核空间中),当套接字被称为“就绪”时,数据已经存在。它已通过网络(或从任何地方)插入套接字,并且OS保留了数据。 这似乎并没有在准备模型中神奇地发生内存分配。只是操作系统正在从您那里提取它。在完成模型中,操作系统要求您在数据实际流入之前分配内存,这很明显正在发生。 这是我对“就绪模型”的修订版: 您告诉内核您要从套接字读取 暂时做其他事情…… 修订:数据进入操作系统(内核内存中的某个位置) 内核告诉您套接字已准备好 阅读(填充另一个与上述内核缓冲区分开的缓冲区(或者得到指向它的指针?)) 做你需要的一切 释放缓冲区(Rust自动发生) /我的假设 我碰巧喜欢将用户空间程序保持在很小的位置,但是我只是想澄清一下实际情况。我看不到一个模型会固有地使用更少的内存或支持更高级别的并发IO。我很想听听对此的想法和更深入的解释。
12 async  io 

7
如何将TDD应用于读/写功能?
好像是鸡和鸡蛋的问题。 您可以使写入功能写入某些数据存储,但是在没有经过测试的读取功能的情况下,永远不会知道您是否正确保存了它。 您可以使读取功能从数据存储中读取,但是如何在没有经过测试的写入功能的情况下将东西放入该数据存储中以进行读取呢? 编辑: 我正在连接到SQL数据库并与之进行事务,以保存和加载要使用的对象。测试数据库提供的访问功能毫无意义,但是我包装了这些数据库功能以对对象进行序列化/反序列化。我想确保我正在正确地从数据库中写入和读取正确的内容。 它不像@snowman提到的添加/删除。我想知道我写的内容是正确的,但这需要经过良好测试的读取功能。当我阅读时,我想确保我的阅读正确地创建了一个与所写内容相等的对象。但这需要经过良好测试的写入功能。
10 tdd  io 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.