操作系统相关知识点

CPU

CPU是中央处理器,它是计算机的核心。 cpu通过和寄存器,高速缓存,以及内存交互来执行程序。

主板分为南桥和北桥,北桥主要是内存总线,通往内存。 而南桥主要是慢速设备的IO总线,包括硬盘,网卡等IO设备。

32位cpu最多寻址4g内存,而64位cpu目前来说没有上限。

程序执行过程

cpu发出指令,将硬盘上的一段程序读入内存,由于cpu和硬盘的速度差距更大,一般使用中断,dma等方式来将硬盘数据载入内存。 然后cpu通过寄存器以及指令集执行指令,cpu读取内存上的代码,内存上的方法执行是一个栈调用的过程。

操作系统定义

 是控制和管理计算机系统的硬件和软件资源,合理的组织计算机工作流程以及方便用户使用,是一种系统软件

操作系统作用

 设置操作系统的目的就是提高计算机系统的效率,增强系统的处理能力,充分发挥系统的利用率,方便用户使用

高速缓存 读写缓冲区

为了弥补cpu和内存的速度差,cpu配有多级缓存。

一般有一级缓存和二级缓存,缓存根据局部性原理把经常使用的代码加载如缓存,能比直接访问内存快上几百倍。

同样的,内存和硬盘间的速度差距也很大,需要通过读写缓冲区来进行速度匹配,内存写入磁盘时先写入缓冲区,读数据时从缓冲区读取硬盘准备好的数据。

 

内存管理和虚拟内存

 

由于程序的大小越来越大,而计算机想要支持多道程序,当一个程序遇到 IO 操作时转而去执行另一个程序,这就要求内存中装有多个程序的代码了。

然而程序的内存消耗与日俱增,同时装载多个程序越来越困难,所以人们提出了,只在程序需要使用到的时候再把他装入内存,平时把代码放在硬盘中即可。

分页

由于内存需要装载硬盘中的数据,所以需要约定一个存储单元,操作系统把它叫做页,一个页一般长度是8kb或者16kb。内存从硬盘读取数据时读取的是一个页或多个页。

虚拟内存

由于这些代码持久化在硬盘中,占用了一部分空间,并且需要运行时会加载到内存中,所以这部分的空间一般也成为虚拟内存的空间(大小)。

页表和页面置换算法

为了知道每个程序对应的代码存在硬盘中的位置,操作系统需要维护一个程序到页面的映射表,CPU 要内存加载一个页面时,首先要访问页表,来得知页面在硬盘中的位置,然后让内存去该位置把对应的页面调入内存中。

为了提升页面调入的效率,也使用了多种的页面置换算法,比如lru最近最久未使用,fifo先进先出,时钟法,多级队列法等。

当然,为了进一步提高效率,还会使用多级页表的方式,不过一般需要硬件维护一个页表映射页面的快速转换结构,以便能迅速地完成页面解析和调度。

中断

中断 指CPU 在收到外部中断信号后,停止原来工作,转去处理该中断事件,完毕后回到原来断点继续工作。

中断过程:中断请求,中断响应,中断点(暂停当前任务并保存现场),中断处理例程,中断返回(恢复中断点的现场并继续原有任务)

 

分页和分段

分页是上述所说的,通过内存和硬盘的约定,将调度单元设定为一个页面。

分段则不同,分段并不是物理意义上的分段,而是逻辑上把代码使用到的空间划分成多个部分,比如受保护部分,公开部分,
核心部分等,这样可以更好地描述每个段的代码信息,为使用者提供便利,为了支持程序员的这种需求,操作系统加入了分段的概念,
将代码对应的一段虚拟内存划分为不同的逻辑段。

同时为了根据不同段来以不同方式访问内存,操作系统需要另外维护一个段表,以用于段的映射。

由于分段只是逻辑上的概念,所以底层的内存分页仍然是必不可少的,因此在逻辑段的基础上,物理上又会划分为多个页,一个段中可能包含了多个页面。

因此,完善的虚拟内存管理器需要支持段页表,先映射段,再映射页面。

进程与线程

进程

进程是操作系统资源分配的基本单位,操作系统为进程开辟一段内存空间,内存空间从高位向低位,包括函数调用栈,变量以及其他区域。CPU根据这些信息配合寄存器进行函数调用和程序执行。

每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;系统在运行的时候会为每个进程分配不同的内存空间

多进程

由于计算机是分时系统,所以多进程的使用不可避免,操作系统需要进行进程的切换,方法是内存指针指向新位置,保存原来的进程信息,同时刷新寄存器等数据。然后开始执行新的进程。

一般操作系统会使用pcb结构来记录进程的信息和上下文。通过他和cpu配合来完成进程切换。

线程

线程是系统调度的基本单位,线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。

比如文本输入工具,一边键入文字一边需要保存数据,如果是单进程执行,则每次输入都触发IO操作,非常耗时,如果一个进程负责输入展示,一个进程负责输入保存,确实速度很快,但是两个进程没办法共享数据。除非使用额外的通讯手段。

多线程

而多线程就好办了,多线程都是基于进程产生的,线程被创建后只需要分配少量空间支持堆栈操作即可,同时线程还共享进程中的内存,所以一般使用进程分配资源,线程进行调度的方式。

操作系统对线程的支持:
一般情况下操作系统都支持线程,并且可以创建内核级线程,内核可以识别线程并且为其分配空间,进行线程调度。
但是内核级线程实现比较复杂,使用起来也不甚方便。

所以往往开发人员会使用用户级线程,用户级线程比如Java的多线程,通过简单的api实现,当需要操作系统支持时,
才使用底层调用api接口进行内核级的系统调用。

但是一般情况下用户级线程是不被内核识别的,也就是说,用户级线程会被内核认为是一个进程,从而执行进程的调度。
这样的话就没有意义了。

所以一般情况下用户级线程会映射到对应的内核级线程中,内核为进程创建一定数量的内核级线程以供使用。
Java中的线程基本上都是使用这种方式实现的。

线程通信和进程通信

线程通信一般只需要使用共享内存的方式即可实现。

而进程通信则需要额外的通信机制。

1 信号量

一般多进程间的同步使用信号量来完成,系统为临界区添加支持并发量为 n 的信号量,多进程访问临界区资源时,首先需要执行p操作来减少信号量,如果信号量等于0则操作失败,并且挂起进程,否则成功进入临界区执行。

当进程退出临界区时,执行v操作,将信号量加一,并唤醒挂起的进程进行操作。

2 管程

管程是对信号量的一个包装,避免使用信号量时出错。

3 管道

直接连接两个进程,一个进程写入管道,另一个进程可以读取管道,但是他不支持全双工,并且只能在父子进程间使用,所以局限性比较大。

4 消息队列

操作系统维护一个消息队列,进程将消息写入队列中,其他进程轮询消息队列看是否有自己的消息,增加了轮询的开销,但是提高了消息的可靠性和易用性,同时支持了订阅消息。

5 socket

socket一般用于不同主机上的进程通信,双方通过 ip 和 port 的方式寻址到对方主机并找到监听该端口的进程,为了完成通信,他们先建立 TCP 连接,在此基础上交换数据,也就完成了进程间的通信。

进程调度

进程调度算法:FIFO 先来先服务,短作业优先,时间片轮转,优先级调度,多级反馈队列等。 

死锁

死锁的必要条件:

1、互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程
请求该资源,则请求进程只能等待。

2、不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。

3、请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,
但对自己已获得的资源保持不放。

4、循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。

死锁的处理方法:

1、鸵鸟

2、死锁预防:在程序运行之前预防发生死锁。

死锁产生的必要条件:必须具备四个必要条件才会发生死锁

预防死锁的办法:破坏产生死锁的四个必要条件之一。

1)破坏互斥条件

互斥使用是资源本身特征所决定的。使用硬、软件结合可改变资源本身特性,例如采用SPOOLing技术可将 “独享” 打印机改变为“共享”的打印机。

2)破坏不可剥夺条件

一个进程在申请新的资源不能立即满足而变为阻塞状态之前,必须释放已占有的全部资源。

3)破坏请求和保持条件——资源静态预分配

在运行前,一次性将其所需要的所有资源分配给该进程。

4)循环等待条件 ——有序资源使用法把系统中的全部资源分别分给一个特定的序号,并且要求每个进程均应严格地按照序号递增的次序请求资源,否则操作系统不予分配。

 

3、死锁避免

银行家算法用于在程序运行时避免发生死锁。

银行家算法用于在程序运行时判断资源的分配情况是否是安全状态,如果某一步骤使程序可能发生死锁,银行家算法会拒绝该操作执行,从而避免进入不安全状态。

(一)安全状态

定义:如果没有死锁发生,并且即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每一个进程运行完毕,则称该状态是安全的。

(二)单个资源的银行家算法

一个小城镇的银行家,他向一群客户分别承诺了一定的贷款额度,算法要做的是,判断对请求的满足是否会进入不安全状态,如果是,就拒绝请求;否则予以分配。

 

4、死锁检测和恢复

银行家算法检测程序并且阻止死锁发生,而死锁检测和恢复则不试图阻止死锁,而是当检测到死锁发生时,采取措施进行恢复。

(一)每种类型一个资源的死锁检测

(二)每种类型多个资源的死锁检测

......

 

存储管理

 

分配、回收空闲区,页面式存储,逻辑地址和物理地址,页面置换算法,抖动?

虚拟存储器:虚拟存储器是指具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。其逻辑容量由内存容量外存容量之和所决定,其运行速度接近于内存速度,而每位的成本却又接近于外存。

虚拟机:指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统

虚拟存储器的实现方法:请求分页系统

请求分页的页表机制、缺页中断机构、地址变换机构

地址映射就是要建立虚拟地址与内存地址的关系:静态分配、动态分配

静态要求是非连续存储的,动态可以是连续存储的,动态存储是虚拟存储的基础。

为了实现扩容,程序执行过程中必须内存外存经常交换数据。

人换---覆盖技术程序员需要提前划分顺序和程序段,使得执行时只执行一段

系统控制--交换方式,请求调入和预调入方式

【与覆盖的区别】:

1) 交换不要求程序员给出程序段之间的覆盖结构。

2) 交换主要是在进程或作业之间进行,而覆盖则主要在同一个作业或进程内进行。

3) 覆盖只能覆盖那些与覆盖程序段无关的程序段。

 

IO和磁盘

磁盘是块设备,键盘是字符设备,网卡是网络设备。他们都接在IO总线上,属于慢速设备。

磁盘和寻址

磁盘的结构比较复杂,主要通过扇区,盘面 和 磁头位置决定当前访问的磁盘位置。

cpu为了能够访问磁盘内容,首先要把磁盘的内容载入内存中,于是要和内存约定统一的寻址单元,cpu指定一个起始位置,访问该位置以后的n个存储单元,一般存储单元是一个页,16K或者8K。

这一操作中,指向起始位置需要随机寻址,而接下来的访问操作是顺序访问,磁盘的随机读写和顺序读写的速度差距是很大的。所以一般会通过缓冲区来缓存IO数据。

磁盘内部一般也会分为很多部分,比如操作系统会将磁盘做一个分区,使用磁盘的一些位置存储元数据信息,以保证磁盘能够支持操作系统以及
文件系统。

一般在物理分区的起始位置会有一个引导区和分区表,BIOS自动将磁盘中引导区的内核程序载入内存,此时操作系统才开始运行,并且根据分区
表操作系统可以知道每个分区的起始位置在哪。

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

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

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

实际的数据传输时间

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

1、先来先服务 FCFS, First Come First Served

2、按照磁盘请求的顺序进行调度:优点是公平和简单。缺点也很明显,因为未对寻道做任何优化,使平均寻道时间可能较长。

3、最短寻道时间优先 SSTF, Shortest Seek Time First

        优先调度与当前磁头所在磁道距离最近的磁道。       

        虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两边的磁道请求更容易出现饥饿现象。

           

4、电梯算法 SCAN

        电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。

        电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。

        因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。

IO设备

除了硬盘以外,还有键盘,网卡等IO设备,这些设备需要操作系统通过驱动程序来进行交互,驱动程序用于适配这些设备。

为了执行IO操作,内核一般要为IO设备提供一个缓存区,比如网卡的IO操作,会为socket提供一个缓存区,当多个socket使用一个缓冲区进行通信,就是复用了缓冲区,也就是IO复用的一种方式。

同时,内核还会维护一个IO请求的列表,当IO请求就绪时,让几个线程去执行IO操作,实现了线程的复用。

文件系统

文件系统是基于底层存储建立的一个树形文件结构。比较经典的是Linux的文件系统,首先在硬盘的超级块中安装文件系统,磁盘引导时会加载文件系统的信息。

linux使用inode来标识任意一个文件。inode存储除了文件名以外的文件信息,包括创建时间,权限,以及一个指向磁盘存储位置的指针,那里才是真正存放数据的地方。

一个目录也是一个inode节点。

详细阐述一次文件访问的过程:

首先用户ls查看目录。由于一个目录也是一个文件,所以相当于是看目录文件下有哪些东西。

实际上目录文件是一个特殊的inode节点,它不需要存储实际数据,而只是维护一个文件名到inode的映射表。

于是我们ls到另一个目录。同理他也是一个inode。我们在这个inode下执行vi操作打开某个文件,于是linux通过inode中的映射表找到了我们请求访问的文件名对应的inode。

然后寻道到对应的磁盘位置,读取内容到缓冲区,通过系统调用把内容读到内存中,最后进行访问。

磁盘调度

优缺点

先来先服务FCFS:公平、简单,且每个进程的请求都能依次地得到处理。未对寻道进行优化,致使平均寻道时间可能较长。

最短寻道时间优先(SSTF):磁道与当前磁头所在的磁道距离最近。以使每次的寻道时间最短。

但不能保证平均寻道时间最短。可能导致某个进程发生“饥饿”(Starvation)现象。

扫描(SCAN) 算法:磁道与当前磁道间的距离,与磁头移动的方向----电梯式上下。可

防止老进程出现“饥饿”现象,广泛用于大、中、小型机器和网络中的磁盘调度。

循环扫描(CSCAN)算法:磁道与当前磁道间的距离,磁头单向移动---0到100,又0到100

磁盘冗余阵列技术:通过多个磁盘上存储冗余信息,一个磁盘损坏并不会导致数据丢失,提高性能和可靠性

 

文件资源

 

文件的分类的目的 主要是为了提高处理速度 和 起保护与共享 的作业。

文件的逻辑结构可分为两大类:字符流式的无结构文件和记录式的有结构文件。

文件的存取方法:1.散列表,2.顺序,3二分法.

对文件目录的管理就是对文件说明信息的管理。利用文件说明信息,可以完成对文件的

创建、检索以及维护作用

文件目录可分为单级目录、二级目录和多级目录

单级目录:文件系统为存储设备的所有文件建立一张目录表。)--每个文件在其中占有一项用来存放文件说明信息-----------最简单,效率低,不能重名,所有项目地位平等

二级目录: 以用户为单位把各自的文件说明划分为不同的组。) 用户文件的文件说明所组成的目录文件被称为用户文件目录(UFD) 。) 不同的组名有关存取控制信息存放在主目录(MFD)的目录项中。) MFD和UFD就形成二级目录-----------可重名科共享,效率高

多级目录:将二级进行推广,由此形成层次关系,最高层为根目录,最低层为文件。) 多级目录构成树形结构---------------层次清楚,可重名,效率高

文件存储设备:

存储设备的特性决定了文件存取设备和方法;磁带---顺序存取设备;磁盘--直接存取设备。

顺序存取设备:前面的物理块被存取访问过之后,才能存取后续的物理块内容。为了让磁带机加速和不停止的在下一个物理块的位置上,磁带的两相邻的物理块之间设计有一个间隙将它们隔开。信息密度大,所需块间隙小的话,则磁带存取速度和数据传输率高。

优缺点容量大、存取速度高。如果按随机方式或按件存取方式存取磁带上的文件信息的话,效率不是很高。

直接存取设备:允许文件系统直接存取磁盘上的任意物理块。为了存取一个特定的物理块,磁头将直接移动到所要求的物理块上。

 

参考:

https://www.cnblogs.com/Amyheartxy/p/9262165.html

https://github.com/h2pl/Java-Tutorial/blob/master/md/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93.md

未完善完全......待完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值