磁盘调度算法、虚拟内存、抖动(颠簸)、堆栈访问速度、内存分配、内存交换、编码(ASCII、Unicode、UTF-8)
常见的几种磁盘调度算法:
读写一个磁盘块的时间的影响因素有:
🔴 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
🔴 寻道时间(制动手臂移动,使得磁头移动道适当的磁道上)
🔴 实际的数据传输时间
其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短
1.先来先服务:
按照磁盘请求的顺序进行调度
优点是:公平和简单
缺点是:未对寻道做任何优化,平均寻道时间可能长
2.最短寻道时间优先:
优先调度与当前磁头所在磁道距离最近的磁道。
虽然平均寻道时间比较低,但不够公平。如果新的请求总比一个等待的磁道请求近,可能出现饥饿情况。两端的磁道请求容易出现饥饿情况。
3.电梯扫描方法:
电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变方向。
交换空间:
Linux中的交换空间(Swap space)在 物理内存 充满时使用,内存中不活跃的页就会被移动到交换空间中,交换空间位于磁盘驱动器(磁盘)上,比进入物理内存要慢。
虚拟内存:
是文件数据交叉链接的活动文件,是WINDOWS目录下的一个“WIN386.SWP”文件,这个文件会不断扩大和自动缩小,虚拟内存使用的是磁盘的空间(用磁盘充当内存使用)。
抖动(颠簸现象):
刚换出的页马上又要换入内存,刚换入的页马上又要换出外存,频繁的调度行为称为抖动(颠簸)。
主要原因是进程频繁访问页面数目高于可用的物理块数(分配给进程的物理块不够)
堆栈:
分配和释放:堆在分配和释放时都要调用函数(寻址空间)(栈快)
访问时间:(堆需要两次访问内存,第一次取得指针,第二次访问数据,栈只需要访问一次),另外,堆的内容容易被操作系统交换到外存,栈一般不会被换出(栈快)
常见内存分配方式:
🔴 静态存储区域分配:编译的时候分配好,程序运行整个期间都存在,(全局变量、static变量)
🔴 栈创建:执行函数时,函数内局部变量的存储单元,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的 指令集 中,效率高,但容量有限。
🔴 堆分配:动态内存分配,malloc或者 new 申请任意大小,程序员负责 free 、delete,动态内存生存周期由程序员决定,灵活但问题多。
常见的内存分配错误:(申请、入口检查、赋初值、越界检查、释放空间、指针置NULL)
🔴 内存分配未成功,却使用了。
解决办法:在使用内存之前检查指针是否未NULL,如果指针p是函数的参数,那么在函数入口处用 (p != NULL)检查。
🔴 内存分配成功,但未初始化
解决办法:赋初值,赋零值
🔴 内存分配成功且已经初始化,但操作越界
解决办法:谨慎使用 for循环,数组下标越界情况
🔴 忘记释放内存,内存泄漏,(内存充足时看不到错误,内存耗尽程序挂掉)
解决办法:动态内存的申请与释放必须配队,malloc与free new和delete同次数。
🔴 释放了内存却继续使用
调用关系复杂,忘记是否释放,应该重新设计数据结构。
return语句错误,不要返回指向 “栈内存” 的 ”指针“ 或 ”引用“,因为该内存在函数体结束时被自动销毁。
使用 free 或 delete 后,没有将指针设置为 NULL,导致 ”野指针“。
内存交换:
🔴 被换出的进程保存在磁盘中,具有对换功能的操作系统,磁盘分为文件区和对换区两部分,对换区占磁盘小部分,对换区I/O比文件区快。
🔴 阻塞进程被优先换出;优先级低的进程可换出;部分系统考虑进程在内存驻留时间(PCB会常驻内存,不会被换出外存。)
注意的关键点:
1.交换需要备份存储,通常是快速磁盘,必须足够大,并且提供对这些内存映像的直接访问。
2.进程的执行时间比交换时间长,影响交换时间的主要是转移时间。
3.交换通常再进程运行且内存空间吃紧时启动,系统负荷降低就暂停。
4.普通交换使用不多,但交换的策略的变种在许多系统中仍在发挥作用(例如UNIX系统)
ASCII、Unicode、UTF-8:
🔴 ASCII:仅有128个字符,表示英文字母的大小写、数字和一些符号;
但有其他语言用ASCII编码表示不够(例如中文需要两个字节,且不能和ASCII冲突,中国定制了 GB2312编码格式,其他国家的语言也有属于自己的编码格式)
🔴 Unicode:由于每个国家都有属于自己的编码格式,在多语言编辑文本中会出现乱码,这样Unicode出现;
Unicode将这些语言统一到一套编码格式中,通常两个字节表示一个字符,而ASCII是一个字节表示一个字符,如果编译文本是全英文,用Unicode比ASCII多一倍存储空间。
🔴 UTF-8:为了解决上述问题,将Unicode编码转化为 ”可变长编码“;
UTF-8将Unicode字符按数字大小编码为 1-6 个字节,英文字母被编码成一个字节,常用汉字编码成三个字节,纯英文用UTF-8节省空间,并且ASCII码也是 UTF-8的一部分。
三者之间的联系:内存使用(Unicode),保存、传输使用(UTF-8)
🔴 在计算机内存中,统一使用 Unicode 编码,当需要保存到硬盘或需要传输的时候,转换为 UTF-8编码;
🔴 用记事本编辑的时候,从文件读取的 UTF-8 字符被转换为 Unicode 字符到内存里,编辑完成后,保存的时候再把 Unicode 转换为 UTF-8。
🔴 浏览网页的时候,服务器会把动态生成的 Unicode 内容转换为 UTF-8 再传输到浏览器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)