磁盘调度算法、虚拟内存、抖动(颠簸)、堆栈访问速度、内存分配、内存交换、编码(ASCII、Unicode、UTF-8)

发布时间 2023-12-27 12:03:26作者: 廿陆

常见的几种磁盘调度算法:

读写一个磁盘块的时间的影响因素有:

  ? 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)

  ? 寻道时间(制动手臂移动,使得磁头移动道适当的磁道上)

  ? 实际的数据传输时间

  其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短

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会常驻内存,不会被换出外存。)

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 再传输到浏览器。