操作系统原理OS复习总结
操作系统原理OS复习总结
写在前面:此文章持续更新,对操作系统原理的学习进行复习总结。相关学习参考内容已列下方,目前水平有限,如有建议,欢迎指正!
References
- 操作系统原理[天津大学,李罡,2013](B站、优酷)
- https://github.com/CyC2018/CS-Notes
- 公众号:Java建设者----文章:写给大忙人看的进程和线程
1. 进程管理
1.1 进程 process
CPU是多道系统,伪并行(单核单CPU)
进程:一段程序的正在被执行的一个实例(有“生命”的)
What is the difference between program and process ?
- Program is just the static text.
- Process is an dynamicentity being executed and has lifecycle.
A process consists of three parts:
- Process Control Block (PCB) or Process Table Entry
- Program (Text代码)
- Data
Unix中除了祖先进程,其他都是fork(“克隆”)自身出来的。共享身子(代码、数据),头不一样(Block)
The fork() system call creates a child process. The exec() system call overlays the existing process with another program. The wait() system call allows the parent process to wait for a child process to terminate. The exit() system call terminates the process.
Process States:
- scheduler(调度器)发起2,3(R和R的转换)
Running和Ready合起来叫Runnable(可运行态)
scheduler(调度器)也可从n个Runnable挑一个去running - Running主动发生1
- 其他进程引发4,Blocked醒了后重新排队
- scheduler优先级很高
process termination:
Normal exit (自杀)
Error exit
Fatal error
Killed by another process (他杀)
1.2 线程 threads
进程是资源分配得最小单位,而进程中的线程共享拥有的资源。
线程是调度得最小单位。
进程的运行时调度内部的线程
Implementing Threads in User Space(用户态、内核态)
线程池(待更新)
1.3 调度 scheduling
- CPU密集型进程
- IO密集型进程
批处理系统:CPU利用率高好
交互式系统:CPU利用率较低好,在意response time
实时系统:达到条件时,立即响应(工业锅炉)
批处理系统的调度:
- First Come First Served
先来先服务 - Shortest Job First
短作业优先 - Shortest Remaining-time Next
-
High Response-ratio First
最高响应比优先
turnaround time/executing time
= (waiting time + executing time)/executing time
= 1 + waiting time / executing time
交互式系统的调度:
- 时间片轮转
- 优先级调度
- 多级反馈队列(时间片轮转调度算法和优先级调度算法的结合)
1.4 竞争条件,PV与信号量 Race Conditions and Semaphore
临界资源:可以共享使用,但不可以同时使用(eg. 打印机)。
临界区(critical regions):使用临界资源的代码
大于2个进程的竞争条件:
- 互斥(Mutex):抢临界资源,且互相无关
- 同步:存在内在逻辑先后(如严格轮转法)
Conditions required to avoid race condition:
- No two processes nay be simultaneously insider their critical regions.
- No assumptions may be made about speeds or the number of CPUs.
- No process running outside its critical region may block other processes.
- No process should have to wait forever to enter its critical region.
解决竞争条件也分为两大类:
- 忙等待 Busy waiting
- 睡眠与唤醒(一般来说节省资源) Sleep and Wakeup
忙等待方案:TSL(Test and Set Lock)。该法关键字:“自旋锁”“忙等待”“原子性,即不可打断”
// TSL代码
enter_region
// MOVE REGISTER, #1
// XCHG REGISTER, LOCK |原子性操作
TSL REGISTER, LOCK |复制lock到寄存器,并将lock置为1 (这句话实现上面两句话) 原子性操作
CMP REGISTER, #0 | lock等于0吗?
JNE enter_region |如果不等于0,已上锁,再次循环
RET |返回调用程序,进入临界区
leave_region
MOVE LOCK, #0 |置lock为0
RET |返回调用程序
Semaphore can be operated by PV operation only.
信号量只有赋初值时可以直接赋,其他只能用P和V来操作它
(注意,信号量还有等待队列部分,不止整数部分)
Semaphore中整数部分物理含义:
- 正数 Positive:the number of resources available.(信号量所代表的资源的可用的个数)
- 0 Zero:no resource available, no waiting process.(没有空闲资源,也没有等着的进程)
- 负数 Negative:the number of process waiting to use the resources.(等待使用该资源的进程个数)
P与V源语不可打断(P下降,V上升)。源语:非常迅速,非常快,不可打断,少量。
// 方案1:PV in Sleep abd Wakeup
P(Semaphore s)
{
s = s - 1;
if (s < 0)
{
add to the semaphore's queue and sleep;
}
}
V(Semaphore s)
{
s = s + 1;
if (s <= 0)
{
wake up the waiting process in the semaphore's queue;
}
}
// 方案2:PV in Busy Waiting
P(Semaphore s)
{
while (!s>0)
{
yield the CPU;
}
s--;
}
V(Semaphore s)
{
s++;
}
以上两个PV均可用打印机例子来思考
方案1,占了,就去睡觉,然后有人叫醒
方案2,忙等待,一直测一直测有没有资源
管程 Monitors
管程可以保证不同时执行。用编译器去编出管程,如Java中给一段代码加synchronized,给另一段代码也加synchronized,这两段代码就不会同时运行。
1.5 进程同步之经典同步问题
同步问题:先检查,后修改,中间有可能被打断,前面检查无效,会出错(TSL,PV都是避免了这样的问题)
1.5.1 生产者消费者问题 The Producer-Consumer Problem
#define N 100
typedef int semaphore;
semaphore mutex = 1; // 生产者消费者互斥访问临界区
semaphore empty = N; // 当前空格子的个数(生产者的)
semaphore full = 0; // 满格子的个数(消费者的)
// empty、full可以叫做通行证
void producer(void)
{
int item;
while(TRUE)
{
item = produce_item();
p(&empty);
p(&mutex);
insert_item(item);
v(&mutex);
v(&full);
}
}
void consumer(void)
{
int item;
while(TRUE)
{
p(&full); //这两个p颠倒 + 生产者两个p也颠倒,会发生死锁
p(&mutex);
item = remove_item();
v(&mutex);
v(&empty);
consume_item(item);
}
}
1.5.2 哲学家就餐问题 Dining Philosophers Problem
// Mutex保护操作
int state[N]
semaphore mutex=1; // 在这种用PV的解决问题的类型中,int这种全局变量,需加Mutex一下
1.5.3 读者写者问题 The Readers and Writers Problem
读者优先的读写者问题:
1.写者、读者互斥访问文件资源。
2.多个读者可以同时访问文件资源。
3.只允许一个写者访问文件资源。
typedef int semaphore;
void reader(void)
{
while(TRUE)
{
down(&mutex);
rc = rc + 1;
if (rc == 1) { down(&db); }
up(&mutex);
read_data_base();
down(&mutex);
rc = rc - 1;
if (rc == 0) { up(&db); }
up(&mutex);
}
void writer(void)
{
while(TRUE)
{
down(&db);
write_data_base();
up(&db);
}
}
}
1.6 进程间通信 IPC Inter-Process Communications
进程同步:控制多个进程按一定顺序执行;
进程通信:进程间传输信息。
进程通信是一种手段,而进程同步是一种目的。也可以说,为了能够达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。
- 管道
- FIFO(命名管道)
- 消息队列
- 信号量
- 共享存储
- 套接字
1.7 死锁 deadlocks
可抢占资源、不可抢占资源(eg. 打印机)
死锁的四个条件:
- Mutual exclusion condition 互斥使用
- Hold and wait condition 拥有并等待(部分拥有,期待更多)
- No preemption condition 不可抢夺
- Circular wait condition 循环等待
解决死锁(忽略、检测、避免、预防)
- Just ignore the problem
鸵鸟算法,假设不发生死锁 - Detection and recovery.
Detection: 矩阵、资源有向图. Recovery: 杀死年轻进程 - Dynamic avoidance by careful resource allocation
银行家算法(安全序列、安全状态) - Prevention by structurally negating one of the four required conditions.
破坏死锁的条件1。进程把这个送到某个队列(spool),等待这个临界资源,相当于送到队列就认为任务完成。(eg. 打印机、送邮件)。该方法和鸵鸟常用广用,其他的无法确定或预期进程需要哪些资源。
1.8 补充
makefile
system call: fork()…and others
多线程
2. 内存管理 memory management
2.1 概述
Primary Memory(aka RAM)
Secondary Memory(ie. hard disk)
CPU只和内存打交道,不和硬盘打交道
- 进程内存模型 Process Memory Layout
代码段(Text Segment):一般只读不可变的。
数据段(Data Segment):(静态)大小固定。
堆区(Heap Storage):大小可变。特点是随机存取。
栈段(Stack Segment):大小可变。特点是先进后出。高地址固定,向低地址方向扩大或缩小。
环境变量区(Environment Variables):由外部,一般为操作系统,设置的变量。
2.2 分区
分区管理是把整体的、连续的放进内存空间,带来无法使用不连续的小空间问题(碎片)。
- Fixed-Partition example 固定分区(有内部碎片)
- Variable-Partition example 可变分区(有外部碎片)
分区管理定位需要基址寄存器 Base register
Memory Manager Strategies MM策略
- Overlaying 覆盖技术(内存小,没法装下全部)
- Swapping 交换技术
分页管理可以分散的放。
2.3 分页 paging
虚拟内存 Virtual Memory
虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。
为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
页表
- 页 page (比如一个页4K,可以自己设置)
- 页帧 page frame
管理页表:
- 加速
Translation Lookaside Buffers, TLB. 放在高速缓存里,又叫快表(故外面的叫慢表)。
A TLB to speed up paging.
如果把页表全放内存里,访问页表也需要很多时间,故把部分项放在Cache里,提高查表速度。 - 变小
分级页表 Multilevel Page Tables
把大页表分成小份,因为一般很多页表项空着
倒排页表 Inverted Page Tables
哈希
两点注意:
中断:恢复现场后执行被中断点的下一条语句。
缺页中断:恢复现场后回来执行被中断的这条语句。
分页存在的问题:
- 剩下没分满的页不好操作
- 机械式按大小分页,把一段程序可能包括main, 子函数,把这些分的不好,如一个页有main和部分子函数
- 与2相同,遇到循环代码,内存还只剩一块,不停存取(极特殊情况),大量时间在换页,而不是执行语句,叫“颠簸”
2.4 分段 segmentation
分段式管理解决了分页管理没有逻辑内在,但又引入了分区管理的问题(碎片)
分段,段内再分页,即段页式管理 Segmentation with Paging
2.5 页面置换算法 page replacement
真实物理内存耗尽,需要把一部分东西换出去,产生了问题,换谁?
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
页表中的标志位:
- P位(protection,在不在内存里)
- R位(referenced,有没有被用过)-----周期性清0
- M位(modified,是不是脏的)
页面置换算法:
页面置换算法内容最好多看在线课程来理解,容易忘
- FIFO, First In First Out
选择换出的页面是最先进入的页面。该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。 - Second Chance Algorithm
FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改:当页面被访问 (读或写) 时设置该页面的 R 位为 1。需要替换的时候,检查最老页面的 R 位。如果 R 位是 0,那么这个页面既老又没有被使用,可以立刻置换掉;如果是 1,就将 R 位清 0,并把该页面放到链表的尾端,修改它的装入时间使它就像刚装入的一样,然后继续从链表的头部开始搜索。 - The Clock Page Replacement Algorithm
第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面连接起来,再使用一个指针指向最老的页面。 - (Least Recently used, LRU) Page Replacement Algorithm
最近最少使用(过去厉害的不一定不淘汰,有优先级,该算法最好,但几乎无法实现)
该算法考虑到了时间和效率,在最近时间内,用的最少。
1.N*N矩阵,行置1,列置0
2.Simulating LRU in software (aging算法)
(00000000)8位,用过置1,下一个时钟周期后移,最后比谁小(高位比地位重要,因为算出数大)相比正宗的LRU缺点:一个周期用了几次不统计,8个周期后就顶出去了。 - Working set page replacement 工作集算法
若R为1,很近一段时间用过。R为0,最近一段时间没用,比年龄,扔掉。(记录时间点) - The WSClock Page replacement algorithm
Not Frequency Used
page stealer, 若页面空间小于Min,开始偷(换),到达到Max为止。不能让其太满,保证内存空闲量处在min和max之间。
2.6 补充
分页与分段的比较:
- 对程序员的透明性:分页透明,但是分段需要程序员显示划分每个段。
- 大小是否可以改变:页的大小不可变,段的大小可以动态改变。
- 出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。
3. 存储管理 storage management
内存 — memory
外存 — storage
内存数据掉电即丢,需要有些放在外存里。
3.1 文件与目录 files and directories
文件包括:
- 普通文件
- 目录文件
- 特殊文件(设备文件,有硬件设备,逻辑设备。把外部设备当文件来管理。others:sockets)
文件结构包括(unix里文件名和属性分开存放):
- 文件名(一个文件可有多个名字(共享文件))
- 属性(判断文件有几个用inode,不用名字)
- 内容
file permission 文件权限(之后Linux总结复习文章会总结这里的相关内容)
目录记录的是文件名字和inode对应关系
文件系统 The Unix File System:多级索引
3.2 文件系统 file systems
文件系统:
3.3 磁盘 disks
Components of storage(由小到大):
- Files
- Directories
- File systems
- Physical storage & logical storage
- Logical Volume Manager (LVM)
面、柱(track,也称磁道)、扇区 -------->定位到data
磁盘调度算法:
读写一个磁盘块的时间的影响因素有:
- 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上)
- 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上)
- 实际的数据传输时间
其中,寻道时间最长,因此磁盘调度的主要目标是使磁盘的平均寻道时间最短。
算法包括:
电梯算法
…
…
…
LVM
3.4 补充
Redundant Array of Independent Disk.
RAID:更快、更可靠、镜像化
RAID0、RAID1、RAID5…
RAM disks 内存中磁盘(为了快,如Cache)
4. 设备管理 Input/Output Devices
Interrupts 中断 ------->现代计算机必备
DMA, Direct Memory Access,用于控制一些高速的传输
Buffering 缓存
5. 字符集
ASCII(American Standard Code for Information Interchange),7位,7个bit(一个字节8个bit)
GBK:国标码
UTF8:保证了ASCII大小不变,还避免了如截断某半个字问题,扩展了其他语言编码。范围最广。
写在结尾:
之后还会陆续更新操作系统相关知识的学习和总结
Linux相关会另外总结一篇文章
目前水平有限,如有建议,欢迎指正!
本文地址:https://blog.csdn.net/qq_40550384/article/details/108440628