计算机底层的基础知识
前言
有时甚至都不能理解产生的问题本身,又谈何解决问题呢?
内容可视化非常直观,一图抵千言。
第一章 从编程语言到可执行程序
cpu:取指执行,速度极快。
汇编语言、C语言、高级语言。
编译器:负责将代码翻译成CPU可以理解的机器指令。将高级语言翻译为机器语言。
链接器:把编译器产生的一堆目标文件打包成最终的可执行文件。
动态库:无论有多少程序依赖它,磁盘中都只需要存储一份该动态库,无论有多少运行起来的程序依赖它,内存中也只需要加载一份该动态库,所有程序共享一份代码。
虚拟内存:内核、栈区、堆区、数据区、代码区
第二章 我对**程序运行**一无所知
CPU:取指执行
进程:运行中的程序,资源分配的基本单位
进程控制块PCB:保存进程的信息
高级编程语言、编译器、链接器、操作系统大大解放了程序员生产力
进程缺点:1、创建开销大 2、通讯麻烦
线程:可共享进程地址空间
线程池:生产者线程与消费者线程
从处理任务所需要的资源角度分类:CPU密集型、IO密集型
线程上下文:线程的栈区、程序计数器、栈指针、执行函数时使用的寄存器信息,都是线程私有的
进程地址空间:代码区、数据区、堆区、空闲区域(动态库中的代码和数据所在区域)、栈区(线程A的栈区、线程B的栈区)
线程局部存储:TLS
线程安全:需要知道代码什么时候待在自己家里使用私有资源,什么时候去公共场所使用公共资源,也就是说你需要识别线程的私有资源和共享资源都有哪些,这是解决线程安全的核心所在。
线程私有资源:函数中的局部变量、线程的栈区、线程局部存储
线程公共资源:动态分配内存的堆区、数据区、代码区
如何实现线程安全代码:线程局部存储、只读(全局资源)、原子操作、同步互斥(互斥锁、回旋锁、信号量)
进程、线程、协程
协程:用户态实现,内存分配(堆区中)
同步调用、异步调用
两种回调类型:同步回调、异步回调
同步与异步:打电话是一种同步沟通方式、邮件是一种异步沟通方式
阻塞与非阻塞
高并发、高性能服务器:多进程、多线程、事件循环、事件驱动
协程:以同步的方式进行异步编程
计算机系统漫游:数据、代码、回调、闭包、容器、虚拟机
第三章 内存
内存的本质:内存储物柜,存放0或1
内存单位:8个bit组成一个byte、2的10次方bype为1m
变量:内存存放的是变量的值
指针:内存存放的是内存地址
指针到引用:隐藏内存地址
进程地址空间布局:代码区、数据区、堆区(动态内存分配)、空闲空间、栈区、内核
虚拟内存:通过页表维护到物理内存的映射
页表
函数调用的活动轨迹实现:栈
栈帧:函数运行时存放的上下文信息
堆区:内存动态分配
内存管理:内存分配、内存释放
系统调用:用户态与内核态交互通道
内存池的实现
第四章 CPU
晶体管
与门、或门、非门
加法器、寄存器
寄存器及内存只要通电,这个电路就能保存信息,但是断电后保存的信息就丢了
CPU表达机制是通过指令集来实现的
CPU调度:时钟信号
进程管理与调度
中断
原码、反码、补码
流水线技术、分支预测
冯若依曼架构:存储器、运算器、控制器、输入输出设备
复杂指令集、精简指令集
核心概念:寄存器、栈寄存器、指令地址寄存器、状态寄存器、上下文、嵌套与栈、函数调用与运行时栈、系统调用与内核态栈、中断与中断函数栈、线程切换与内核态栈。
第五章 缓存
CPU与内存之间还隔着L1 L2 L3级缓存,其中L3为多核CPU所共享
cache一致性问题
分布式存储
局部性原理、内存池、冷热数据分离
第六章 IO
IO机器指令
read和write:操作系统使用DMA的方式先把文件的数据从硬盘复制到内核缓冲区,然后复制到用户缓存区。(系统调用代价高)。
sendfile:零拷贝技术,减少上下文切换,避免做无谓的数据搬运,提供系统性能。
轮询、中断
直接存储器访问:DMA
IO多路复用、select、poll、epoll
原文链接:计算机底层的秘密