第一章:引言
操作系统是配置在计算机硬件上的第一层软件,是对硬件系统的第一次扩充。
操作系统的主要功能:处理机管理,存储器管理,设备管理,文件管理
操作系统的三种基本类型:批处理操作系统,分时操作系统,实时操作系统
批处理是指计算机系统对一批作业自动进行处理的技术
分时系统是为了满足用户需求所形成的一种新型 OS
实时操作系统所谓"实时",即"及时",是指系统能及时(或即时)响应外部 事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行。
分时的概念:主要是指若干并发程序对CPU时间的共享
---------------------------------------------------------------------
第二章:进程管理
进程的参考定义有如下几种:
1、进程是程序的一次执行过程;
2、进程是一个可拥有资源的独立实体,同时又是一个可以独立调度的基本单位。
3、进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。、
进程与程序的区别
进程是一个动态的概念,而程序是一个静态的概念
进程具有并发性,程序顺序性
独立性:进程是能独立运行、独立分配资源和接受调度的基本单位
异步性:进程各自独立的、按不可预知的速度向前推进
一个进程可以包含多个程序;一个程序也可以对应多个进程
进程=程序+数据+PCB ,即进程是一个程序及其数据在处理机上顺序地执行时所发生的活动
进程具有创建其他进程的功能
引起进程创建和进程终止的几个事件
进程创建:
1. 系统初始化
2. 执行了正在运行的进程所调用的进程创建系统调用
3. 用户请求创建一个新进程
4. 一个批处理作业的初始化
进程终止:
1. 正常退出
2. 出错退出
3. 严重错误
4. 被其他进程杀死
临界资源和临界区
临界资源(Critical Resource) :某段时间内只允许一个进程使用的资源
临界区(Critical Section):在每个进程中访问临界资源的那段程序
进程基本状态的转换
进程由哪些部分组成,进程控制块的作用。
程序、数据、进程控制块(PCB)组成
进程控制块的作用是使一个在多道程序环境下不能独立运行的程序成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程
竞争条件:两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序
进程互斥是指由于共享资源所要求的排它性,进程之间要相互竞争,当某一进程正在访问这种资源时,不允许其它进程来访问,否则就会发生后果无法估计的错误。
也即:多个进程不能同时使用某一资源
相互合作的并发进程在一些关键点上可能需要互相等待与互通消息。这种时序上的相互制约关系,或者说是进程之间为了协同工作而存在的一种等待关系,称为进程同步
什么是进程的同步与互斥。【简单理解:同步时伙伴,互斥是竞争】
进程同步是指多个进程中发生的时间存在某种时序关系,必须协同动作、相互配合,以共同完成一个任务
进程互斥是指由于共享资源所要求的排他性,进程之间要相互竞争,某个进程使用这种资源时,其他进程必须等待
原子操作:是指一组相关联的操作要么不间断的执行,要么都不执行
进程=程序+数据+PCB
当创建进程时,为之建立PCB ;当撤消进程时, PCB也随之撤消。
因此, PCB是进程存在的唯一标志,是系统感知进程的唯一实体。
PCB 中记录了OS所需的、用于描述进程的当前情况以及控制进程运行的全部信息。
PCB应常驻内存
。
信号量S的意义
S > 0时,S为可用资源数量;
S = 0时,可用资源正好用完;
S < 0时,资源已用完,|S|为等待资源的队列长度(在信号量上等待的进程数) ,即还欠资源数
了解消息传递、send和receive
Send:发送信息到一个特定的目标
Receive:从给定的来源收到信息
线程的概念,引入线程的目的,线程与进程的区别。
线程是进程中的一个实体,是被系统独立调度和分配的基本单位。
引入线程的目的:为了减少程序并发执行时所付出的时间和空间开销,使操作系统具有更好的并发性
线程和进程的区别:
1调度
v 在引入线程的操作系统中:
§ 线程是调度和分配的基本单位
§ 进程是资源拥有的基本单位
v 把传统进程的两个属性分开,线程便能轻装运行,从而可显著地提高系统的并发程度。
v 在同一进程中,线程的切换不会引起进程的切换;在由一个进程中的线程切换到另一个进程中的线程时,才会引起进程的切换。
2 并发性
v 在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间亦可并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统吞吐量。
3 拥有资源
不论是传统的操作系统,还是设有线程的操作系统,进程都是拥有资源的一个独立 单位,它可以拥有自己的资源。
v 一般地说,线程自己不拥有系统资源(只有一些必不可少的资源),但它可以访问其隶属进程的资源。
4 系统开销
v 由于在创建或撤消进程时,系统都要为之分配或回收资源,因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。
v 进程切换的开销也远大于线程切换的开销。
进度调度的抢占方式和非抢占方式
v 抢占式优先级调度法:任何时刻都严格按照“高优先级进程在处理机上运行”的原则进行进程的调度。
v 非抢占式优先级调度法:当系统中出现了比正在运行的进程优先权更高的进程时,不会剥夺正在运行的进程占有的处理机,该进程会一直运行下去,直到完成或被阻塞,才让另一优先权更高的进程运行。
生产者消费者问题
#define N 100
semaphore mutex=1;
semaphore empty=N; semaphore full=0;
void producer ( ) {
int item;
while (true) {
item = produce_item( );
down(&empty); // decrement empty count
down(&mutex); // enter critical region
insert_item(item);
up(&mutex); // leave critical region
up(&full); // increment count of full slots
} }
void consumer ( ) {
int item;
while (true) {
down(&full); // decrement full count
down(&mutex); // enter critical region
item = remove_item(); // take item from buffer
up(&mutex); // leave critical region
up(&empty); // increment count of empty slots
consume_item(item);
}
}
读者写者问题
semaphore mutex=1, db=1;
int rc=0;
void writer( ) { // 写者进程
while (true) {
think_up_data( );
down(&db); // 排斥对文件的访问
write_database( ); // 写数据
up(&db); // 恢复对文件的访问
}
}
void reader ( ) {
while (true) {
down(&mutex); // 排斥对rc的访问
rc=rc+1;
if (rc==1) down(&db);
// 如果这是第1个读者,则排斥对数据库的写操作
up(&mutex); // 恢复对rc的访问
read_database( ); // 读数据
down(&mutex); // 排斥对rc的访问
rc=rc-1;
if (rc==0) up(&db);
//如果这是最后一个读者,则恢复对数据库的写操作
up(&mutex); // 恢复对rc的访问
}
/*******************算法掌握***************************/
**********************/
---------------------------------------------------------------------
第三章:存储管理
逻辑地址:目标模块中的地址成为逻辑地址
物理地址:内存的绝对地址。
地址重定位:将装入模块装入内存实际牡蛎地址空间,并修改程序中与地址有关的代码,这一过程称为地址重定位
静态重定位:在程序执行之前进行重地位
动态重定位:在程序执行过程中进行重地位
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
将内存等分成大小相同且固定的若干块(或称物理块,或页框),依次命名为第0块、第1块……,称为物理块号(页框号)。
将用户程序的逻辑地址空间划分成同样大小的若干页(或称页面),依次命名为第0页、第1页……,称为页号。
由于进程的最后一页经常装不满一块,从而形成不可利用的碎片,称为“内部碎片(internal fragmentation)”
在分页管理系统中,进程的若干个页被离散地存储在内存的多个存储块中,为了能找到每个页所对应的存储块,系统为每个进程建立一张页表。
页表的基本组成:页号、块号
页表的作用是实现从页号到物理块号的地址映射。
分页和分段的主要区别
(1) 页是信息的物理单位,分页是为了实现离散分配,以解决内存的外部碎片问题,提高内存的利用率,或者说分页是由于系统管理的需要,而不是用户的需要。
段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好地实现共享,满足用户的需要。
(2) 页的大小固定且由系统确定,将逻辑地址划分为页号和页内地址是由机器硬件实现的,因而一个系统只能有一种大小的页面。
段的长度不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时根据信息的性质来划分。
(3) 分页的逻辑地址空间是一维的;分段的地址空间是二维的。
/*****************************算法掌握***************************/
***********************************/
---------------------------------------------------------------------
第四章:文件系统
文件是进程创建的信息逻辑单元
文件系统:操作系统中处理文件的部分称为文件系统
文件系统通常提供目录或文件夹用于记录文件
---------------------------------------------------------------------
第五章:I/O设备
I/O控制方式:程序直接控制方式,中断控制方式,DMA方式,通道方式。
设备的一般分类:块设备(Block devices),字符设备(Character devices);独占设备,共享设备,虚拟设备;低速设备,中速设备,高速设备。
I/O设备的组成:电子部件(electronic component),机械部件(mechanical component)。
Device independence (设备独立性): 用户程序独立于具体物理设备。【it should be possible to write programs that can access any I/O device without having to specify the device in advance】
引入缓冲的目的:
缓和CPU与I/O设备速度不匹配的矛盾
减少对CPU的中断频率,放宽对中断响应时间的限制
提高CPU和I/O设备之间的并行性
SPOOLing技术:将一台独占设备改造成共享设备的一种技术。
SPOOLing组成:
① 输入井和输出井
② 输入缓冲区和输出缓冲区
③ 输入进程SPi和输出进程Spo
实现思想:在联机情况下,实现的输入/输出与CPU的工作并行的操作称为SPOOLing
|
输入缓冲区 |
输出缓冲区 |
|
输入井 |
输出井 |
输入进程SPi |
输出进程SPo |
磁盘 |
输入 设备 |
输出 设备 |
内存 |
① 输入井和输出井
在磁盘上开辟的两个大存储空间
输入井模拟脱机输入时的磁盘,用于收容I/O设备的输入数据
输出井模拟脱机输出时的磁盘,用于收容用户程序的输出数据
② 输入缓冲区和输出缓冲区
在内存中开辟的两个缓冲区
输入缓冲区用于暂存由输入设备送来的数据,以后再传送到输入井
输出缓冲区用于暂存从输出井送来的数据,以后再传送给输出设备
③ 输入进程SPi和输出进程SPo
SPi模拟脱机输入时的外围计算机,将用户要求输入的数据从输入设备通过输入缓冲区再送到输入井
SPo模拟脱机输出时的外围计算机,将用户要求输出的数据,先从内存送到输出井,待输出设备空闲时,再将输出井中的数据,经过输出缓冲区送到输出设备
见下
磁盘臂调度算法
先来先服务FCFS
---------------------------------------------------------------------
第六章:死锁
死锁:在一个进程集合中,若每个进程都在等待某些事件(指:释放资源)的发生,而这些事件又必须由这个进程集合中的其它进程来产生,则该进程集合处于死锁状态。【A set of processes is deadlocked if each process in the set is waiting for an event that only another process in the set can cause.
】
产生死锁的四个必要条件:
Mutual exclusion condition (互斥条件).
Hold and wait condition (占有与等待条件).
No preemption condition (不可抢占条件).
Circular wait condition (环路等待条件).
---------------------------------------------------------------------
第七章:Linux系统
进程描述符是一个名为task_struct的结构体,用于保存进程的属性和其他信息,它在include/linux/sched.h中定义
Linux将进程的创建:
从已经存在的“父进程”复制出一个“子进程”。复制出来的子进程有自己的task_struct和系统空间堆栈,但与父进程共享其它所有的资源。
Pid=fork();
If(pid<0){
Handle_error();
}else if(pid>0){
/*这里是父进程的代码*/
}else{
/*这是子进程的代码*/
}
写时拷贝技术是一种可以推迟甚至免除拷贝数据的技术。
新创建进程时,内核并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝;只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。