jessonyue / computer-basics Goto Github PK
View Code? Open in Web Editor NEW💎🔥计算机基础理论知识总结、计算机专业经典书籍读书笔记
💎🔥计算机基础理论知识总结、计算机专业经典书籍读书笔记
430页这里写的1读地址0的字,还勉强理解,到了下面的读取地址1,13,8,0这里说的缓存命中看不明白。
我的疑问,
1缓存是否有效和是否命中有关系吗?无效就一定不命中吗?
2这里的有效位标记位分别啥意思?命中是简单的是否存在的意思吗?
3书上的这个事例是否需要参考上面的表6-30?
在x86-64上,当函数传递整型参数大于6个,多出的部分会存放在函数在栈帧分配的空间上,通过栈传递的参数,所有数据大小都向8的倍数对齐。
问题1:这6个整型的6是固定的吗,还是不同的处理器上是不同的?
问题2:数据的大小向8的倍数对齐,如果参数里最大的数据占用8个字节,那么其他也是占用8个字节吗?如果最大的数据占用16字节,是否其他也需要统一的保持一致16字节,又或者说只是8的倍数即可,无需所有参数都是统一大小?
第三章中,对于过程调用,是入栈出栈的过程;那这里是否支持多线程同时使用一个栈呢?还是说这个栈是线程独有的?多线程同时操作一个内存,怎么保证线程安全?
在书的8.2.4 用户模式和内核模式中提到当设置模式位的时候,进程享有内核模式,如果没有设置,则为用户模式。那么这两个模式在Linux下会共存吗?
在 Android 系统中存在 gid(group id) 和 uid(user id)用来管理权限,感觉这两个和书中提到的内核模式和用户模式有相通的地方,但好像就有不太一样,那这两对概念有什么相同点和不同点,可以混为一谈吗?
文中提出乘法需要大于等于10个时间周期,那么这里面的时间周期是什么?网上查的话是cpu频率的倒数、单片机的最小时间单位是这个么?为什么说乘法要10个以上除法要30个不太明白怎么来的。。。
文中举例 x*14 编译器重写成(x <<3)+(x<<2)+(x<<1),那么是不是编译器就没有乘法或除法就都是变换成位移和加减法?
C语言中TMin32 要写成-2147483647-1,而不是-2147483648,为什么?
并在文中提到,寄存器中的在不同层级之间传递数据也是依靠这个东西。
通过文中描述,是通过内置缓存中的内置逻辑进行管理的。
但是在查阅资料后,并没有得到,内置逻辑是如何将值在内存中是如何传递的,并且,依然不理解,是如何划分寄存器的层级划分的。
缺页异常处理器会选择一个牺牲页,这个牺牲页的作用不是太明白。我的理解是缺页时从磁盘拷贝到内存时发现没有空余的页了,然后覆盖一个页数据。这个页就是牺牲页?
虚拟地址空间是什么意思?32位字长限制虚拟地址空间为4GB,这个“虚拟地址空间”是不是我们说的内存条,理解为"32位计算机运行内存最大限制为4GB"是否正确?
java编程**中,"倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方"
我的问题是:
引用变量是栈内存开辟空间,创建对象是在堆内存开辟空间,那么对象中的属性,是引用变量,那么创建对象的时候,对象中的属性(引用变量)是怎么存储的,它会存储在哪里?
学科:《深入理解计算机系统》
类型:知识理解
内容:
第七章 477页 gcc -static 为什么要static 书上解释 -static 参数告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件,它可以加载到内存并运行,在加载时无须更进一步的链.
个人理解: 假如我调用了printf, printf这个函数也会打入可执行文件中.
静态链接时把整个可重定位文件打到可执行文件中,还是只打调用了的
3.第七章,7.12 489页 位置无关代码
书上写: 现代系统以这样一种方式编译共享模块的代码段,使得可以把它们
加载到内存的任何位置而无需链接器修改。使用这种方法,无限多个进程可以共享一个共
享模块的代码段的单一副本。(当然,每个进程仍然会有它自己的读/写数据块。)
个人理解: 那意思是这个进程加载了so库在其他进程也能用吗,如果是这样 我这个进程修改了so的里面的全局变量 其他进程中的也会被修改呢
个人对静态库和动态库的理解:
静态库链接可以按需加载打入可执行文件中,
动态库在运行时必须得完全加载进内存
这么看来静态库更省内存
对于在父、子进程间共享状态信息,进程有一个非常清晰的模型:共享文件表,但是不共
享用户地址空间。
对这几句话有点疑问:
1、父、子进程怎么产生的?产生的场景是什么?
2.、父、子进程间共享状态信息是相互绑定的么,父进程销毁会对子进程有有影响么?
3、共享文件表是什么?包含什么信息?
学科:《深入理解计算机系统》
类型:代码问题
内容:8.5小节 532页
void sigint_handler(int sig) /* SIGINT handler */ //line:ecf:sigint:beginhandler
{
printf("Caught SIGINT!%d\n", getpid()); //line:ecf:sigint:printhandler
exit(0); //line:ecf:sigint:exithandler
} //line:ecf:sigint:endhandler
int main() {
/* Install the SIGINT handler */
if (signal(SIGINT, sigint_handler) == SIG_ERR) //line:ecf:sigint:begininstall
unix_error("signal error"); //line:ecf:sigint:endinstall
printf("呵呵呵%d",getpid());
pause(); /* Wait for the receipt of a signal */ //line:ecf:sigint:pause
return 0;
}
C动态内存通过malloc分配,其分配的是heap,但是有的地方说,这个堆跟数据结构的堆又不同,为什么不同
C、C++在链接时,链接器是按需复制被程序引用的目标模块,而不是复制整个静态库。哪 在Java和 Android 是怎么操作的?Android 中的 Dalvik 和 ART 虚拟机起到了什么作用?
Android程序是即可以在加载时链接又可以在运行时链接吗?
.a文件是 C,C++,Objective-c的静态库
那 jar 包(一组 class 文件的压缩包)是 Java的 静态库?
学科:《深入理解计算机系统》
类型:知识理解
内容:该书中1.4. 2 运行 hello 程序有两段描述
1、“'初始时,shell 程序执行它的指令,等待我们输人一个命令。当我们在键盘上输人字符串
./hello后,shell 程序将字符逐一读人寄存器,再把它存放到内存中,”
2、“一旦目标文件 hello 中的代码和数据被加载到主存,处理器就开始执行 hello 程序
的 main 程序中的机器语言指令。这些指令将hello,world/n字符串中的字节从主存
复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。”
问题:难道IO设备直接通过IO总线和CPU中寄存器打交道,不需要经过主内存?
文件映射,匿名映射的区别:----------------------------------
从文章看,我个人认为两者场景的区别:
1、匿名文件会清零所有数据,由内核创建,在子进程和父进程间通信,不知道理解对不?
2、匿名文件没有文件打开关闭,所以更高效?
Android共享内存相关的问题:----------------------------------
1、Android binder驱动使用的内存映射函数 binder_mmap 最终调用的是linux的mmap。
从根本上来说binder通信,使用binder驱动作为共享文件的mmap,这种深层次的理解有问题吗?
2、在学习surfacelinger的时候,经常看到Ashmem匿名共享内存进程间传递数据的使用分析(应该是比较老的资料)。
其实现原理看起来也是调用mmap,只是没有对传递数据的大小像binder使用的限制。
是否可以认为这两种进程间通信的方式殊途同归,其根本实现都是mmap?
《深入理解计算机系统》第二章的内容涉及到很多的概念与计算,这些是了解为主,还是要吃透,我的读书体会,现在看书是看懂了,到了练习题的时候,还得重温这块内容。感觉一直做不到融会贯通。
学科:《深入理解计算机系统》
类型:知识理解
内容:第八章 8.4.3 回收子进程
当一个子进程终止时,需要等待被父进程回收:
1、为什么是由父进程来管理子进程的回收?这样设计的好处是什么?
2、为什么不像jvm中的gc一样,设计一个专门用于回收进程的进程?
3、线程在运行结束后,又是怎样被回收资源的呢?
学科:《深入理解计算机系统》
类型:知识理解
内容:C语言中的指针和Java中的对象引用有没有本质的关联
节头表中的字段都能在段头表中找到对应的映射关系,我知道,shstrtab这个很特殊, 包含了所有节的名称,我的问题是为什么,shstrtab在段头中没有对应的映射关系?
学科:《深入理解计算机系统》
类型:知识理解
内容:在第八章异常这一章中,第505页,讲到异常的一种类型是“故障”,故障被处理程序处理,并回到原来的指令重新执行,那么像加法溢出这种异常,如果同样如此的话,不就又回到故障了吗,此时程序不就进入不断故障的循环了吗
既然大端法更符合人类阅读的习惯,那为什么还会有小端法?是为了效率麽?
路哥,早上好,问一个问题,文中说“对局部变量的反复引用是友好的,因为编译器可将局部变量存储在寄存器中”,这句话该怎么去理解?在JVM中,函数在运行阶段会有一个栈帧的概念,栈帧中会有局部变量表,局部变量是保存在局部变量表里面的,然而它是怎么又保存到寄存器中去了,是因为层级不一样吗,反复用到的局部变量就会升级保存到CPU级别的Reg里面去?
3.4节访问信息里说道:以寄存器作为目标的指令,对于生成小于8字节结果的指令,有两条规则:生成1字节和2字节数字的指令会保持剩下的字节不变;生成4字节数字的指令会把高位4字节置为0。
在第一章中有讲到,由于不同机器对二进制的程序的处理不同,所以二进制程序是不兼容的,但是为什么64位的计算机可以运行32位计算机编译出来的程序?
条件数据传送和条件控制转移的对比,条件数据传送会计算一个条件操作的两种结果。而条件控制转移会通过条件预测来执行一个分支,预测错误则会从正确的地方开始执行。预测错误会产生条件预测惩罚,这会导致条件控制转移耗费的时间大于条件数据传送。既然在这种情况下两种方式都执行了两个分支,那么为什么条件控制转移耗费的时间要多?条件预测惩罚是否意味着,需要将寄存器和内存的值回滚为之前的值所以耗费了更多的时间?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.