**前言:
有大神说过,学技术入门可以书籍+视频,6天时间刷了一套视频和看一本书,把操作系统的一些重要部分写成这篇博客,视频和书籍如下:
哈工大李治军的操作系统教程:http://mooc.study.163.com/u/3793984885#/c
操作系统定义:一个介于计算机硬件和应用程序中间的管理计算机系统资源、控制程序运行的系统软件。
操作系统的组成部分:
1).处理机管理(核心)
2).存储器管理
3).文件管理
4).作业管理
5).设备管理
抛砖引玉
操作系统最重要的观念:取指执行
操作系统存在于磁盘,开机启动时,操作系统被分段的从磁盘加载到内存。此后,操作系统将常驻从开始0的一段内存,往上的内存留给其它应用程序。
1).处理机管理(核心)
处理器管理的核心是多进程机制,所以多进程是操作系统的核心的核心,图1所示。
(1)什么是进程?
进程是并发程序的一次执行过程,进程是一个具有一定独立功能的程序关于某个集合的一次运行活动。
(2)进程有什么特点?
动态性、制约性、并发性。
(3)进程有哪些状态?
运行状态:该进程正占者cpu时间,正在被cpu执行;
就绪状态:进程已经被调入主存储器中,满足所有的运行条件,但是没有获得cpu时间;
等待状态:进程缺少满足运行的条件,也没有获得cpu时间;
(4)操作系统感知进程的单位是什么?
PCB(进程控制块):描述一个进程与其它进程的关系以及系统资源的关系,还记录着进程的状态。
(5)进程的生命周期(专业术语是叫进程控制原语)
包括进程的建立、进程的撤销、进程的等待、进程的唤醒。
(6)复杂的操作系统中,进程之间有哪些联系?
关系:同步、互斥
这里回顾一下Java编程语言的一些内容,在java的线程(进程中可以并发执行的程序段,是可执行代码的不可拆散的单位)关系中,也有互斥(synchronized/lock)、同步、生产—消费关系等。那么java线程的关系在底层是怎么运作的,原理是什么?java的线程原理的思想也是来源于操作系统进程关系原理。
其实进程互斥、同步、生产—消费关系在操作系统内部是靠P,V原语算法实现的:
P,V原语包括信号量和p,v操作组成:
互斥:
semaphors S=1;
进程A:
…
P(S);
CSI;
V(S);
…
进程B:
…
P(S);
CSI;
V(S);
…
同步:
semaphors S=0;
进程A:
…
V(S);
…
进程B:
…
P(S);
…
(7)我喜欢边听音乐,边写java程序,边使用word做笔记,那么计算机的cpu是怎么管理这么多的功能的呢?
其实听音乐、写java程序、用word做笔记都分别是独立的进程,cpu把时间分为许多个时间片,交给这些进程交替执行。
那么进程之间是怎么切换的呢?
进程由于占用系统资源,在切换中造成时间的浪费,而线程轻巧灵活,因此用进程内部的线程切换完成进程切换,原理如下:
其中最重要的切换是Schedule(调度),它才是真正切换的动作,那么,Schedule内部究竟是什么呢?
整个操作系统的运转也就是进程间不停地调度,调度是操作系统的发动机。
linux提供三种调度算法:用于实时进程的先进先出算法、轮转算法、用于普通进程的可抢占式动态优先级算法。
我们来看看Linux0.11的Schedule函数源码:(其中的counter既表示优先级,又表示时间片)
void Schedule(void){
while(1){
c=-1;
next=0;
i=NR_TASKS;
p=&task[NR_TASKS];
while(--i){
if((*p)->state==TASK_RUNNING&&(*p)->counter>c)
c=(*p)->counter,
next=i;
}
if(c) break;
for(p=&LAST_TASK;p>&FIRST_TASK;--p)
(*p)->counter=((*p)→counter>>1)+(*p)->priority;
}
switch_to(next);
}
2).存储器(内存)管理
存储器管理的大概意思是:当作业像系统提出存储空间的要求时,存储器在内存中划出一块地址给作业。
这其中就牵扯到很多东西了,你一个作业(可以理解为程序实体)进来内存,内存要怎么分配内存给你?作业完之后,内存要怎么释放?作业是怎么加载进内存的?…
总的来说,衡量存储器管理分为几个指标:
(1)内存划分方式
(2)作业划分方式
(3)重定位方式
(4)分配方式
(5)存储保护方式
(6)连接方式
(7)能否共享
(8)需要哪些硬件支持
(9)需要哪些软件支持
(10)是否支持虚拟存储器
存储器管理方法也分为以下几种:
(1)分区管理
。单一分区
。固定分区
。动态分区
(2)分页管理
(3)分段管理
(4)段页式管理
现在流行的是段页式的管理内存方式,重点看看段页式管理,段页式既又对进程程序进行段划分的优势,又有对内存页划分的优点,原理如下图:
1.对进程的程序进行段的划分
2.对内存进行页的划分
3.建立段和页的映射
从而实现对有限内存的最大利用
但是上面的进程如果太大,而内存剩余的容量不足够容纳进程时会造成无法执行进程,于是虚拟内存出现了,把进程的程序加载到在硬盘开出的指定空间(虚拟内存/也叫交换空间),在分部地与物理内存交换,进而使小的内存能够运行较大的进程。,原理图如下:
1.缺页的意思是内存没有页分配给正在执行的进程,原理图中,当进程太大,内存缺页时,cpu执行中断处理,去执行其他的进程,而中断处的进程会告诉硬件缺页,硬件马上把内存中没有执行进程的页面换出,从磁盘中换进中断进程的其他页,等到cpu会到中断处,又可以继续执行原先进程。
2.而换出内存中的哪张页面,也很有讲究,可以使用clock算法,将最近没有被访问的内存页换出。
3.还记得在安装linux(fedora/redhat)时,有个步骤是指定分区的,其中有一个叫swap(交换分区)的,它的用途是为了实现虚拟内存。
4.swap的目的是实现虚拟内存,而虚拟内存是为了增强段页式管理内存地功能,而段页式的目的是为了尽可能加载更大的程序到内存中,但是内存运行程序的目的是执行进程。进程又属于cpu(处理器)管理。
3).文件管理
(1)在文件之前还得了解磁盘(内容细节太多,自行百度),这里只提一下磁盘如何与进程交互?
1.进程需要向磁盘请求操作,将请求置于请求队列中(利用电梯算法决定先执行哪个请求)
2.进程进入sleep状态
3.磁盘中断处理
4.唤醒进程
如下图:
(2)文件的结构
文件分为流式无结构文件和纪录式结构文件,其中我们最熟悉的数据库文件也是一种纪录式结构文件。
(3)文件视图
文件视图是操作系统的重要组成部分,它把外设、磁盘等IO操作统一起来,全部当成文件使用,用户只需相同的操作,操作系统会区分不同的硬件。看原理图:
(4)文件目录的结构
在《数据结构》中,不管是树、图最终的保存形式都是一维结构。文件也一样,尽管在头脑中展现的是树形结构,但是在底层也是一维结构。linux的文件系统采用基于索引结构的EXT2。索引文件的思想类似于存储管理的分页管理,把文件划分为大小相同的若干连续的逻辑块,每块逻辑块可存放到存储空间中的任一物理块中。系统为每个文件建立一张索引表,给出逻辑块号和分配给它的物理块号的对应信息(inode)。
4).作业管理
作业可以理解为用户给计算机一些命令,计算机根据命令做事。
比如:linux采用了作业控制命令的形式,用户登录系统时就进入了一个称为shell的命令界面。shell解释用户输入的命令行,提交系统内核处理,并将结果返回给用户。(windows采用图形化界面)
作业的状态有:
(1)提交状态
该时期的作业处于输入设备和辅助存储器中,但作业的描述信息还未产生
(2)后备状态
与提交状态相比,作业信息已经俱备
(3)执行状态
作业被调入主存储器中,并以进程形式存在
(4)停止状态
作业已完成指定的功能
对作业的管理主要通过作业调度算法和进程调度算法实现(类似处理器管理的Schedule函数)。
任务,进程与线程:
当任务被启动时,对应于该任务的进程也就被建立。进程的运行又有两种情况:以纯粹的进程形式存在或者以线程的形式存在。线程是构成进程的可独立运行的单元,当进程由线程构成时,线程成为占有cpu时间片的实体。
linux处理的对象是进程。
5).设备管理
一部计算机除了cpu和内存外,还有显示器、鼠标、键盘、各种驱动器。而这些需要用户操作,输入输出的称为设备
计算机中的设备需要标识和设备驱动程序
这里重点讲讲输入输出的控制方式,比如键盘,我们在键盘上打字,计算机是怎样接收的?
从历史的演化中,有程序控制输入输出方式、中断输入输出方式、直接存储方式(DMA)、通道方式。
由于每种外设都有相应的驱动程序,生产商的官网一般也会提供驱动下载,这里就不多说。具体看下面的原理图:
来看看设备管理涉及到的一些技术:
1.中断技术
看图就行:
2.缓冲技术
在内存中专门开辟若干单元作为缓冲区(篇幅太长,自行百度吧)
最后提一下linux的设备管理
这是linux的一大特色,linux把每一个I/O设备都看成一个文件,与普通文件一样处理,使得文件与设备操作尽可能统一。对于用户而言,不需要了解I/O的细节,而是当成普通文件一样使用。
6).操作系统全局
多进程是核心,cpu为总控制器,内存和io为重要组成部分。