计算机底层的基础知识

前言

有时甚至都不能理解产生的问题本身,又谈何解决问题呢?

内容可视化非常直观,一图抵千言。

第一章 从编程语言到可执行程序

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图片
原文链接:计算机底层的秘密

写的不好,就当是整理下思绪吧。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!