操作系统学习笔记
操作系统学习笔记
1、基本概念
1. 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石;
2. 操作系统本质上是运行在计算机上的软件程序 ;
3. 操作系统**为用户提供一个与系统交互的操作界面** ;
4. 操作系统分**内核与外壳**(我们可以把外壳理解成围绕着内核的应用程序,而内核就是能操作硬件的程序)
内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,决定着系统的性能和稳定性。是连接应用程序和硬件的桥梁。 内核就是操作系统背后黑盒的核心。
用户态和系统态:
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
-
用户态(user mode) : 用户态运行的进程或可以直接读取用户程序的数据。
-
系统态(kernel mode):可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。
运行的程序基本都是运行在用户态:当需要使用与系统态级别的资源有关的操作,都需要以系统调用方式向操作系统提出操作请求,并由操作系统代为完成。
系统调用可以分为以下几类
设备管理
文件管理
内存管理
进程控制
进程通信
1、并发
2、共享
3、虚拟
4、异步
进程不是一次性执行完成,而是走走停停,以不可知的速度向前推进
大内核
将操作系统的功能作为一个紧密结合的整体放到内核
各模块共享信息,具有很高的性能
微内核
将一部分操作系统的功能移出内核,降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立
微内核结构下操作系统被划分成小弟、定义良好的模块,只有微内核这一个模块运行在内核态,其余模块运行在用户态。
需要频繁的在内核态和用户态间来回切换,会有一定的性能损失。
2、进程和线程
1、区别
进程和线程的本质区别是是否占有独立的内存地址空间和系统资源。
不同进程之间是相互独立的,他们拥有独立的内存单元,是操作系统进行资源分配的基本单位。
线程是进程划分的粒度更小的运行单位,是操作系统进行调度的基本单位。
一个进程可能有一个或多个线程,线程必须要依附于进程,不能独立的执行,同一个进程的线程之间,共享该进程的资源。
线程的创建销毁开销更小,但是线程的稳定性更差,一个线程的崩溃可能会导致整个进程的崩溃。
进程的创建销毁开销大,但是他们之间是相互独立的,不会互相影响。
2、进程的状态
创建状态(created):正在被创建
就绪状态(ready):创建完成,等待处理器资源
运行状态(running):正在运行
阻塞状态(blocked):等待某一事件,而暂停运行,即使处理器空闲也不执行
例如等待某资源可用,或者IO完成
结束状态(terminated):进程从系统中消失
3、进程间通信
进程间的通信必须通过内核来完成,基本的方式是在内核中开辟一片缓冲区,进程1写入,进程2读出。
具体有七种方式
1、管道(匿名管道)pipe,就是上面的缓冲区,特点是半双工,实现全双工需要两个管道
没有名字,只能用于父子进程或者兄弟进程 间
类似队列的形式,进程2只能依次取出早放入的数据
管道只存在于**内存**中,
管道满、空时有等待,唤醒机制来控制双发的读取
2、有名管道(FIFO)
不同于匿名管道,这个有名字,并且以文件的形式存在,不同进程通过名字可以访问通信, 先入先出
3、信号
linux系统中
一个进程发送一个信号给另一个进程,内核保存起来,等待另一个进程执行时传递给它
4、消息队列
消息队列以消息链表的形式 存在于内核中
允许一个或多个进程读写数据
可以实现消息的查询,消息不一定要以先进先出的次序读取,也可以按照消息的类型读取
5、共享内存
内核专门留出的一块内存区域,需要访问的进程将其映射到自己的内存地址空间,然后可以直接读写。
但是需要同步机制(如信号量)
6、信号量 共享区域的同步机制,计数器,加1,减1,控制最大访问数
7、套接字 客户端和服务端间网络通信
3、进程调度算法
先到先服务
短作业优先
时间分片轮转
优先级调度:为每个流程分配优先级,首先执行具有最高优先级的进程
多级反馈队列调度
进程进入系统时被地分配到某个队列。多级反馈队列调度 据不同 CPU 执行的特点来区分进程。如果进程使用过多的 CPU 时间,那么它会被移到更低的优先级队列。
3、死锁
什么是死锁?
两个或多个进程(线程)在执行过程中,由于资源竞争造成互相阻塞的现象,若无外力作用,他们都无法推进下去
死锁的条件
1、互斥,每个资源同一时刻只能被一个进程占有
2、占有和等待,已经获得资源的进程可以继续请求资源
3、不可剥夺,被占有的资源只能由占有进程显示释放,不能被强制性的抢占
4、环路等待,两个或两个以上的资源互相等待对方释放资源,形成环路
怎么解决死锁
主要有4种策略
1、鸵鸟策略:直接忽略死锁,什么也不做。因为解决死锁带来的代价消耗可能比死锁本身更大。当死锁不会造成太多的影响或者发生概率很低的时候适用。大多数操作系统,包括 Unix
,Linux
和 Windows
,处理死锁问题的办法仅仅是忽略它。
2、死锁预防:通过破环死锁条件,防止形成死锁,缺点是可能导致所有进程变慢
破坏互斥:不让资源被一个进程独占,可通过假脱机技术允许多个进程同时访问资源;
破坏占有和等待:两种方式,一种让进程一次性申请所有资源,另一种每次申请资源前都释放占有的资源,重新申请;
破环不可剥夺:虚拟化技术实现
破环环路等待:对资源进行统一编号,进程可以在任何时候请求资源,但必须按照顺序请求资源
3、死锁避免:从资源和线程的三个关系着手,允许前三个条件,但是通过算法判断资源请求是否会导致环路等待,来阻止请求或进程的启动。前提是需要知道资源的整体使用情况和进程的申请细节。
4、死锁检测和恢复:允许进入死锁状态,通过算法来检测死锁,对其进行恢复。需要维护一个资源的分配图。
恢复的方法包括:
杀死死锁的线程
回滚到某些检查点,然后重启
连续抢占资源直至死锁恢复
4、内存管理
1、虚拟内存
早期的操作系统中是直接使用物理内存的,但是直接使用物理内存存在诸多问题
1、内存利用率:内存碎片化浪费掉内存
2、读写内存的安全性问题:物理内存的访问不受限制
3、进程之间的安全性问题:进程间没有独立的地址空间
4、内存读写效率的问题:频繁的拷贝进程的数据到硬盘中
操作系统在每个进程创建时为其分配一个大小4G的连续的虚拟内存,这片内存又分成许多大小固定的页,同时对应于物理内存够中相同大小的页。虚拟页分成三种状态,未分配的,已缓存的,未缓存的。未分配的页不占用任何磁盘空间,其他的都有映射的物理内存页。
虚拟内存向进程提供了一个完整的连续的内存空间,但在物理内存中采用离散存储。通过页表来实现虚拟内存和物理内存的对应。
其目的是把物理内存扩充成为更大的逻辑内存,让内存获得更多的可用内存,同时使进程认为自己拥有连续的可用内存空间
5、linux的文件系统
linux中一切皆是文件,一切 资源都看作文件,它磁盘被分为许多小块block(大小1k,2k,4k)
linux文件ext文件系统 将硬盘分区时会划分出 目录块,inode table 和datablock 区域
目录块表示树状的文件和目录的结构,叶子节点为一个具体的文件或空目录。
每一个一个文件由一个目录项,inode, 和数据 组成
目录项 包括文件名 和 inode编号
inode包括文件的 权限属性,类型,owner 和数据指针等信息,
数据块则是文件内容,
当查看文件时会先从inode中读取属性,再从数据块中读取文件
硬链接和符号连接
硬连接就是一个目录项,包括文件名 和 inode编号,删除任意一个条目,文件还是存在,只要引用数量不为 0
。但是硬链接有限制,它不能跨越文件系统,也不能对目录进行链接。
符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上,可以理解为 Windows
的快捷方式。当源文件被删除了,链接文件就打不开了。因为记录的是路径,所以可以为目录建立符号链接。