一些对底层知识点的概括。
汇编程序可以当成一个函数,C语言的时候函数量就更大了,c++和java衍生成了对象的方法。一个类就是一个c结构和函数库增加一个类方法组。创建对象时候,结构被放在堆中,类函数组被加载到方法区内存。堆、方法区,以及线程操控的栈,共同构成程序的内存。其中GC会对堆进行管理,线程的回收利用对栈进行管理,方法区随着类的加载而增大。
程序运行起来会有热点机制,循环和重复引用的代码会被检测出来。这些代码不是通过解释-执行,而是直接解释成机器码存储起来,直接引用。超过阀值的就会被设成热点,阀值的选取还有类似的机制都是虚拟机在做的事。一些脚本语言也有热点机制,比java早。
程序的内存是虚拟内存,每个程序占用一些虚拟内存页,这些页指向的内容被操作系统放到内存或磁盘上。物理内存一部分用来放翻译虚拟地址用的页表,包括高速缓存也会被页表缓冲占用。地址翻译被MMU和TLB等外设完成,不占用CPU的计算量。
CPU的计算并不是一条条完成,像线程一样分流水。同一时间一个核心进行着多个指令。有些指令之间有因果关系不能并发执行,这会变相提升相关程序代码的执行时间。编程时尽量把外界变量变为更局部的变量,可以减轻因果关系。编译器也会做一些其它的优化处理。
对外界的读主要通过TCP。网络传输通道通过路由器的交互建立,TCP对通道的可靠性做些优化,产生了交互规则。对内可以把TCP看成网卡驱动,由操作系统申请TCP内存,以及每个套接字的内存。程序对套接字内存只可以读出和写入,并在程序本身申请的内存上完成对数据的加工。
对磁盘读写和读内存不同,虚拟内存只有物理内存大小囊括不了磁盘。读磁盘使用了一些系统调用指令或函数方法。可以读一个文件并得到句柄,也可以直接读磁盘,都需要把磁盘内容加载到内存。
原文:https://www.cnblogs.com/flangrean/p/15352157.html