本帖最后由 退隐猫九_ 于 2025-7-20 14:55 编辑
本帖最后由 退隐猫九_ 于 2025-7-20 13:45 编辑
很久没回来了,写个系统化的课程
进制
想象我们常用的十进制,0,1,2,3,4,5,6,7,8,9
那么计算机也一样,电路组成,内部由无数个微小的1和0组成,也就是开和关
二进制没有那么高深莫测,只是计算机这种只有0和1的设备所能理解的最自然的语言,就像我们的中文
十进制中,我们含有位权,都是10的倍数,如下:

比如108这个数值,那么有1个100个8个1
二进制一样,只不过位权不同,是2的倍数

如上,50+50=100,那么100<128,关闭,>64开启,100-64=36,36>32,开启,还有4,那么在4的位权位置开启,得到01100100
方法就都一样了,8+4+1=13,那么8、4、1的开关开启,就是1101=13
- 位Bit:一个二进制位,一个0或者一个1,最小的单位
- 字节Byte:8个位组成一个单元
练习
使用凑位权,把数字用8位二进制表示:5、18、200
用凑位权反推,把二进制转为10进制:00001011、01010101
附加:电脑上的txt、图片、mp4媒体等,本质是什么,如何存储的
文件与编码
前面看明白了二进制,但是思考一下,如果只是单纯的存储了一堆0和1,不了解其意思,那么无用,就像我给你一堆abcdefg,不说明怎么用,他对于你就毫无意义
电脑也一样,01000001,这个是当成65看,还是A,还是像素的颜色?
所以要有一个规范和语法
文本文档
最简单的一种,比如ASCII和Unicode(UTF-8),规定那个数字对应哪个字符,比如ASCII就是规定65对应A,66对应B,而Unicode包含的范围更广,几乎所有语言文字都包含在内
当打开一个文本文件的时候,记事本就拿着对应的规则,去翻阅查找,查出对应的内容,然后显示你的屏幕上,所以有时候,格式不同导致解析乱码
图片文件
比如BMP、JPG、PNG等,最简单的BMP就是:文件头几十个字节声明自己的文件类型,然后多大的像素,每个像素多少位颜色表示,然后正文就是一长串字节,从上到下,从左到右的顺序,依次表示每一个像素点的颜色值
为什么记事本打开图片乱码,应该也就知道了
PE格式
可执行程序exe、dll都遵守这个格式,是最复杂的,比如说明我是一个exe/dll,申请多大内存、依赖哪些文件、代码从哪执行等等
主体部分更不是文字,也不是像素颜色,就是机器指令,CPU能直接理解且能执行的,汇编就是这些指令的文本表示
练习
下载个十六进制编辑器,比较轻的HxD或者其他都可以,新建一个文本文件,输入52HB,保存关闭,用HxD打开

显示内容如上,上网搜索Unicode表,看看35、32、48、42对应的是不是我们后面的内容
下载一个GIF图片,HxD打开,47 49 46 38 39 61,看到文件头,GIF89a,当看图软件看到,就知道以gif解析
CPU
中央处理器CPU,相当于一个超高速的大脑,程序就是一堆数据,写着每一个步骤,CPU就是那个超强大脑,他的工作,就是严格按照数据指令,一条条执行
他不会思考,也不会创造
指令是什么?
从内存地址A取出数据,从内存地址B取出数据,相加,将结果放入内存地址C,这就是一个指令,exe可执行文件,就是成千上万条机器指令组成
但是这些指令在文件里是二进制形式存储
核心流程:
取指Fetch,从内存中获取下一条要执行的机器指令
解码Decode,CPU的控制单元对这条指令的二进制解码,弄明白是一个加法还是一个数据移动
执行Execute,CPU的算数逻辑单元ALU等部件,真正的去执行
CPU就是围绕这几个循环,每一次点击,每一个解码,播放的每一帧视频,都是CPU在幕后疯狂的工作
CPU的性能衡量
主频GHz,经常听到别人说3.4GHz,2.1GHz,意味着每秒34亿周期,21亿次周期,总之主频越高,CPU执行指令速度越快,详细感兴趣的可以参考,英特尔的CPU速度
核心数量,单核,只有一个大脑,一次只能做一个东西,四核,有4个大脑,同时做4个不同的东西,或者协同完成等,核心越多,处理多任务等能力越强
CPU再聪明,没有记忆,一关机没了,没意义,所以有内存RAM和硬盘,短期和长期记忆,硬盘可以存储大量数据(较慢),内存RAM空间有限(极快),且断电等,内容通常会被清理
串联起来就是:系统在硬盘找到了notepad.exe和各种依赖dll,然后把这些东西加载到内存,CPU永远不会直接去硬盘上读取程序指令,然后CPU从内存一条一条读取指令,且开始循环上面说的三个步骤
那么数据处理了,如何和我们互动,就要输入输出设备,输入将物理世界信息转为数字信号,比如键盘鼠标,输出设备把数字信号转为我们感知的信息,比如显示器
这部分感兴趣可以去看一下,大部分就是物理动作->设备控制器->基础数字信号->设备驱动程序->系统能理解的信息->程序做出相应
大部分某个程序驱动出问题了等,就是设备驱动程序软件翻译层面罢工了
系统
操作系统是链接应用程序和物理硬件之间最关键的软件层
系统第一个职责就是
资源管理器
管理CPU的时间:比如电脑只有几个CPU核心,但又很多事情,系统需要决定在任何一个瞬间,去执行什么,可能每个都跑个几秒,通过CPU调度,让你觉得都在正常运行
管理内存:系统给每个程序一个独立的内存空间,要确保不能把A程序的数据放到B程序中,保证隔离和安全
管理I/O:电脑只有一个显卡,系统决定谁优先使用
第二个就是硬件抽象层
位程序员提供了统一的接口API,来使用底层复杂的硬件,就像写了一个WriteFile,操作系统会负责处理剩下的所有和硬件打交道的复杂工作
内核就是系统最核心的部分,负责所有资源管理器和硬件交互的,平时看到的就是用户界面,和内核交互的外壳
进程线程
比如启动一个Chrome浏览器,系统会在内存开辟独立的空间,程序的代码和数据加载到内存,分配程序用的资源,这个运行中的,拥有自己独立资源的实例,就是进程
线程就是打工的,进程弄好了,也就是厂房弄好了,所有资源都全了,没有工人,无法工作,负责执行代码、推动程序运行的,就是线程
单线程只有一个人干活,非常难,多线程有多个工人干活,共享资源但是可以分工安排不同的工作,比如UI线程、下载线程等
独立空间
我们上次知道了,程序在运行的时候,会化身独立的进程,且还有线程,那么,系统既然为每个进程分配独立空间,我的RAM内存只有32G
我却能同时运行:QQ、微信、浏览器、大型网游、WPS等,加起来可能已经超过我的32G了,为什么系统不崩溃,且为什么QQ访问0x400000和浏览器访问自己的0x400000,两个不会冲突
这就是虚拟内存的魔力
物理内存,就是我们实际的,有多大就是多大,真实可用的,程序来了,每个程序都要4个G,若真实分配,那电脑就玩完了
但是系统+CPU的MMU有妙招,比如QQ来了,给他一个4G空间,浏览器来了给他一个4G空间,两个程序都以为自己获取了独立的空间,但是看到的、使用的都是虚拟的地址空间
那么程序如何找到属于自己的?CPu有页表(Page Table),QQ来了,CPU的MMU硬件帮助下,快速查阅,给他再去说物理地址
如果实在是不够了怎么办,还有硬盘,和硬盘的Page File搞一搞,比如满了,CPU看看谁不活跃,会暂时把这个进程的数据放到硬盘上,然后打扫,分配给其他的进程,如果进程又活跃了,就会有一个缺页中断,把原来的数据再取回来,给他一个新的空的物理空间,更新对照表

可以下载Process Explorer看看,Private Bytes私有字节,代表承诺给这个进程的虚拟内存大小,Working Set代表实际占用的
网络基础
在网络通信中,定位一个设备、一个程序必须的三个核心地址:MAC、IP、Port
MAC地址,等于你的身份证,被烧录到网卡硬件里的物理地址,主要用在同一个局域网内的通信
IP地址,家庭住址,一个逻辑地址,链上一个网络,会给你分配一个地址,IP地址用于不同网络之间的寻址和路由
Port,数据包到了对方电脑,系统要知道给哪个程序处理,端口0-65535,区分不同的服务,就像酒店房间号
交换机:使用MAC地址,链接LAN下的所有人
路由器:通过IP地址,查询路由表等
DNS相当于114查号台,响应查询,告诉你域名对应的ip等
TCP/IP协议族,IP协议负责地址和路由,负责实际数据传输的有TCP和UDP
TCP可靠,三次握手,就像先打电话,等待接听,然后说喂喂喂,听得到吗,确认是否都准备好
你说一句话,对方说嗯,好,这是确认应答ACK,说了一句话,对方卡了半天没反应,重说一遍,叫超时重传
断开四次挥手
UDP随缘的,不可靠,有可能我发10个邮件,实际到达7个,但是很快,用到直播、视频通话、游戏等,掉一个无非就是卡一下的事情