打印到屏幕上导致切换到内核模式并在Unix中运行OS代码?

我正在学习testing是操作系统unix是我们的模型)。 我有以下问题:

以下哪两项不会导致用户的程序停止并切换到OS代码?

答:程序发现一个错误,并将其打印到屏幕上。

B.程序分配的内存将在稍后从磁盘读取。

好吧,我有答案,但是,我不知道他们有多好。 他们说答案是B.但是,B是什么时候用户使用malloc这是一个系统调用no? 分配内存不通过操作系统? 为什么打印到屏幕上应该需要操作系统呢?

谢谢你的帮助

在A中,用户程序负责检测错误并决定如何提供该信息。 但是,在大多数情况下,实际将字符呈现给显示设备或终端将涉及某个时刻的OS调用。

在B中,OS确实负责存储器管理,并且可能在某个时刻从操作系统请求存储器,或者操作系统可能必须提供磁盘交换。

所以答案可能是严格的。 但是A需要系统调用,而B 可能需要系统调用。

malloc不是系统调用 。 这只是一个功能。

当你调用malloc ,会检查它是否(内部)有足够的内存给你。 如果是这样,它只是返回地址 – 不需要陷入内核模式。 如果没有它,它会询问操作系统(确实是一个系统调用)。

根据打印的方式,这可能会或可能不会引起系统调用。 例如,如果您使用stdio ,则打印是用户缓冲的。 这意味着printf意味着复制到某个stdio缓冲区,而不需要任何实际的I / O。 但是 ,如果printf决定刷新,那么确实必须执行系统调用。

图表显示图层:程序,libc,内核

printf()malloc()调用调用C运行时库(libc)。 C运行时库是内核之上的一个层,最终可能根据情况调用内核。

内核通过brk() (扩展/缩小数据段)和mmap() (将内存页面映射到进程虚拟地址空间)提供了一些原始的内存分配。 Libc的malloc()内部管理从内核获得的内存,并尽量减少系统调用(除此之外,它还试图避免过多的碎片化,并试图在多线程程序上有良好的性能,所以必须做一些妥协)。

stdio输入/输出(通过*printf()/*scanf() )被缓冲,最后调用内核的write()/read()系统调用。 默认情况下, stderr (错误流)是无缓冲的或行缓冲的(ISO C§7.19.3¶7),因此可以立即看到错误。 stdinstdout是行缓冲或无缓冲的,除非可以确定它们未连接到交互式设备,以便交互式提示输入正常工作。 stdinstdout可以完全缓冲(块缓冲),如果它们指向一个磁盘文件或其他非交互式流。

这意味着只要输出'\n' (换行符)字符(除非使用setbuf()/setvbuf() ),默认情况下错误输出就会被保证。 正常输出还需要连接到终端或其他交互设备来提供保证。

答案是A.在检测到错误后处理错误由编程语言运行时和用户空间应用程序处理。 另一方面,mmap处理文件需要进入内核模式来分配必要的页面,并排队所有的磁盘IO。 所以B绝对不是正确的选择。