Giter Club home page Giter Club logo

computer-basics's Issues

静态库链接的问题

FE94A486-0731-41dd-95DF-E4D398BE061C

例子中的 AB链接之后变量var 地址确定下来未0x1000 这个地址是怎么得到的,这个地址和程序运行时的虚拟地址和内存地址有啥联系?

第六章书430页,高速缓存命中这块看不明白

430页这里写的1读地址0的字,还勉强理解,到了下面的读取地址1,13,8,0这里说的缓存命中看不明白。
我的疑问,
1缓存是否有效和是否命中有关系吗?无效就一定不命中吗?
2这里的有效位标记位分别啥意思?命中是简单的是否存在的意思吗?
3书上的这个事例是否需要参考上面的表6-30?

3.7.3 数据传递(栈帧相关问题)

在x86-64上,当函数传递整型参数大于6个,多出的部分会存放在函数在栈帧分配的空间上,通过栈传递的参数,所有数据大小都向8的倍数对齐。
问题1:这6个整型的6是固定的吗,还是不同的处理器上是不同的?
问题2:数据的大小向8的倍数对齐,如果参数里最大的数据占用8个字节,那么其他也是占用8个字节吗?如果最大的数据占用16字节,是否其他也需要统一的保持一致16字节,又或者说只是8的倍数即可,无需所有参数都是统一大小?

深入理解计算机系统第八章8.2.4关于用户模式和内核模式的问题(p510)

在书的8.2.4 用户模式和内核模式中提到当设置模式位的时候,进程享有内核模式,如果没有设置,则为用户模式。那么这两个模式在Linux下会共存吗?
在 Android 系统中存在 gid(group id) 和 uid(user id)用来管理权限,感觉这两个和书中提到的内核模式和用户模式有相通的地方,但好像就有不太一样,那这两对概念有什么相同点和不同点,可以混为一谈吗?

引用变量存储问题

java编程**中,"倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方"
我的问题是:
引用变量是栈内存开辟空间,创建对象是在堆内存开辟空间,那么对象中的属性,是引用变量,那么创建对象的时候,对象中的属性(引用变量)是怎么存储的,它会存储在哪里?

问题:难道IO设备直接通过IO总线和CPU中寄存器打交道,不需要经过主内存?

学科:《深入理解计算机系统》
类型:知识理解
内容:该书中1.4. 2 运行 hello 程序有两段描述
1、“'初始时,shell 程序执行它的指令,等待我们输人一个命令。当我们在键盘上输人字符串
./hello后,shell 程序将字符逐一读人寄存器,再把它存放到内存中,”

2、“一旦目标文件 hello 中的代码和数据被加载到主存,处理器就开始执行 hello 程序
的 main 程序中的机器语言指令。这些指令将hello,world/n字符串中的字节从主存
复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。”

问题:难道IO设备直接通过IO总线和CPU中寄存器打交道,不需要经过主内存?

在linux进程中的fd

学科:《深入理解计算机系统》
类型:知识理解
内容:第十二章 12.2小节 684页
image
如上图select 方法第一个参数需要传最大的fd ,由此有几个疑问

  1. 每个进程的fd是不是有限制呢,最大是多少呢
  2. 每个进程fd为什么都是独立计算的呢( 从3开始,012是标准准io)
  3. 关闭进程后fd会自动回收吗(包括子进程和父进程)

关联问题

WX20200612-001144@2x

是否java中的变量是否与符号解析有关联呢,是否通过C语言进行关联的呢?

大端法和小端法

这里说最高有效位排到前面是大端法,最低有效位排到前面是小端法,
这个图,01应该是最低有效位吧..怎么是大端法呀?应该是小端法呀
有点小疑惑...
image

第七章 链接问题

C、C++在链接时,链接器是按需复制被程序引用的目标模块,而不是复制整个静态库。哪 在Java和 Android 是怎么操作的?Android 中的 Dalvik 和 ART 虚拟机起到了什么作用?
Android程序是即可以在加载时链接又可以在运行时链接吗?
.a文件是 C,C++,Objective-c的静态库
那 jar 包(一组 class 文件的压缩包)是 Java的 静态库?

动态链接的问题

学科:《深入理解计算机系统》
类型:知识理解
内容:

  1. 第七章 477页 gcc -static 为什么要static 书上解释 -static 参数告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件,它可以加载到内存并运行,在加载时无须更进一步的链.
    个人理解: 假如我调用了printf, printf这个函数也会打入可执行文件中.

  2. 静态链接时把整个可重定位文件打到可执行文件中,还是只打调用了的
    3.第七章,7.12 489页 位置无关代码
    书上写: 现代系统以这样一种方式编译共享模块的代码段,使得可以把它们
    加载到内存的任何位置而无需链接器修改。使用这种方法,无限多个进程可以共享一个共
    享模块的代码段的单一副本。(当然,每个进程仍然会有它自己的读/写数据块。)
    个人理解: 那意思是这个进程加载了so库在其他进程也能用吗,如果是这样 我这个进程修改了so的里面的全局变量 其他进程中的也会被修改呢

  3. 个人对静态库和动态库的理解:
    静态库链接可以按需加载打入可执行文件中,
    动态库在运行时必须得完全加载进内存
    这么看来静态库更省内存

第三章146页,条件预测惩罚浪费的时间在哪?

条件数据传送和条件控制转移的对比,条件数据传送会计算一个条件操作的两种结果。而条件控制转移会通过条件预测来执行一个分支,预测错误则会从正确的地方开始执行。预测错误会产生条件预测惩罚,这会导致条件控制转移耗费的时间大于条件数据传送。既然在这种情况下两种方式都执行了两个分支,那么为什么条件控制转移耗费的时间要多?条件预测惩罚是否意味着,需要将寄存器和内存的值回滚为之前的值所以耗费了更多的时间?

关于进程回收的问题

学科:《深入理解计算机系统》
类型:知识理解
内容:第八章 8.4.3 回收子进程

当一个子进程终止时,需要等待被父进程回收:
1、为什么是由父进程来管理子进程的回收?这样设计的好处是什么?
2、为什么不像jvm中的gc一样,设计一个专门用于回收进程的进程?
3、线程在运行结束后,又是怎样被回收资源的呢?

关于针对Computer-basics项目的Issues的相关说明

Computer-basics目前已经发布了,我们主要是利用这个项目来帮助我们掌握基础的计算机学科知识,建议大家在提交Issues时注明详细信息,方便确认和后期的整理:

issue提交例子:

  • 学科:《深入理解计算机系统》
  • 类型:知识理解/代码问题
  • 内容:自己对问题的描述,有相关的贴图更好,如果是后期代码的一些问题,可以粘贴相关的版本、log、已经处理的步骤等等,方便问题的定位。

牺牲页的问题

缺页异常处理器会选择一个牺牲页,这个牺牲页的作用不是太明白。我的理解是缺页时从磁盘拷贝到内存时发现没有空余的页了,然后覆盖一个页数据。这个页就是牺牲页?

小端法的意义

既然大端法更符合人类阅读的习惯,那为什么还会有小端法?是为了效率麽?

《深入理解计算机系统》第二章2.2.1——负数取值范围

学科:《深入理解计算机系统》
类型:知识理解
内容:第二章2.2.1 中32位和64位程序上C语言整型数据的取值范围不对称,负数的范围比正数的范围大1,这是规定吗,不清楚为什么这样规定,是不是有什么原因啊。
image

第八章 异常控制流 8.5小节的程序问题

学科:《深入理解计算机系统》
类型:代码问题
内容: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;
}

为什么 呵呵呵 在ctrl c之后才会显示出来
image

《深入理解计算机系统》第一章 1.7.1 进程——进程上下文切换概念问题

学科:《深入理解计算机系统》
类型:知识理解
内容:该书中1.7. 1 进程中对上文切换的定义。我以前在听一些工开课的时候,在讲多线程的时候,说是线程之间的切换叫做上下文切换,但是书中说是进程之间的切换是上下文切换,这两个上下文切换是一个概念吗。在就是线程不是运行在进程当中吗,如果同一个进程中的线程切换难道没有上下文切换的概念吗,虽然是同一进程的线程互相切换也得有消耗吧。

image

6.5章节中提及的概念:局部变量存储在寄存器中

  • 《深入理解计算机系统》第6.5章节:

路哥,早上好,问一个问题,文中说“对局部变量的反复引用是友好的,因为编译器可将局部变量存储在寄存器中”,这句话该怎么去理解?在JVM中,函数在运行阶段会有一个栈帧的概念,栈帧中会有局部变量表,局部变量是保存在局部变量表里面的,然而它是怎么又保存到寄存器中去了,是因为层级不一样吗,反复用到的局部变量就会升级保存到CPU级别的Reg里面去?

第九章mmap,文件映射,匿名映射的区别,及Android共享内存相关的问题

文件映射,匿名映射的区别:----------------------------------

image

从文章看,我个人认为两者场景的区别:
1、匿名文件会清零所有数据,由内核创建,在子进程和父进程间通信,不知道理解对不?

2、匿名文件没有文件打开关闭,所以更高效?

Android共享内存相关的问题:----------------------------------
1、Android binder驱动使用的内存映射函数 binder_mmap 最终调用的是linux的mmap。
从根本上来说binder通信,使用binder驱动作为共享文件的mmap,这种深层次的理解有问题吗?

2、在学习surfacelinger的时候,经常看到Ashmem匿名共享内存进程间传递数据的使用分析(应该是比较老的资料)。
其实现原理看起来也是调用mmap,只是没有对传递数据的大小像binder使用的限制。
是否可以认为这两种进程间通信的方式殊途同归,其根本实现都是mmap?

第12章,12.1.2,进程疑问

对于在父、子进程间共享状态信息,进程有一个非常清晰的模型:共享文件表,但是不共
享用户地址空间。
对这几句话有点疑问:
1、父、子进程怎么产生的?产生的场景是什么?
2.、父、子进程间共享状态信息是相互绑定的么,父进程销毁会对子进程有有影响么?
3、共享文件表是什么?包含什么信息?

节头表与段头表映射字段.shstrtab

节头表中的字段都能在段头表中找到对应的映射关系,我知道,shstrtab这个很特殊, 包含了所有节的名称,我的问题是为什么,shstrtab在段头中没有对应的映射关系?

第二章 2.3.6-2.3.7 整数乘法及除法

时间周期概念

文中提出乘法需要大于等于10个时间周期,那么这里面的时间周期是什么?网上查的话是cpu频率的倒数、单片机的最小时间单位是这个么?为什么说乘法要10个以上除法要30个不太明白怎么来的。。。

乘法优化

文中举例 x*14 编译器重写成(x <<3)+(x<<2)+(x<<1),那么是不是编译器就没有乘法或除法就都是变换成位移和加减法?

关联问题

WX20200612-001144@2x

是否java中的变量是否与符号解析有关联呢,是否通过C语言惊醒关联的呢?

《深入理解计算机系统》第二章2.1.9——算术右移和逻辑右移,向左却没有这两种

学科:《深入理解计算机系统》
类型:知识理解
内容:该书中第二章2.1. 9 中提到C语言中的移位运算中左移的就是丢弃左边最高位,右端补零。右移运算中分为逻辑右移和算术右移,逻辑右左端补零,算术右移左端补最高位有效值。
1、目前不知道为是左移位什么没有这两种区别)。
2、有点不清楚逻辑右移和算术右移的区别。
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.