caroline's world - 操作系统
type: channel
link: https://blog.carolineworld.cn/index.php/tag/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/
items: 同步与互斥
items: 操作系统概念解析

同步与互斥
type: item
date: 2024-07-30T15:54:00+08:00
description: 进程同步进程具有异步性的特征。异步性：各并发执行的进程以各自独立的、不可预知的速度向前推进。例子：进程通信——管道通信读进程和写进程并发地运行，由于并发必然导致异步性，因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的。而实际应用中，又必然按照“写数据 => 读数据”的顺序来执行的。所以需要解决这种异步问题。同步，亦称 直接制约关系，它是指为完成某种任务而建立的两个或多个进程，这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。进程互斥进程的 “并发”需要 “共享”的支持。各个并发执行的进程不可避免的需要共享一些系统资源（如内存，又如打印机、摄像头这样的 I/O 设备）两种资源共享方式：互斥共享方式系统中的某些资源，虽然可以提供给多个进程使用，但一个时间段内只允许一个进程访问该资源。同时共享方式系统中的某些资源，允许一个时间段内由多个进程“同时”对它们进行访问一个时间段内只允许一个进程使用 的资源称为 临界资源。许多物理设备（比如摄像头、打印机）都属于 临界资源。此外，很多变量、数据、内存缓冲区等都属于临界资源。对临界资源的访问，必须 互斥 地进行。互斥，亦称 间接制约关系。进程互斥 指当 一个进程 访问 某临界资源时，另一个想要访问该 临界资源 的 进程 必须等待。当前访问临界资源的进程访问结束时，释放该资源之后，另一个进程才能去访问临界资源。对临界资源的互斥访问，可以在逻辑上分为如下四个部分：do{ entry section; // 进入区 critical section; // 临界区 访问临界资源的的代码 exit section; // 退出区 remainder section; // 剩余区 }while(true)进入区：负责检查是否可进入临界区，若可进入，则应设置 正在访问临界资源的标志（可理解为“上锁”），以阻止其他进程同时进入临界区。临界区：访问临界资源的那段代码。又称为 临界段。退出区：负责解除 正在访问临界资源的标志（可理解为“解锁”）剩余区：做其他的处理为了实现对临界资源的互斥访问，同时保证系统整体性能，需要遵循以下原则：空闲让进。临界区空闲时，可以允许一个请求进入临界区的进程立即进入临界区。忙则等待。当已有进程进入临界区时，其他试图进入临界区的进程必须等待。有限等待。对请求访问的进程，应保证能在有限时间内进入临界区（保证不会饥饿）。让权等待。当进程不能进入临界区时，应立即释放处理机，防止进程忙等待。进程互斥的软件实现方法在进入区设置并检查一些标志来标明是否有进程在临界区中。若已有进程在临界区，则在进入区通过循环检查进行等待，进程离开临界区后则在退出区修改标志。单标志法算法思想：进程在访问完临界区后会把 使用临界区的权限 转交给另一个进程。也就是说 每个进程进入临界区的权限 只能被 另一个进程 赋予。turn 的初值为 0，则刚开始只允许 0 号进程进入临界区。若 P1 先上处理机运行，则会一直卡在 ⑤。直到 P1 的时间片用完，发生调度，切换 P0 上处理机运行。代码 ① 不会卡住 P0，P0 可以正常访问临界区，在 P0 访问临界区期间即使切换回 P1，P1依然会卡在⑤。只有 P0 在退出区将 turn 改为 1 后，P1 才能进入临界区。只能按 P0→P1→P0→P1→··· 这样轮流访问。这种必须 “轮流访问”带来的问题是，如果此时允许进入临界区的进程是 P0，而P0一直不访问临界区，那么虽然此时临界区空闲，但是并不允许 P1 访问。单标志法 存在的主要问题是：违背了“空闲让进”原则。双标志先检查算法思想：设置一个 布尔型数组 flag[]，数组中各个元素用来标记各进程想进入临界区的意愿flag[0] = true 意味着 0 号进程 P0 现在想要进入临界区。各个进程在进入临界区之前先检查当前有没有别的进程想进入临界区，如果没有，则把自身对应的标志 flag[i] 设置为 true ，之后开始访问临界区。在并发环境下，按照 ①⑤②⑥③⑦··· 的顺序执行，P0 和 P1 将会同时访问临界区。双标志先检查法的主要问题是：违反 “忙则等待”原则。原因在于，进入区的“检查”和“上锁”两个处理不是一气呵成的。“检查”后，“上锁”前可能发生进程切换。双标志后检查算法思想：双标志先检查法的改版。前一个算法的问题是先“检查”后“上锁”，但是这两个操作又无法一气呵成，因此导致了两个进程同时进入临界区的问题。因此，人们又想到先“上锁”后“检查”的方法，来避免上述问题。如果按照 ①⑤②⑥ ··· 的顺序执行，P0 和 P1 都无法进入临界区。双标志后检查法 虽然解决了“忙则等待”的问题，但是又违背了“空闲让进”和“有限等待”原则，会因各进…

操作系统概念解析
type: item
date: 2024-07-30T12:41:00+08:00
description: 第一章操作系统的定义：计算机用户和计算机硬件之间的程序操作系统的目标：运行用户程序，更方便地运行用户程序更易于使用计算机系统更方便管理计算机的硬件操作系统的三个用途：管理计算机硬件资源提供用户和计算机硬件的接口提供服务和资源下面哪些项享有特权：设置计时器的值。需要特权读时钟。不需要，无特权也能读取清除内存。需要特权发出陷阱指令。陷入内核态，不需要特权关闭中断。需要特权，能关闭中断就可以无限占用CPU修改设备状态表条目。需要特权从用户模式切换到内核模式。不需要特权访问 I/O 设备，需要特权一些CPU提供两种以上的操作模式。这多种模式的两种可能的用途是什么？区分用户级别，提供分级服务安全控制允许部分设备在非内核模式下工作中断的目的是什么？中断与陷阱有何不同？陷阱可以由用户程序有意生成吗？如果是，目的是什么？目的：在某个事件发生时打断正在执行的程序，并立即转移到该事件的相应处理程序上中断和陷阱的区别：中断：中断是由外部事件触发的机制中断可以打断正在执行的程序，并将控制转移到相应的中断处理程序中断处理程序可以是处理外部事件中断是异步事件，可以在任何时间发生，无论当前程序状态如何中断处理程序的执行是由硬件和操作系统控制的陷阱：陷阱是由程序中的指令或软件调用触发的机制，用户处理异常或特定的系统调用陷阱通常是程序中的特殊指令或出现特定条件触发的陷阱处理程序用于处理陷阱事件陷阱是同步事件，它们是由程序的执行流程和指令触发的陷阱处理程序的执行是由操作系统或软件控制的。陷阱可以由用户程序有意生成，用于陷入内核态以调用以下内核函数等。中断处理过程：CPU在执行某条指令时发生异常或系统调用，或者 CPU 在执行某条指令后检测到中断请求。关中断，保存断点，保护中断前CPU现场。之后进入中断服务程序处理中断来源。中断服务处理结束后，恢复CPU现场，中断返回中断指令执行处继续执行。DMA 方式：CPU可以通过将数值写入可以被设备独立访问的特殊寄存器来启动DMA（直接内存访问）操作。一旦设备收到来自CPU的命令，就会启动相应的操作。当设备完成其操作时，会中断CPU以表示操作的完成。设备和CPU可以同时访问内存。内存控制器以公平的方式为这两个实体提供对内存总线的访问。因此，CPU可能无法以最高速度发出内存操作，因为它必须与设备竞争以获得对内存总线的访问权。特权指令的示例：I/O管理、定时器管理、中断管理，切换到用户模式的指令用户模式和内核模式，是由硬件支持区分两种模式如果双重模式没有硬件支持，操作系统会有严重缺点一旦硬件保护到位，便可检测模式错误。这些错误通常由操作系统处理。如果一个用户程序出错，如试图执行非法指令或者访问不属于自己的地址空间内存，则通过硬件陷入到操作系统，陷入可通过中断向量将控制转移到操作系统。当一个程序出错时，可由操作系统来终止异常。多处理器的三个优点：增加吞吐量、规模经济、增加可靠性。缺点：昂贵对称多处理 vs 非对称多处理：对称多处理：每个处理器参与操作系统的所有任务，没有主从关系，所有处理器对等非对称多处理：有一个主处理器，从处理器 从主处理器中请求任务或执行预先分配的任务。主处理器 调度 从处理器，并分配工作，I/O 操作也只在主处理器上执行有些计算机系统在硬件上不提供特殊的操作模式。有可能为这些计算机系统构建一个安全的操作系统吗?给出它是和它是不可能的论据。答:这类机器的操作系统需要始终处于控制状态(或监控模式)。这可以通过两种方法来实现:a：所有用户程序的软件解释(例如一些BASIC、Java和LISP系统)。软件解释器可以在软件中提供硬件不能提供的东西。b：所有的程序都要用高级语言编写，这样所有的目标代码都是由编译器生成的。编译器将生成(内联或通过函数调用)保护检查，以确定硬件是否缺失。许多SMP系统有不同层次的缓存，有的缓存是为了单个处理核专用的，而有的缓存是为所有处理核共用的。为什么这么设计缓存系统?不同层次是基于访问速度和大小。一般来说，缓存离CPU越近，访问速度越快(越近实际上容量也越小)。然而，更快的缓存通常更昂贵.因此更小更快的缓存被放置在每个CPU的本地，较大但较慢的共享缓存在几个不同的缓存之间共享处理器。请描述一种机制以加强内存保护，防止一个程序修改与其他程序相关的内存处理器可以跟踪与每个进程相关联的位置，限制对程序范围之外的位置的访问。关于程序内存范围的信息可以通过使用基本寄存器和限制寄存器来维护并通过对每个内存地址的访问执行检查。第二章操作系统的服务：用于提供用户功能：用户界面I/O 操作程序执行文件系统操作通信错误检测用于确保系统本身的运行高效：资源分配记账保护与安全系统调用：提供操作系统服务的接口向操作系统传递参数的三种常用方法：寄存器直接传递参数参数保存在内存的块或表内，而块或表的地址通过寄存器传递…