阅读《深入理解计算机系统(第三版)》产生的一些疑惑和困惑
最近,我快速地阅读了《深入理解计算机系统(第三版)》,在被计算机的强大功能和灵巧设计所折服的同时,也产生了以下疑问与困惑,期望在以后的学习中能够一一释惑。
问题1:操作系统之间利用网络通信,但同一台系统可能由于用户的移动而不会处在一个固定的网络环境中,当系统的位置发生改变时,为什么还能及时又准确地接收到别人发送给自己的信息?
问题2:就C语言而言,包含了多种控制指令、数据类型、运算符以及其它各类符号,系统在编译时是如何区分并执行的?
问题3:在X86-64中,就long double而言,虽然只用了10个字节,却采用了16字节对齐,在提高存储器性能的同时,是否也会造成存储资源的浪费?
问题4:在一个计算机系统中,负责实现各进程作用的程序代码都是被顺序逐条调用运行的,而在流水线操作中如何能够实现多进程的同时调用?
问题5:众所周知,程序最终的功能实现离不开硬件的运行,同理,在程序性能优化的过程中所采用的方法是否也会因硬件结构与性能的区别而产生差异?
问题6:随着科技的发展,目前已经生产出了多种不同结构和性能的存储设备,就光读写速率而言,可能不同类型、亦或是同一类型的不同厂家生产的存储产品之间可能存在着很大的读写速率差异,在这种情况下,CPU如何进行不同存储设备之间的一一识别和速率匹配?
问题7:以C语言为例,几乎每个程序设计都包含标准输入输出函数库,而在其后程序各功能的实现中可能只用了其中少量的几个函数,在该情况下,编译链接过程中是一次性全部调用该标准库中的所有函数还是根据函数功能反复调用该库中的具体单个功能函数?链接器能否根据不同的程序设计和使用环境在两者之间做出较为智能的选择和转换?
问题8:在一个进程功能的最值实现,离不开硬件和软件程序的共同作用,如果在此期间发生进程异常,如何确认是硬件异常还是软件异常?两者的异常处理分别由谁来完成?
问题9:在使用分块式内存分配的过程中,久而久之,就会产生许多空闲的内存碎片,大大降低了内存的使用率,在现行技术能否有克服这一问题的办法?
问题10:正如课本中原文所言,当对网络输入输出使用标准IO流时,存在以下两个无法克服的限制:一,跟在输出函数之后的输入函数;二,跟在输入函数之后的输出函数。从而建议在网络套接字上使用RIO函数,而RIO函数和标准的IO函数在实现的过程中之间的区别在什么地方?这些区别能否使用于标准IO函数在该问题上的完善?
问题11:网络上的两台主机之间进行通信时,发送方会主动向服务器发起连接请求,但就接收方而言,服务器是如何准确地判断出其所处的网络位置并建立连接的?
问题12:并行编程并不总是提高程序的执行性能,当线程数量较多的时候,线程间频繁的调度切换反而会让系统的整体性能下降。从而在实际的工程设计时,有没有具体的测试手段和工具在两者之间做出权衡?