首页 > 编程知识 正文

(操作系统原理学习笔记)

时间:2023-05-03 20:30:05 阅读:121244 作者:671

以下内容与截图均来自 《操作系统——精髓与设计原理(第八版)》 在此记录学习笔记。

一、流程进程定义

分配给在运行的程序计算机上运行的程序的实例处理器并由处理器执行的实体; 由一系列执行指令、当前状态和一系列相关系统资源表示的活动单元。 流程的基本元素:程序代码和与代码相关联的数据集。

过程控制块标识符状态优先级程序计数器指针上下文数据I/O状态信息计费信息… 进程五状态模型

新建状态:在刚创建的进程中,操作系统尚未添加到可执行进程组中。 也就是说,未加载到内存中的新进程。 状态:流程准备好了。 有机会就开始执行。 运行状态:进程正在运行。 单处理器一次最多只运行一个进程。 阻止/等待状态—在发生特定事件(例如I/O操作完成)之前,无法运行进程。 退出状态操作系统从可执行进程组中释放的进程。 http://www.Sina.com/http://www.Sina.com /

进程标识信息进程状态信息进程控制信息进程标识信息:进程标识(进程ID )。 父进程标识符、用户标识符(用户ID )

进程状态信息:用户可见寄存器、控制和状态寄存器【程序计数器、条件代码、状态信息】、堆栈指针

过程控制信息:时间表和状态信息【进程状态、优先级、计划相关信息、事件】、数据结构、进程间通信、进程权限、存储管理、资源所有权和使用情况操作系统控制表的通用结构

用户模式:通常运行用户进程的非特权模式。 用户模式优先级低,只能访问用户区域,不能执行特权命令。

内核模式:运行操作系统代码的特权模式。 在内核模式下运行的代码可以访问所有资源并执行所有特权指令。 操作系统内核的典型功能如下:进程控制块信息

在操作系统从当前运行的进程获得控制权的任何时间,都会发生进程切换。

中断:从当前执行指令外部对时钟中断、I/O中断、内存故障陷阱等异步外部事件的响应:处理与当前执行指令相关的错误或异常条件的系统调用。 查看请求,然后单击操作系统函数进程控制执行模式

发生中断时,将程序计数器设定为中断处理程序的开始地址,以便中断处理代码中包含特权指令,从用户模式切换到内核模式。 操作系统完成必要的操作后,可以恢复被中断的进程或切换到其他进程。

线程通常将分配的单位称为线程或轻量级进程,而拥有资源所有权的单位称为进程或任务。

多线程是指操作系统在一个进程中支持多个并发路径的能力。 在多线程环境中,进程被定义为资源分配单元和保护单元。

进程切换

存储进程映像的虚拟地址空间。 对处理器、进程间通信的其他进程、文件和I/O资源的受保护访问。模式切换

一个线程的执行状态(执行、就绪等)。 运行时未保存的线程上下文; 线程可以被视为在进程中运行的独立程序计数器。 一个执行堆栈。 每个线程用于局部变量的几个静态存储。 访问与进程中其他线程共享的内存和资源。 http://www.Sina.com/http://www.Sina.com /

管理线程的所有工作都由APP应用程序完成,内核意识不到线程的存在。 该APP应用程序使用线程库设计多线程程序。 线程库是管理用户级线程的例程包,用于创建和销毁线程的代码、用于在线程之间传递消息和数据的代码、用于调度线程执行的代码、以及用于存储和恢复线程上下文

使用ULT而不是KLT的好处:

1 .由于所有线程管理数据结构都位于一个进程的用户地址空间中,线程切换不需要内核模式权限,因此进程不需要切换到内核模式,而是两次状态转换的开销(用户模式-内核模式)

2 .调度因APP应用程序而异,您可以根据APP应用程序定制调度算法。

3.ULT可以在任何操作系统上运行,不需要对底层内核进行任何更改即可支持ULT。 线程库提供了一组由所有APP应用程序共享的APP应用程序级函数。

与KLT相比,ULT的缺点:

1.ULT在执行系统调用时,不仅会阻止此线程,还会阻止进程中的所有线程。 原因:在此模式下,进程的所有线程都对应于一个内核调度实体,内核不知道该进程中有哪些线程。 KES不能将其他线程调度到其他处理器。 此进程(所有线程)将被阻止,直到这次系统调用(I/O )结束。

2 .在纯ULT策略下,多线程APP应用程序无法使用多进程技术。 因为内核一次只能将一个进程分配给一个处理器,所以一个进程只能运行一个线程。与进程相关联的有:

管理线程的所有工作都由内核完成。 在APP应用程序级别没有线程托管代码,只有一个到内核线程设施的APP应用程序编程接口。 内核为进程和进程中的每个线程维护上下文信息。 时间表由内核基于线程进行。

KLT的好处:

1 .内核可以同时向多个处理器调度同一过程中的多个线程。

2 .如果进程中的线程被阻止,则内核可以调度相同的进程

中的另一个线程。
3.内核例程自身可以是多线程的。
与ULT相比,KLT的缺点:
1.在把控制权从一个线程传送到同一个进程内的另一个线程时,需要切换到内核模式。
混合方法
线程创建完全在用户控件中完成,线程的调度和同步也在应用程序中完成。一个应用程序的多个用户级线程会映射到一些内核级线程上。在混合方法中,同一个应用程序中的多个线程可在多个处理器上并行运行,某个会引起阻塞的系统调用不会阻塞整个进程。

线程与进程的关系
并发

与并发相关的关键术语

术语解释原子操作一个函数或动作由一个或多个指令的序列实现,对外是不可见的;没有其他进程可以看到其中间状态或能中断此操作。要保证指令序列要么作为一个组来执行,要么都不执行,对系统状态没有可见的影响。原子性保证了并发进程的隔离临界区一段代码,在这段代码中进程将访问共享资源,当另外一个进程已在这段代码中运行时,这个进程就不能在这段中执行死锁两个或两个以上的进程因每个进程都在等待其他进程做完某些事情而不能继续执行的情形活锁两个或两个以上的进程为响应其他进程中的变化而持续改变自己的状态但不做有用的工作的情形互斥当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源的情形竞争条件多个线程或进程在读写一个共享数据时,结果依赖于它们执行的相对时间的情形饥饿一个可运行进程尽管能继续执行,但被调度程序无限期地忽视,而不能被调度执行的情形

并发的原理
在单处理器多道程序设计系统中,进程会被交替地执行,表现出一种并发执行的外部特征。由于进程的相对执行速度不可预测,因此会有问题:
1.全局资源的共享充满危险。
2.操作系统很难对资源进行最优化分配。
3.定位程序设计错误非常困难。

进程交互

互斥的要求
1.必须强制实施互斥:在与相同资源或共享对象的临界区有关的所有进程中,一次只允许一个进程进入临界区。
2.一个在非临界区停止的进程不能干涉其他进程。
3.绝不允许出现需要访问临界区的进程被无限延迟的情况,即不会死锁或饥饿。
4.没有进程在临界区中时,任何需要进入临界区的进程必须能够立即进入。
5.对相关进程的执行速度和处理器的数量没有任何要求和限制。
6.一个进程主流在临界区中的时间必须是有限的。
常用并发机制

死锁原理
死锁定义为一组相互竞争系统资源或进行通信的进程间的"永久"阻塞。当一组进程中的每个进程都在等待某个事件,而仅有这组进程中被阻塞的其他进程才可以触发该事件时,就称这组进程发生了死锁。因为没有事件能够被触发,故死锁是永久性的。
资源分类

可重用资源:指一次仅供一个进程安全使用且不因使用而耗尽的资源。进程得到资源单元并使用后,会释放这些单元供其他进程再次使用。如处理器、I/O通道、内存和外存、设备,以及诸如文件、数据库和信号量之类的数据结构。可消耗资源:指可被创建(生产)和销毁(消耗)的资源。某种类型可消耗的数量通常没有限制,无阻塞生产进程可以创建任意数量的这类资源。消费进程得到一个资源后,该资源就不在存在。如中断、信号、消息和I/O缓冲区中的信息。

死锁的条件
1、互斥。一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。
2、占有且等待。当一个进程等待其他进程时,继续占有已分配的资源。
3、不可抢占。不能强行抢占进程已占有的资源。
4、循环等待。存在一个闭合的进程链,每个进程至少占有此链中下一个进程所需的一个资源。

操作系统中进程之间常见的通信方式

管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。高级管道:将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方称为高级管道方式。信号:信号是一种比较复杂的通信方式,用于通知接受进程某个时间已经发生。信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。消息队列:消息队列是消息的链表,存放在内核中并由消息队列表示符标示。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限制等缺点。共享内存:共享内存就是映射一段内被其它进程所访问的内存,共享内存由一个进程创建,但是多个进程都可以访问。共享内存是最快的IPC,它是针对其它进程通信方式运行效率低的而专门设计的。它往往与其它通信机制。如信号量,配合使用,来实现进程间的同步和通信。套接字:套接字也是进程间的通信机制,与其它通信机制不同的是,它可以用于不同机器间的进程通信。 二、内存 页框:内存中固定长度的块。页:固定长度的数据块,存储在二级存储器中(如磁盘)。数据页可以临时复制到内存的页框中。段:变长数据块,存储在二级存储器中。整个段可以临时复制到内存的一个可用区域中(分段),或可以将一个段分为许多页,然后将每页单独复制到内存中。(分段与分页相结合)

逻辑组织
计算机系统的内存总是被组织成线性(或一维)的地址空间,且地址空间由一系列字节或字组成。大多数程序被组织成模块,操作系统或计算机硬件能够有效处理这种模块形式的数据,带来的好处:
1.可以独立地编写和编译模块,系统在运行时解析从一个模块到其他模块的所有引用。
2.通过适度的额外开销,可以为不同的模块提供不同的保护级别(只读、只执行)。
3.可以引入某种机制,使得模块可以被多个进程共享。
物理组织
计算机存储器至少要组织成两级,内存和外存。内存提供快速访问,成本高,且内存是易失性的,不能提供永久性存储。外存比内存慢且便宜,非易失性的。外存用于长期存储程序和数据,内存用于保存当前使用的程序和数据。两级存储器间信息流组织的问题:
1.供程序和数据使用的内存可能不足。
2.在多道程序设计环境中,程序员在编写代码时并不知道可用空间的大小及位置。
内存分区
内存管理主要操作是处理器把程序装入内存中执行。在现代多道程序设计系统中,内存管理涉及虚存的方案,其实基于分段和分页两种技术。
内存管理技术

内部碎片:由于装入的数据块小于分区大小,导致分区内部存在空间浪费。内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间。
外部碎片:内存中有很多小空洞,内存的利用率下降。外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
分页
内存被划分成大小固定、相等的块,且块相对比较小,每个进程也被分成同样大小的块,那么进程中称为页的块可以分配到内存中称为页框的可用块。分页对程序员透明。
分段
把程序和与其先关的数据划分到几个段中。由于使用大小不等的段,分段类似于动态分区,在分段方案中,一个程序可以占据多个分区,且分区不要求连续。分段消除了内部碎片,但会产生外部碎片。分段对程序员可见。
虚拟内存
分页和分段的特点:
1.进程中的所有内存访问都是逻辑地址,这些逻辑地址会在运行时动态地转换为物理地址。这意味着一个进程可被换入或换出内存,因此进程可在执行过程的不同时刻占据内存的不同区域。
2.一个进程可划分为许多块(页和段),在执行过程中,这些块不需要连续地位于内存中。动态运行时地址转换和页表或段表的使用使得这一点成为可能。

由于进程只能在内存中执行,因此这个存储器成为实存储器。而程序员或用户感觉到的一个更大的内存,且通常分配在磁盘上,成为虚拟内存
在任何时刻,任何一个进程只有一部分块位于内存中,因此可在内存中保留更多的进程。由于未用到的块不需要换入/换出内存,因而节省了时间。在稳定状态,内存的几乎所有空间都被进程块占据,处理器和操作系统能直接访问到尽可能多的进程。因此,当操作系统读取一块时,他必须把另外一块换出。如果一块正好在将要用到之前换出,操作系统就不得不很快把它取回。这类操作会导致系统抖动:处理器大部分时间都用于交换块而非执行指令。
局部性原理描述了一个进程中的程序和数据引用的集簇倾向。

虚拟内存操作系统置换策略
• 最佳(Optimal, OPT)
• 最近最少使用(Least Recently Used, LRU)
• 先进先出(First In First Out, FIFO)
• 时钟(Clock)
缺页:指要访问的页不在主存。
换页:指发生缺页,要将所缺的页调入主存时,主存中没有空闲的页框。此时必须将主存中的某页换出主存,用原先该页所占用的页框存放所缺页。

三、调度

处理器调度的目的是,以满足系统目标(如响应时间、吞吐率、处理器效率)的方式,把进程分配到一个或多个处理器上执行。

单处理器调度

处理器调度类型

长程调度:决定加入待执行进程池中程调度:决定加入部分或全部位于内存中的进程集合短程调度:决定处理器执行哪个可运行进程。导致当前进程阻塞或抢占当前运行进程的事件发生时,调用短程调度。这类事件包括:时钟中断、I/O中断、操作系统调用、信号(如信号量)
调度层次和进程状态转换

调度算法
先来先服务(FCFS):每个进程就绪后,会加入就绪队列。当前正运行的进程停止执行时,选择就绪队列中存在时间最长的进程运行。轮转:基于时钟的抢占策略。该算法周期性地产生时钟中断,出现中断时,当前正运行的进程会放置到就绪队列中,然后基于FCFS策略选择下一个就绪作业运行。最短进程优先(SPN):选择预计处理时间最短的进程。最短剩余时间(SRT):调度程序总是选择预期剩余时间最短的进程。最短响应比优先(HRRN):当进程完成或被阻塞时,选择(w+e)/s值最大的就绪进程。反馈法:处罚运行时间较长的作业,若不能获得剩余的执行时间,则关注已执行的时间。建立一组调度队列,基于每个进程的执行理事和其他一些规则,把他们分配到各个队列中。 多处理器调度

进程之间的同步粒度

进程调度
在大多数传统的多处理器系统中,进程并不指定到一个专用处理器。处理器有多个基于优先级的队列,并都送入相同的处理器池中。在多处理器系统中使用简单的FCFS原则或在静态优先级方案中使用FCFS就已足够。
线程调度
一个应用程序可以按一组线程来实现,这些线程可以在同一个地址空间协作和并发地执行。在多处理器系统中,线程可开发应用程序中的真正并行性。多处理器线程调度和处理器分配方案:
负载分配:进程不分配到某个特定的处理器。系统维护一个就绪线程的全局队列,每个处理器只要空闲就从队列中选择一个线程。负载分配方案:先来先服务(FCFS)、最少线程数优先、可抢占的最少线程数优先。
组调度:一组相关的线程基于一对一的原则,同时调度到一组处理器上执行。
专用处理器分配:通过把线程指定到处理器来定义隐式的调度。
动态调度:在执行期间,进程中线程的数量可以改变。

参考资料

《操作系统——精髓与设计原理(第八版)》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。