操作系统学习笔记

计算机系统概述基本构成
CPU 内存 I/O 系统总线
PC 程序计数器
IR 指令寄存器
MAR 存储器地址寄存器
MBR 存储器缓冲寄存器
I/O AR I/O地址寄存器
I/O BR I/O缓冲寄存器中断
中断:其他模块(I/O,存储器)中断处理器正常处理过程的机制。
  • 程序中断
  • 时钟中断
  • 硬件失效中断
  • I/O中断

多中断的处理方式
第一种方法是当正在处理一个中断时,禁止再发生中断。
第二种方法是定义中断优先级,允许高优先级的中断打断低优先级的中断
处理器的运行。高速缓冲存储器
高速缓冲存储器是比主存小而快的存储器,用以协调主存跟处理器,作为最近
储存地址的缓冲区。存储器的层次结构
价格, 容量, 访问时间
速度: 寄存器 > 高速缓存 > 内存 > 磁盘高速缓存的设计
  • 高速缓存大小
  • 置换算法
  • 块大小
  • 写策略
  • 映射函数
  • 高速缓存的级数

I/O操作的三种技术
  • 可编程I/O
  • 中断驱动I/O
  • 直接存储访问

操作系统概述
  • 作为 用户/计算机 接口
  • 作为资源管理器

批处理 多道程序设计目标 : 充分使用处理器
分时 目标: 减少相应时间操作系统的内核
内核是操作系统最常使用的部分,它存在于主存中并在特权模式下运行,响应进程调度和设备中断。多道程序设计
多道程序设计是一种处理操作,它在两个或多个程序间交错处理每个进程。实地址和虚地址
虚地址指的是存在于虚拟内存中的地址,它有时候在磁盘中有时候在主存中。 实地址指的是主存中的地址。内存管理的任务
  • 进程隔离
  • 自动分配和管理
  • 支持模块化程序设计
  • 保护和访问控制
  • 长期存储

操作系统的控制结构
操作系统维持着四种不同类型的表:内存,I/O,文件,进程
内存,I/O和文件是代表进程而被管理的,因此进程表必须有对这些资源的直接或者间接引用。进程
进程是操作系统对正在运行的程序的一种抽象
吧进程状态
  • 运行态:该进程正在执行
  • 就绪态:进程做好了准备,只要有机会就开始执行
  • 阻塞态:进程在某些事件发生前不能执行,如I/O操作完成
  • 新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中
  • 退出态:操作系统从可执行进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消

进程阻塞和挂起
阻塞:进程是否等待一个事件
挂起:进程是否已经被换出内存进程抢占
处理器为了执行另外的进程而终止当前正在执行的进程,这就叫进程抢占进程映像
  • 用户数据
  • 用户程序
  • 系统栈
  • 进程控制块

交换
交换是指把主存中某个进程的一部分或者全部内容转移到磁盘。当主存中没有处于就绪态的进程时,操作系统就把一个阻塞的进程换出到磁盘中的挂起队列,从而使另一个进程可以进入主存执行进程间通信
1、管道:管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。
无名管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系(通常是指父子进程关系)的进程间使用。
命名管道:命名管道也是半双工的通信方式,在文件系统中作为一个特殊的设备文件而存在,但是它允许无亲缘关系进程间的通信。当共享管道的进程执行完所有的I/O操作以后,命名管道将继续保存在文件系统中以便以后使用。
2、信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
3、消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4、信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
5、共享内存:共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信。
6、套接字:套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信。进程控制块
进程标识,处理器状态信息,进程控制信息用户模式和内核模式
用户模式下可以执行的指令和访问的内存区域都受到限制。这是为了防止操作系统受到破坏或者修改。而在内核模式下则没有这些限制,从而使它能够完成其功能创建新进程的步骤
  1. 给新进程分配一个唯一的进程标识号。
  2. 给进程分配空间。
  3. 初始化进程控制块。
  4. 设置正确的连接。
  5. 创建或扩充其他的数据结构。

模式切换和进程切换的区别
发生模式切换可以不改变当前正处于运行态的进程的状态。发生进程切换时,一个正在执行的进程被中断,操作系统指定另一个进程为运行态。进程切换需要保存更多的状态信息线程线程和进程的区别
①从概念上:
进程:一个程序对一个数据集的动态执行过程,是分配资源的基本单位。
线程:一个进程内的基本调度单位。线程的划分尺度小于进程,一个进程包含一个或者更多的线程。
②从执行过程中来看:
进程:拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率。
线程:每一个独立的线程,都有一个程序运行的入口、顺序执行序列、和程序的出口。但是线程不能够独立的执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
③从逻辑角度来看(重要区别):
多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但是,操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及资源分配。互斥和同步临界区
临界资源就是一次只允许一个进程访问的资源
所谓临界区就是进程中访问临界资源的那段程序代码同步机制应遵循的准则
空闲让进,忙则等待,有限等待,让权等待PV
P,V操作是因为Dijkstra是荷兰人,P指的是荷兰语中的“proberen”,意为“测试”,而V指的是荷兰语中的“verhogen”,意为“增加”。
 
 
1
2
3
4
5
6
=inherit !importantP=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantwhile=inherit !important =inherit !important(=inherit !importantS≤=inherit !important0=inherit !important)=inherit !important  =inherit !important{=inherit !importantdo=inherit !important =inherit !importantnothing=inherit !important}=inherit !important;
 
=inherit !important        =inherit !importantS=inherit !important==inherit !importantS=inherit !important-=inherit !important1=inherit !important;
 
=inherit !importantV=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantS=inherit !important==inherit !importantS=inherit !important+=inherit !important1=inherit !important;
 
 
但是这样明显违反了“让权等待的原则”记录型信号量
 
 
1
2
3
4
5
6
7
8
=inherit !importantP=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important==inherit !important =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important-=inherit !important1=inherit !important;
=inherit !important    =inherit !importantif=inherit !important(=inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important&=inherit !importantlt=inherit !important;=inherit !important =inherit !important0=inherit !important)
=inherit !important       =inherit !importantblock=inherit !important(=inherit !importantS=inherit !important,=inherit !importantQ=inherit !important)=inherit !important;
 
=inherit !importantV=inherit !important(=inherit !importantS=inherit !important)=inherit !important:=inherit !important   =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important==inherit !important =inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important+=inherit !important =inherit !important1=inherit !important;
=inherit !important    =inherit !importantif=inherit !important(=inherit !importantS=inherit !important.=inherit !importantvalue=inherit !important =inherit !important&=inherit !importantlt=inherit !important;=inherit !important==inherit !important =inherit !important0=inherit !important)
=inherit !important        =inherit !importantwakeup=inherit !important(=inherit !importantS=inherit !important,=inherit !importantQ=inherit !important)=inherit !important;
 
 
P操作相当于“等待一个信号”,而V操作相当于“发送一个信号”,在实现同步过程中,V操作相当于发送一个信号说合作者已经完成了某项任务,在实现互斥过程中,V操作相当于发送一个信号说临界资源可用了。实际上,在实现互斥时,P,V操作相当于申请资源和释放资源。
同步与互斥实现的P,V操作虽然都是成对出现,但是互斥的P,V操作出现在同一个进程的程序里,而同步的P,V操作出现在不同进程的程序中死锁和饥饿
  • 死锁预防
  • 死锁避免
  • 死锁检测

死锁的条件
  • 互斥
  • 占有且等待
  • 非抢占
  • 循环等待

内存管理内部碎片和外部碎片
内部碎片是指由于被装入的数据块小于分区大小而导致的分区内部所浪费的空间。外部碎片是与动态分区相关的一种现象,它是指在所有分区外的存储空间会变成越来越多的碎片的逻辑地址、相对地址和物理地址
逻辑地址是指与当前数据在内存中的物理分配地址无关的访问地址,在执行对内存的访问之前必须把它转化成物理地址。
相对地址是逻辑地址的一个特例,是相对于某些已知点(通常是程序的开始处)的存储单元。
物理地址或绝对地址是数据在主存中的实际位置。页和帧
在分页系统中,进程和磁盘上存储的数据被分成大小固定相等的小块,叫做页。而主存被分成了同样大小的小块,叫做帧。一页恰好可以被装入一帧中。页和段
分段是细分用户程序的另一种可选方案。采用分段技术,程序和相关的数据被划分成一组段。尽管有一个最大段长度,但并不需要所有的程序的所有段的长度都相等虚拟内存简单分页与虚拟分页
简单分页:一个程序中的所有的页都必须在主存储器中程序才能正常运行,除非使用覆盖技术。
虚拟内存分页:不是程序的每一页都必须在主存储器的帧中来使程序运行,页在需要的时候进行读取。页表项
  • 帧号:用来表示主存中的页来按顺序排列的号码。
  • 存在位(P):表示这一页是否当前在主存中。
  • 修改位(M):表示这一页在放进主存后是否被修改过

驻留集和工作集
一个进程的驻留集是指当前在主存中的这个进程的页的个数。
一个进程的工作集是指这个进程最近被使用过的页的个数。单处理器调度
  • 短程调度
  • 中程调度
  • 长程调度

多处理器和实时调度I/O管理和磁盘调度文件管理文件组织
  • 顺序文件
  • 索引顺序文件
  • 索引文件
  • 直接或者散列文件

文件分配方法
  • 连续文件
  • 链接文件
  • 索引文件

链接库动态链接库与静态链接库的区别
静态链接库是.lib格式的文件,一般在工程的设置界面加入工程中,程序编译时会把lib文件的代码加入你的程序中因此会增加代码大小,你的程序一运行lib代码强制被装入你程序的运行空间,不能手动移除lib代码。
动态链接库是程序运行时动态装入内存的模块,格式*.dll,在程序运行时可以随意加载和移除,节省内存空间。
在大型的软件项目中一般要实现很多功能,如果把所有单独的功能写成一个个lib文件的话,程序运行的时候要占用很大的内存空间,导致运行缓慢;但是如果将功能写成dll文件,就可以在用到该功能的时候调用功能对应的dll文件,不用这个功能时将dll文件移除内存,这样可以节省内存空间

2 个评论

@xielei 排版还是不行。
我们调整一下

要回复文章请先登录注册