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

问题描述

| 我正在为OS学习测试(unix是我们的模型)。 我有以下问题: 以下2项中的哪一项不会导致用户程序停止并切换到OS代码?   A.程序发现错误,并且是   将其打印到屏幕上。      B.程序分配的内存   将稍后从磁盘读取。 好吧,我有答案,但是,我不确定它们有多好。 他们说答案是B。 但是,B是用户使用“ 0”时的系统调用号吗?分配内存不会通过操作系统? 为什么要在屏幕上打印需要操作系统? 谢谢你的帮助     

解决方法

        在A中,用户程序负责检测错误并确定如何提供该信息。但是,在大多数情况下,实际上将字符渲染到显示设备或终端有时会涉及OS调用。 在B中,操作系统肯定负责内存管理,并且分配可能会在某个时候向操作系统请求内存,或者操作系统可能必须提供磁盘交换。 因此答案可能严格来说都不是。但是A将需要系统调用,而B可能需要系统调用。     ,        
malloc
不是系统调用。这只是一个功能。 当您呼叫ѭ0时,它将检查它(内部)是否有足够的内存给您。如果是这样,它将仅返回地址-无需陷入内核模式。如果没有,它将询问操作系统(实际上是系统调用)。 根据完成打印的方式,是否也可能引发系统调用。例如,如果您使用
stdio
,则打印由用户缓冲。这就是说
printf
意味着复制到某个copy3 copy缓冲区而没有任何实际的I / O。但是,如果
printf
决定刷新,则实际上必须执行系统调用。     ,        
printf()
malloc()
调用调用C运行时库(libc)。 C运行时库是内核之上的一层,并且可能最终会根据情况最终调用内核。 内核通过ѭ9(扩展/缩小数据段)和ѭ10(将内存页面映射到进程虚拟地址空间)提供了一些原始的内存分配。 Libc的
malloc()
内部管理它从内核获取的内存,并尝试最小化系统调用(除其他事项外,它还试图避免过多的碎片,并尝试在多线程程序上具有良好的性能,因此必须一些妥协)。
stdio
输入/输出(通过
*printf()/*scanf()
)被缓冲,最终调用内核的
write()/read()
系统调用。默认情况下,
stderr
(错误流)是未缓冲的或行缓冲的(ISO C§7.19.3¶7),因此可以立即看到错误。
stdin
stdout
是行缓冲的或未缓冲的,除非可以确定它们未附加到交互式设备上,这样交互式输入提示才能正常工作。如果
stdin
stdout
引用磁盘文件或其他非交互式流,则可以完全缓冲(块缓冲)。 这意味着默认情况下,在您输出
\'\\n\'
(换行符)字符时,默认情况下会保证看到错误输出(除非您使用
setbuf()/setvbuf()
)。正常输出还需要连接到终端或其他交互式设备以提供保证。     ,        答案是A。检测到错误后的处理由编程语言运行时和用户空间应用程序处理。另一方面,映射文件需要进入内核模式以分配必要的页面并使所有磁盘IO排队。因此,B绝对不是正确的选择。