操作系统(modifying)

原创 2016年09月20日 00:11:37

操作系统

OS对资源的管理,就是对硬件+软件两种资源的管理。
硬件:CPU+存储(主存)+设备
软件:文件(系统)
这就是操作系统的四个章节。

进程线程

单核达不到程序级并行,但可以达到指令级并行(pipeline)。

进程

基础

概念:
目的:为了实现并发,要不然直接傻瓜调度就行了,就不需要进程了。
进程与程序的区别:动态vs静态;进程有PCB;二者多对多(一个进程可以涉及多个程序–>通过系统调用;一个程序可以对应多个进程–>通过多次执行)

进程状态

状态:运行,阻塞(等待除CPU的资源,如IO,内存等),就绪(等CPU),还有创建&终结
三个核心状态形成四条有向边:
1. 运行 –> 阻塞:等待IO等资源;
2. 阻塞 –> 就绪:IO等资源完成,等待CPU;
3. 就绪 –> 运行:终于抢到了CPU;
4. 运行 –> 就绪:时间片用完了。。。

另外,新建(fork)之后进程处于就绪状态,运行完后进程也可能直接变成结束状态。

进程控制块

是一种数据结构。
包含PID,进程状态,优先级,现场保留区,所需资源已分配资源,调度信息等。现场保留区就是释放CPU时,用来记录CPU此时的寄存器、程序状态字等状态的。
创建进程就是创建PCB,杀死进程就是撤销PCB ==> PCB就是进程存在的标志和唯一代表。它包含了进程的状态调度和控制此进程的所有信息。
进程 = 程序段 + 数据块 + PCB

进程控制

即:创建,撤销,状态转换。
原语primitive
创建start() 撤销exit() 阻塞await() 唤醒notify()
撤销原语撤销的是PCB而不是程序段,因为程序段有可能被几个进程共享。

进程间通信 IPC

管道、信号、消息队列、共享内存、信号量、套接字 等
Pipe:比如cat -A hello.cpp | head,只能承载无格式字节流;
Signal:比如9号代表SIGKILL,所以有kill -9 xxx
消息队列:是消息的链接表,克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点;
共享内存:多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
Socket:更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

进程调度

先来先服务FCFS、轮转(时间片)、优先级法(优先级高的弄完了再释放CPU)、分级轮转(优先级+时间片:多个优先级不同的队列,先处理优先级高的队列)

进程同步、互斥

信号量机制可以用来解决进程的同步与互斥问题。
临界资源:某些时段只能允许一个进程使用的资源。
临界区:访问临界资源的程序段。临界区是代码,代码段。

同步

也叫直接制约关系。进程间协同工作,有前后次序。

互斥

也叫间接制约关系。访问临界资源时。

原则

空闲让进,忙则等待(两句废话,无需解释)
有限等待,让权等待(正解!对于请求访问的进程,应保证能在有限时间内进入临界区;如果进不去临界区,应该立即释放处理器,防止忙等待)

整型信号量(lock/unlock原语)

整型信号量被定义为一个用于表示资源数目的整型量S
wait和signal操作可描述为:

wait(S){
    while (S<=0);
    S=S-1;
}
signal(S){
    S=S+1;
}

缺陷:很明显,缺陷就是违反了“让权等待”原则,信号量S<=0时,会不断循环测试,进程处于忙等状态。

记录型信号量——P/V操作

之所以叫记录型信号量,是因为信号量不再是单纯的一个整形来表示,而使用一个结构体:

typedef struct{
    int value;
    struct process *L;
} semaphore;

相应的wait(S)和signal(S)的操作如下:

void wait (semaphore S) { //相当于申请资源
    S.value--;
    if(S.value<0) {
        add this process to S.L;
        block(S.L);
    }
}

wait操作,S.value–,表示进程请求一个该类资源,当S.value<0时,表示该类资源已分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入到该类资源的等待队列S.L中,可见该机制遵循了“让权等待”的准则

void signal (semaphore S) {  //相当于释放资源
    S.value++;
    if(S.value<=0){
        remove a process P from S.L;
        wakeup(P);
    }
}

signal操作,表示进程释放一个资源,使系统中可供分配的该类资源数增1,故S.value++。若加1后仍是S.value<=0,则表示在S.L中仍有等待该资源的进程被阻塞,故还应调用wakeup 原语,将S.L中的第一个等待进程唤醒。

利用信号量实现进程同步
利用信号量实现进程互斥
利用信号量实现前驱关系

具体参考信号量:整型、记录型信号量以及利用信号量实现进程互斥和前驱关系
TODO:生产者消费者 银行家 等

管程

P/V操作有效,但是是低级的,如果不由程序员来控制完成,才是ok的。
管程,就是用来管理临界资源的。
为了访问临界资源,管程每次只允许一个进程进入其内,不过这无需程序员操心,由编译器保证。所以很高级。

死锁

死锁的条件:
1. 互斥;
2. 不剥夺;
3. 请求和保持;
4. 环路等待。

即:有争夺的东西;别人正在用东西的时候你不能强占;没拿全所需的东西的时候,已经拿到的也不放手;最后大家都相互等待循环等待,gg。

Attention:环路等待和死锁的关系。
死锁,一定是出现了环路等待。但是环路等待未必会死锁。
例如:两个人要上厕所,需要穿鞋,有一只L鞋子,一只R鞋子。A拿到L,B拿到R,则环路等待,两人都走不了路,死锁。但是如果有两只L鞋子,一只R鞋子,从等待关系上来看,两个人还是会形成环路等待圈,但是并不会死锁。因为B可以集齐一套,用完之后释放一只L一只R,此时A就可以的到R,愉快上厕所=.=
所以:只有系统的每类资源都只有一个时,环路等待才等价于死锁。

对待死锁,有:死锁预防、死锁避免、思索检测与解除。

预防死锁(太保守,宁可资源闲置,因此效率低)

资源独占:毙掉3,即必须拿到所有的资源才能运行,如果拿不全的话,那就不拿。
缺点:资源利用率低,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
资源顺序分配:只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。
好处:提高资源利用率
缺点:问题是编号必须相对稳定,这就限制了新类型设备的增加

死锁避免(介于“预防”与“检测”之间,寻找可能的安全顺序)

银行家算法:看看借出去的租能否收回来。如果全都借出去还满足不了对方,不能收回来,那就先不借出去。

死锁检测与接触

资源分配图:请求边、分配边
死锁定理:资源分配图不能完全简化 <==> 死锁
实质上是如何让释放资源的进程继续运行
资源剥夺法:挂起某些进程。被挂起的进程不能一直挂着处于“饥饿状态”,饿死了怎么办。。。
撤销进程法:撤销某些进程。根据优先级和撤销的代价决定。

线程

目的:进一步提高程序并发度,提高系统吞吐量
资源共享,减小开销,更好的并发性
进程是资源分配的基本单位,线程是CPU调度的基本单位。
进程有自己的地址空间,即使崩了也不会影响其他进程;线程没有单独的地址空间(但有自己的堆栈&局部变量),线程崩了整个进程就崩了。所以多进程比多线程更健壮,但资源消耗太大,效率太差。
进程有自己的数据空间,所以进程间数据的传递需要进程间通信;线程没这么麻烦,同一进程下的线程共享进程的代码段、数据段、系统资源(打开的文件等)等。

others

孤儿进程vs僵尸进程
爸爸gg了,孩子就是孤儿进程;孩子gg了,爸爸不去收尸,孩子就成了僵尸进程。
所有的进程(init进程除外)gg后都会经历僵尸进程,等待爸爸来收尸^_^。
进程的TASK_ZOMBIE状态:进程消亡,PCB还在task数组中。发送信号给父进程,父进程释放其task_struct结构。

存储管理(内存)

地址转换
相对地址(逻辑地址/地址空间):源代码编译成的目标代码中的地址
绝对地址(存储空间):可执行代码在物理内存中的实际地址
地址重定位(地址映射):逻辑地址 –> 绝对地址

静态重定位
程序执行之前进行的定位,直接修改存有地址的源码

动态重定位
程序执行过程中的地位,装入代码后,拿相对地址加上起始地址即可。

分区存储管理

固定式分区

页式存储管理

MMU

存储管理部件MMU,Memory Management Unit,有时称作分页内存管理单元(paged memory management unit,缩写为PMMU)。它是一种负责处理CPU的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理,将虚页号转换为物理页号,页内偏移不用改动)等。

快表TLB

页表在主存,一次读写操作需要两次访存。第一次从内存访问页表,获取物理地址,第二次才是真正的根据物理地址获取内存中的数据。
所以将一部分页表放入cache,成为快表。就变成了一次“访缓”+一次访存。当然如果“访缓”没找到相应的页,还得去主存中访问页表。(如果根据页表得到的页不在主存中,还需要产生缺页中断,由中断处理程序将相应的页从磁盘调入主存)

内存管理单元通常借助一种叫做转译旁观缓冲器(Translation Lookaside Buffer,缩写为TLB)的相联高速缓存(associative cache)来将虚拟页号转换为物理页号。当后备缓冲器中没有转换记录时,则使用一种较慢的机制,其中包括专用硬件(hardware-specific)的数据结构(Data structure)或软件辅助手段。这个数据结构称为分页表,页表中的数据就叫做页表项(page table entry,缩写为PTE)。物理页号结合页偏移量便提供出了完整的物理地址。

段式存储管理

段页式存储管理

覆盖技术&交换技术

目的:利用外存来逻辑地扩充内存。

覆盖技术

铁定不会同时执行的程序段共享一个内存区域。不执行的先放在磁盘上。
对用户要求太高,需要用户指定哪些可以相互覆盖,不人性化。

交换技术

也叫滚入滚出,roll-in, roll-out
需要动态重定位机构支持,即再度滚回来时不一定还是之前的内存地址。
交换技术对用户透明,good!

虚拟存储管理

以两个技术为基础——局部性原理虚拟页式存储管理

局部性原理

时间(循环/子程序/栈)&空间(顺序执行/数组遍历/相邻存放)

虚拟页式存储管理

逻辑地址空间很大,实际主存有限。需要时调入主存即可。
缺页中断

页面置换算法
1. 先进先出FIFO;
2. 最近最久未使用LRU;
3. 最优算法OPT:foresee,impossible。

Linux的内存管理

地址空间大于主存物理空间
进程保护:每个进程都有自己的虚拟地址空间,即使gg了也不会相互影响
虚拟内存可以隔离进程的地址空间,那么如果不同进程的虚拟地址映射到同一物理地址,就可以实现内存共享,这就是共享虚拟内存!既可以节省物理内存,又可以实现进程间通信

IO

PCI总线:Peripheral Component Interconnect总线,外围设备互连总线。将CPU和存储器连接到快速设备和扩展总线上。
所以说PCI不是总线,是“外围设备互连”。“PCI总线”才是总线。

控制器
很多IO设备都有自己的控制器。
CPU操纵控制器,使设备完成I/O传输。

IO方式的演变

  1. 循环等待(忙等待);
  2. 中断;
  3. 直接内存访问DMA;
  4. 通道Channel。

循环等待

CPU不停扫描设备控制器中的寄存器的状态,显然耽误了CPU干正事儿。

中断

CPU上有中断请求线。
设备接收CPU指令开始传数据,缓冲寄存器满了就开始产生中断,CPU不得不来处理中断,亲自转移这些数据。每个字在存储器与I/O控制器之间的传输都必须经过CPU,这就导致了中断驱动方式仍然会消耗较多的CPU时间。

中断屏蔽 中断向量表 中断优先级

中断用于处理异步事件系统调用(用陷阱方式进入内核的管态)

直接内存访问

用于大容量传输设备。
CPU通知数据传输的起始结束位置和大小,DMA将数据从设备传到内存(需要占用内存总线,暂时禁止CPU访存),弄完了就给CPU发出中断,告诉它完事儿了。

中断 vs DMA
中断的话,数据缓冲寄存器满一次就得中断CPU一次,CPU得亲自转移这批数据;DMA则是将所有数据传输完毕后,才中断CPU,减少了CPU的终端次数,而且数据传输不经过CPU。彻底解放了CPU。

通道

通道是一个独立与CPU的专门负责IO的PU。有自己的通道指令。
I/O通道方式是DMA方式的发展,它可以进一步减少CPU的干预,即把对一个数据块的读写为单位的干预,减少为对一组数据块的读写及有关的控制和管理为单位的干预。

I/O通道 vs 一般处理机
通道指令的类型单一,没有自己的内存,通道所执行的通道程序是放在主机的内存中的,也就是说通道与CPU共享内存。

I/O通道 vs DMA
DMA方式需要CPU来控制传输的数据块大小、传输的内存位置,而通道方式中这些信息是由通道控制的。另外,每个DMA控制器对应一台设备与内存传递数据,而一个通道可以控制多台设备与内存的数据交换。

通道类型

字节多路通道:低速设备(eg:打印机),一次一字节。
数据选择通道:高速设备(eg:磁盘/磁带),以块为单位传送。但是一次只能对一台设备进行IO操作。
数组多路通道:高速,分时操作不同的设备。

缓存(cache)和缓冲(buffer)

相同点: 都是介于高速设备和低速设备之间。

缓存

存放的是低速设备上的某些数据的复制的数据,也就是高速缓存上有的低速设备上面必然有。这些数据经常要访问,所以在高速缓存上是为了加快访问速度

缓冲

一般在内存区域,用来存储数据。用于设备之间或者设备与程序之间,弥补CPU和IO设备速度的不匹配。解决基本数据单元大小(即数据粒度)不匹配的问题。提高CPU和I/O设备之间的并行性。
虽然也可以在硬件上采用硬件缓冲器实现,但是太贵了。

假脱机Spool

共享打印机是使用SPOOLing技术的一个实例,用于多用户系统和局域网络中。
当用户进程请求打印输出时,SPOOLing系统同意为它打印输出,但并不真正立即把打印机分配给该用户进程,而只为它做两件事:
1. 由输出进程在输出井中为之申请一个空闲磁盘块区,并将要打印的数据送入其中。
2. 输出进程再为用户进程申请一张空白的用户请求打印表,并将用户的打印要求填入其中,再将该表挂到请求打印队列上。

SPOOLing系统的主要特点有:提高了I/O的速度;将独占设备改造为共享设备实现了虚拟设备功能

文件系统

文件:具有符号名的相关数据的集合。
无结构文件:一系列的字符串组成,流式文件。
有结构文件:相关记录的集合。比如表格等。

文件转储:全量转储、增量转储。

目录:文件系统层次结构的非终结结点。
文件:终结结点。

文件系统:负责存取和管理外存上文件信息的功能模块。

文件控制块FCB

进程 = PCB + 程序段 + 数据段
文件 = FCB + 文件体
文件名、用户名、物理地址、格式、编码、属性、密码等。

文件系统层次结构

文件系统三大职能:
1. 建立文件;
2. 加工文件;
3. 输出加工后的文件。

磁盘

调度
先来先服务FCFS:
最短寻道时间优先shortest seed time first, SSTF:(贪心算法),不能保证平均最短,但是明显好于 FCFS。可能使一些进程饥饿。
SCAN算法:不仅考虑最短寻道,还要考虑必须与当前磁头移动方向相同。磁头类似电梯来来回回,又称为“电梯调度算法”。
循环扫描CSCAN,circular scan:磁头单向移动,到达最外道时再从最里道开始扫描。

一般选择SSTF,磁盘负荷重的系统选择SCAN/CSCAN,防止死等。

廉价冗余磁盘阵列RAID,redundant arrays of inexpensive disks

操作系统概述

存储程序式计算机,冯 诺依曼计算机:运算器、控制器(自动化操作)、存储器(存储程序和数据)、IO部件。

操作系统(Operating System, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境的程序集合。
操作系统是计算机系统中最基本的系统软件。

操作系统的特性:
并发:
共享:并发与共享相互依存。
不确定:OS需要随时处理系统中的不确定事件。
虚拟:内存、CPU、外设等都采用了虚拟技术,逻辑上扩充了数量。

手工操作阶段(此阶段无操作系统)

批处理阶段(操作系统开始出现)

为了解决人机矛盾及CPU和I/O设备之间速度不匹配的矛盾,出现了批处理系统。它按发展历程又分为单道批处理系统、多道批处理系统(多道程序设计技术出现以后)。

分时操作系统

时间片

实时操作系统

网络操作系统和分布式计算机系统

个人计算机操作系统

系统调用

操作系统和应用程序之间的接口。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

线程:This application is modifying the autolayout engin from a background thread

昨天处理相册问题是,遇到这样的问题: This application is modifying the autolayout engin from a background thread,whic...

This application is modifying the autolayout engine from a background thread, which can lead to engi

当添加了子线程,没有回到主线程中刷新UI 会报错 This application is modifying the autolayout engine from a background thre...

Effects with the Pixel Bender Toolkit – Part 6: Modifying Pixel Bender parameters in Flash

Requirements User level BeginningRequired products Flash Player 10 and later Flash Professional (Dow...

Transferring Data Without Draining the Battery - Modifying your Download Patterns Based on the Conne

When it comes to impact on battery life, not all connection types are created equal. Not only does t...

Pandas Index 更新和计算(Modifying&computations)

In [1]: import pandas as pd ...: df = pd.DataFrame({"学号": [1001,1002,1003,1004,1005], ...: ...

修改BIB文件 Modifying the Binary Image Builder Files

After you have created your OS design, you must modify the config.bib and platform.bib (binary ima...

Modifying XPS Document: Add Watermark

Windows Platform Foundation has provided easy APIs and solutions for XPS document generation, visual...
  • wzsy
  • wzsy
  • 2011-11-25 11:03
  • 1346

Modifying Logitech C920 for CS lenses

013-07-15 21:12 | Categories: In English, Projektai, Užrašai Logitech C920 is a wonderf...

LGPhotoBrowser 网络请求图片 报出This application is modifying the autolayout engine from a background thread

LGPhotoBrowser 网络请求图片 报出This application is modifying the autolayout engine from a background thread
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)