温故而知新---《操作系统原理及应用》

最近在看《深入理解android内核设计思想》时,发现很多原理性概念性的东西都快忘的差不多了。于是翻箱找出大学时的一些书籍。重新再扫一遍。以此记录!


计算机系统采用冯诺依曼提出的存储程序原理,即把要运行的程序一次性存放在存储器中,然后由处理机自动从存储器中依次取出程序指令运行。


操作系统提供如下存储管理功能:

1.内存分配。

2.地址转换。一个应用程序经过编译后,形成若干目标程序,这些目标程序经过链接而形成可执行程序,在可执行程序中,有一些指令中包含内存地址码,要访问该地址存放的数据或指令,将程序装入内存之前,无法确定程序在内存中的实际存放位置,因此必须建立一个虚拟内存地址空间,将整个程序放在这个虚拟内存地址空间中,每个数据和指令都有一个唯一确定的虚拟内存地址,这个地址空间又称为逻辑地址。

程序最终在物理地址空间中运行,即方位程序中的指令和数据都是按其所在实际内存单元的地址进行的,所以要正确的访问数据和指令,必须把指令中的逻辑地址转换为物理地址,这操作交地址转换,也称为重定位。

3.内存保护。

4.内存扩充。指逻辑角度扩充,而不是直接添加物理内存容量。扩充有两种方法:1.进程的整体交换,即将某些在以后一段时间内不能运行的进程的代码和数据暂时撤出内存,放到外存中,将当前急需运行的进程的代码和数据调入内存,对于换到外存中的进程,当其运行条件具备时,再将其调入内存。2.进程的部分装入,为进程分配少量内存,先装入一部分开始运行,当要访问不在内存中的部分时,再将其调入内存。


进程存在于系统的内存中,是操作系统可感知,可控制的动态实体,是系统分配各种资源,进行调度的基本单位。


一个进程被挂起后,不管它是否在就绪状态,系统都不会分配给它处理机。


进程的程序部分描述进程所要完成的功能,而数据结构集是执行时刻执行时不可少的工作区和操作对象,这两部分是进程完成所需功能的物质基础,。在大部分多道操作系统中,这两部分内容存放在外存中,直到该进程执行时再调入内存,所以进程实体通常是由程序,数据集合,PCB(process control Block进程控制块)3部分组成。


PCB包含一个进程的描述信息,控制信息,资源信息。PCB是进程存在的唯一标志。


一般来说,PCB记录了进程的全部信息,因此庞大而复杂,根据操作系统要求不同,进程的PCB所包含的内容也有所不同,按照功能大概分为4部分:

1.进程表示符,

2.处理机状态,

3.进程调度信息,处理机在运行时,许多信息都放在寄存器中,当处理机被中断时,这些信息都必须保存在PCB中,以便在该进程重新执行时能从断点处执行。

处理机的寄存器包括通用寄存器,指令寄存器,程序状态字PSW和用户栈指针。

4.进程控制信息。


为了对所有进程进行有效的管理,常将各进程的PCB用适当的方式组织起来:

1.线性方式,操作系统预先确定整个系统同时存在的进程最大数和静态分配空间,把所有进程的PCB房再这个表中。优点:实现简单,缺点:在执行CPU调度时,为选择合理的进程投入运行,经常要对整个表进行扫描,降低了调度效率

2.链接方式,按照进程的不同状态分别将其放在不同的队列中。CPU调度程序把第一个PCB从该队列中摘下,令其投入运行。新加入就绪队列的PCB按照某一个调度算法插入

3.索引方式,系统根据所有进程的状态建立几张索引表,如就绪索引,阻塞索引等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。


进程控制,是系统使用一个具有特定功能的程序段来创建,撤销进程以及完成进程各状态的转换,从而达到多进程高效率并发执行和协调并实现资源共享的目的。


系统在运行时分为:核心态(系统态,管态),指CPU正在运行操作系统的核心模块,用户态(用态),指CPU正在运行用户的程序。

核心态下执行的某些具有特定功能的程序段被称为原语,原语的特点是不可被中断。


UNIX系统中有0#进程和1#进程,0#进程是系统的调度和对换进程。1#进程是创建进程,以后所有的用户进程都是由该进程创建。

Linux系统启动后经过初始化操作,系统由init()函数创建第一个进程,系统中所有进程都是从init核心进程派生出来


进程的创建过程:

当系统发现要求创建进程的事件后,立即调用进程创建原语,通过以下步骤创建一个进程:

1.申请空白PCB

2.为新进程分配资源,包括新创建的进程程序,数据,以及用户栈所需要的内存空间

3.初始化PCB。

4.将新建进程的PCB插入就绪队列。

进程的终止过程:

1.根据被终止进程的标识符,从PCB队列中检索出该进程的PCB

2.若被终止进程正处于执行状态,应立即终止该进程的执行,该进程被终止后应重新进行进程调度

3.检查该进程有无字孙进程,若有,终止所有子孙进程。

4.释放终止的进程所占有的资源

5.将被终止的进程从它的PCB对列中移除。


LInux 中利用fork()系统调用创建一个新进程。调用方式:

pid = fork();

pid = 0,创建子进程成功,表示正在运行该子进程

pid>0,创建子进程成功,表示从付进程返回,pid为新创建的子进程标识号。

pid = -1 ,创建失败。

fork()是通过复制父进程来创建子进程的,子进程继承父进程的上下文,是父进程的一个副本,与父进程使用同一段代码,但完成不同的工作。在被系统调用之后,两个代码相同的进程并发执行。

当由fork()系统调用创建一个子进程后,可再利用exec()系统调用执行另一个程序。exec函数的作用是根据指定的文件名找到相应的可执行文件,也就是调用进程内部执行一个可执行文件。


两个或以上的进程不能同时使用的资源称为临界资源。


进程互斥的方式:

1.锁机制

2.信号量机制


管道是指用于连接一个读进程和一个写进程,以实现他们之间通信的一个共享文件,又名为pipe文件。

管道机制必须提供已下3方面的协调能力:

1.互斥,当一个进程正在对pipe执行读写操作时,其他进程必须等待

2.同步,当写进程把一定数量的数据写入pipe时,便去睡眠等待,直到读进程取走数据后,再把他唤醒。当读进程读一空pipe时,也应睡眠等待,直至写进程将数据写入管道后才将之唤醒。

3.确定对方是否存在,只有确定对方存在时,才能通信。


引用线程的概念主要是为了提高系统的执行效率,减少处理机的空转时间,和在进行调度切换时因保护现场信息所用的时间,便于系统管理。


线程是进程中执行运算的最小单位


进程是资源分配的基本单位,同一进程的所有线程共享该进程的所有资源

线程是分配处理的基本单位与资源分配无关,真正在处理机上运行的是线程

一个线程只能属于一个进程,一个进程可以有多个线程。



作业是用户在一次解题或一个事物处理过程中要求计算机系统所做工作的集合。


系统通过作业说明书控制程序和数据,使他们运行和操作,并且,在批处理系统中,作业是加载内存的基本单位,系统将作业调入内存并执行。


用于书写作业说明书的语言称为作业控制语言(JCL)。作业控制语言一般由I/O命令,编译命令,操作系统及命令条件命令等组成


系统为每个作业建立一个作业控制表(JCB),每个作业的状态,在各个阶段所需要和已分配的资源都记录在JCB上


作业与进程的关系:

作业是用户向计算机提交任务的任务实体,一个作业是指在一次应用业务处理过程中,从输入开始到输出结束,用户要求计算机所做的有关该次业务处理的全部工作,进程是计算机为了完成用户任务而设置的执行实体,是系统分配资源的基本单位。

算计要完成一个任务,必须有一个以上的执行实体,即一个作业总是由一个或多个进程组成。


作业分解进程的过程:

系统首先为一个作业创建一个根进程,然后,在执行作业控制语句时,根据任务要求,系统或跟进程为其创建相应的子进程。最后,进行进程调度,为各子进程分配资源和调度执行各子进程分配资源和调度执行各子进程。


一个批处理作业,可能要经历三级调度:

1.作业调度。用于选择把外存上处于后备队列中的哪些作业调入内存,并为他们创建进程,分配必要的资源,然后再把创建的进程排在就绪队列上

2兑换。将处于外存交换区中的就绪状态或等待状态的进程调入内存。把处于内存就绪状态或内存等待状态的进程交换到外存交换区。交换调度主要涉及内存管理和扩充

3进程调度。主要任务是按照某种策略和算法,将处理机分配给一个处于就绪状态的进程。在确定了占用处理机的进程后,系统必须进行进程上下文的切换。


linux系统作业一旦输入就直接进入内存建立相应的进程,进入下一及,因此没有作业调度的概念。



进程调度:

1.记录系统中所有进程的执行情况

2.从就绪状态队列中选择一个进程

3.进行进程上下文切换。上下文包括:进程的状态,有关变量,数据结构的值,机器寄存器的值,PCB以及有关进程,数据等。


用户进程可以在用户态和核心态下运行。用户态通过中断或者函数调用就可以转入核心态。从核心态进入用户态需要一定的硬件支持


程序以文件的方式存储在辅存上,为了执行或存取程序和数据,需要把他们放到内存中。


存取速度:高速缓冲存储器--------内存-------辅助存储器


逻辑空间是用户的编程空间,若用户使用机器指令编写程序,则编程空间由用户自己定。若使用高级编程语言编写程序,则编程空间是编译程序产生的。逻辑地址也称为虚地址,编程地址,CPU地址,相对地址,逻辑空间也称为虚空间,编程空间,地址空间。


物理空间是由物理存储单元组成的空间,是由存储器总线扫描出来。之所以要区分逻辑地址和物理地址,最初是为了要把程序员从需要考虑存储分配的负担中解放,后来是为了给编译存续提供方便,使得编译程序能将每一个源程序都编译成从0开始编址的目标代码。


为确定程序在内存中的物理位置而进行地质变换称为重定位,重定位实际情况:

1.当一程序装入内存运行时,必须根据所分得的空的位置,将程序的逻辑地址变成相应的物理地址,以便将该程序定位在其所分得的物理空间内。

2.当程序在执行过程中,由于种种原因,在内存改变了位置后,需要将程序的逻辑地址重新变换,以便将该程序重新定位在新的位置上。


地址变换的方法是将程序中所有的逻辑地址,包括指令本身的地址和指令中的操作数地址,诸葛变换成物理地址


链接程序的功能是将经过编译或汇编后得到的一组目标模块以及他们所需的库函数装配成一个完整的装入模块。


进程分配内存时三个问题:1.最小物理块数的确定。2.物理块的分配策略。3.物理块的分配算法。


实现虚拟存储技术需要一定的物质基础:1.需要相当容量的辅存,以便足以存放多用户作业的地址空间,2.需要一定容量的主存。3.需要地址变换机构


虚拟存储地址能从逻辑上扩充内存容量。


Linux中,每个用户进程都可以访问4GB的线性虚拟内存空间。其中,0-3GB的虚拟地址空间是用户空间,用户进程可以直接对其进行访问,3-4GB的虚拟内存空间未内核态空间,存放进攻内核态进程访问的代码和数据,用户态进程不可访问。当用户进程通过中断或系统调用访问内核态空间时,就会触发处理特权级转换,即从操作系统的用户态转换到内核态。


内核态虚拟空间从3GB-4GB的一段被映射到物理空间为0--4MB。因此进程处于内核态时,访问了 0--4MB的物理空间段。


Linux中内存的共享以页表的形式实现,共享该页的各进程的页表表项直接指向共享页。这种结构不需要设立共享页表,节约内存,但效率低下


存储管理的目的是为了方便用户和提高内存利用率,存储管理的基本任务是管理内存空间,进行虚拟地址到物理地址的转换,实现内存的逻辑扩充,完成内存的共享和保护


文件的物理结构是指文件在外部存储器上的存储方式,以及它与文件逻辑结构之间的对应关系。


文件的物理结构有:

1.连续文件结构,易于顺序访问,访问一个战友连续空间的文件容易,顺序访问速度快,常用于存放系统文件等固定长度的文件。缺点:要求建立文件时就确定长度,以此分配空间,一般很难实现。不利于文件长度的动态增加。反复删除,容易产生碎片,导致外存空间利用率低。

2.链接文件结构(串行文件结构)。把一个逻辑上连续的文件离散的存放在不连续的物理块中,为了表示其对应的逻辑块次序,对各物理块设置一个指针,指向下一个逻辑块对应的物理块。

3.索引文件结构。系统为每个文件建立一张索引表,索引表是文件逻辑块号和物理块号的对照表。索引文件解决了连续文件和串联文件的不足,既能方便迅速的实现随机存取,又能满足文件动态增长的需要。但是带来了存储空间的开销。



未完待遇...






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值