操作系统
1: 操作系统基本特征
- 并发:并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。
- 共享:共享是指系统中的资源可以被多个并发进程共同使用。有两种共享方式:互斥共享和同时共享。 互斥共享的资源称为临界资源,例如打印机等,在同一时间只允许一个进程访问,需要用同步机制来实现对临界资源的访问。
- 虚拟:虚拟技术把一个物理实体转换为多个逻辑实体。主要有两种虚拟技术:时分复用技术和空分复用技术。例如多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一小个时间片并快速切换。
- 异步:异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。
2: 进程和线程的区别
- 调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。
- 拥有资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
- 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
- 通信方面:进程间通信 (IPC) 需要进程同步和互斥手段的辅助,以保证数据的一致性。而线程间可以通过直接读/写同一进程中的数据段(如全局变量)来进行通信。
- 并发性:进程和进程之间可以并发执行,同个进程的多个线程之间也可以并发执行
3:死锁
当多个进程应竞争资源或相互通信而处于永久阻塞状态,阻塞状态中的每一个进程都等待着被其他进程所占有的自己永远无法获得的资源,这种现象称为死锁 - 死锁的四种处理方法:看天勤
4:虚拟内存
虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。 让程序部分装入内存即可运行的技术,称为虚拟内存管理技术
- 虚拟内存基于局部性原理
- 时间局部性:指令的一次执行和下次执行,数据的一次访问和下次访问都是集中在一个较短的时间内
- 空间局部性:当前指令和邻近的几条指令,当前访问的数据和邻近的数据都是集中在一个较小的区域内
5:缓冲的引入
缓冲区的引入,主要是缓和CPU和设备速度不匹配的问题。例如用户一边计算数据,一边输出数据,如果不使用缓冲区的话,由于IO输出的速率远小于CPU计算的速度,所以CPU会停下来等待。因此,可以设置一个缓冲区,则用户进程可以先把数据输出到缓冲区,然后继续执行。打印机则可以从缓冲区中慢慢取出数据打印,不会影响用户进程的执行
高速缓存和缓冲区的区别
高速缓存是可以保存数据备份的高速存储器。访问高速存储器比访问原始数据要快的多。
- 两者之间的区别
- 两者存放的数据不同。高速缓存上存放的是低速设备上的备份数据,而缓冲区上存放的是低速设备传递给高速设备的数据,这些设备从低速设备传到缓冲区,再传到高速设备,不一定在低速设备上有备份
- 两者的目的不同。高速缓存的目的是为了存放低速设备上经常会被访问的数据,这样不需要每次到低速设备去读取,但如果高速缓存中没有的数据还是会到低速设备中去读取;而缓冲区是为了缓和高速设备和低速设备速度不匹配的问题,高速设备和低速设备之间的通信每次都会经过缓冲区,高速设备不会直接访问低速设备。
6:进程调度算法
自己去看书,这里不列出来了
7:进程通信
进程通信:是指在不同进程之间传播或交换信息(IPC)
无名管道
- 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
- 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
- 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
命名管道
- FIFO可以在无关的进程之间交换数据,与无名管道不同。
- FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
- 命名管道可以支持全双工通信
消息队列
- 消息队列,是消息的连接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识
- 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
- 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
- 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
信号量
- 它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
- 信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
- 信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
- 每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
共享内存
- 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
- 因为多个进程可以同时操作,所以需要进行同步。
- 信号量+共享内存通常结合在一起使用,信号量用来步对共享内存的访问。进程通信还有socket,socket支持不同主机上的两个进程进行通信。
8: 应用程序的编译、链接和装入
应用程序从用户编写的源文件到内存中执行的进程,大致分为三个阶段:首先,经过编译程序将源代码编译成一个个的目标模块;其次通过链接程序将编译好的目标模块以及所需的库函数链接在一起,形成完整的装入模块,最终通过装入程序装入内存执行。
- 当装入程序将可执行代码装入内存时,程序的逻辑地址和程序在内存的实际地址通常不同,这就需要地址转换将逻辑地址转换为物理地址,这个过程称为重定位。
-
程序的链接方式有三种
- 静态链接:在程序运行之前,先把各个目标模块及所需的库链接成一个完整的可执行程序,以后不再拆开
- 装入时动态链接,将目标模块装入内存时采用边装入边链接的动态链接方式
- 运行时动态链接,直到程序运行时,需要用到哪些模块时,才链接这些模块。在执行过程中,发现一个被调用模块尚未装入内存时,立即去找该模块并将之装入内存,然后把它链接到调用者模块上。凡在执行过程中未被用到的模块都不会被装入内存和链接到装入模块上,这样不仅节省了内存空间,同时缩短了程序的装入过程
-
程序的装入也有三种方式
- 绝对装入。在编译的时候就知道程序将要驻留在内存的物理地址,编译程序产生还有物理地址的目标代码
- 可重定位装入。根据内存当前的情况将装入模块装入到内存的适当位置。地址变换通常在装入时一次完成,之后不再改变,也称为静态重定位
- 动态运行时装入,装入模块装入内存的时候也都是相对地址,只有当该程序被访问时,才把相对地址转换为物理地址,由于重定位过程是在程序执行期间随着指令的执行完成的,所以称之为动态重定位。需要借助重定位寄存器。
- 我的理解是借助重定位寄存器后,它是把程序在内存中的起始地址放到重定位寄存器中,之后执行作业时访问内存时就把逻辑地址加上该重定位寄存器中的值,在执行过程中重定位寄存器中的值可以变化。
-
静态重定位和动态重定位之间的区别:
- 静态重定位需要为每个程序分配一个连续的存储区,如果空间不足以放下整个程序就不能分配,而且在程序执行期间不能移动
- 动态重定位可以将程序分配到不连续的存储空间,在程序运行之前装入它的部分代码即可运行,然后在程序运行期间根据需要动态的申请分配内存
9:动态分区分配——连续分配
- 四种分配算法:首次适应,下次适应,最佳适应和最差适应
- 具体看天勤
离散分配——分页存储管理
- 分页存储管理:将作业分成若干个大小相等的区域,称为页,将内存分成和页同样大小相等的区域,称为块。每一个页可以分到内存中不连续的区域,从而实现了离散分配
- 分页解决了外部碎片问题,内存利用率高;但同时共享困难,有内部碎片
- 分页管理需要两次访问内存,第一次通过访问页表(页表在内存中)来确定所存取的数据或指令的地址,第二次才是根据指令去内存中获取相应的数据或指令。
- 可以使用快表,快表是高速缓冲存储器,访问速度比内存快的多,但造价昂贵,所以为了考虑成本,通常都是把正常运行作业当前访问的那些页表项存放在快表中。
离散分配——分段存储管理
- 程序员一般要求按照逻辑关系将作业分段,以便能根据名字访问相应的程序段和数据段
- 每一段的大小可以不同,分段是两维的(段号为一维,段内偏移为一维),而分页是一维的。因为页号是自动生成的,而段号是程序员自己定义的。
- 每个段是占用的连续的空间,但各个段之间可以不连续
- 段的优点:1.便于共享,便于动态链接和增长;2.便于信息保护;3.没有内部碎片
- 段的缺点:和分页一样,需要硬件支持;有外部碎片