<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=650&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / 操作系统知识点总结]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=650</link>
		<description><![CDATA[操作系统知识点总结 最近发表的帖子。]]></description>
		<lastBuildDate>Mon, 02 Jan 2023 04:40:09 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[操作系统知识点总结]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=697#p697</link>
			<description><![CDATA[<p>1.进程和线程以及他们的区别</p><p>进程：进程是对运行时程序的封装，是系统进行资源调度和分配的基本单位，实现操作系统的并发。</p><p>线程：线程是进程的子任务，是CPU调度和分配的基本单位。</p><p>&#160; &#160; 一个程序至少拥有一个进程，一个进程至少拥有一个线程，线程依赖于进程而存在。进程执行时拥有独立的内存单元，而多个线程共享进程的内存。</p><p>2.进程间的通信方式</p><p>管道及命名管道：管道可用于具有父子亲缘关系的进程间的通信，有名管道除了具有管道所具有的功能外，它还允许无亲缘关系的进程间的通信。</p><p>信号：信号是一种比较复杂的通信方式，用于接收进程某个事件已发生。</p><p>消息队列：消息队列是消息的链接表，它克服了，以上两种通信方式中信号量有限的缺点，具有写权限的进程可以按照一定的规则向消息队列中添加新信息，具有读权限的进程可以从消息队列中读取信息。</p><p>共享内存：可以说是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间，不同进程可以及时看到对方进程对共享内存中数据的更新。这种方式依赖于某种同步操作，如互斥锁和信号量等。</p><p>信号量：主要作为进程之间及同一进程的不同线程之间的同步和互斥手段。</p><p>套接字：这是一种更为一般的进程间通信机制，他可以用于网络中不同机器之间的进程间的通信，应用非常广泛。<br />3.线程的同步方式</p><p>互斥量：采用互斥对象机制，只有拥有互斥对象的线程才有访问公共资源的权限，因为互斥对象只有一个，所以可以保证公共资源不会同时被多个线程访问。</p><p>信号量：它允许同一时刻多个线程访问同一资源，但是需要控制同一时刻访问此资源的最大线程数量。</p><p>事件（信号）：通过通知操作的方式来保持多线程同步，还可以方便的实现多线程优先级的比较操作。<br />4.死锁，死锁产生条件</p><p>死锁：在两个或多个并发进程中，如果每个进程持有某种资源而等待其他进程释放它或者它们保持的资源，再改变这种状态之前，都不能向前推进，称这一组进程产生了死锁。（由于不合理的推进顺序或者资源分配导致产生了环路等待）</p><p>死锁产生的四个必要条件：</p><p>&#160; &#160; 互斥：至少一个资源处于非共享模式，即一次只能被一个进程使用；若其他进程申请使用该资源，则必须等到该资源被释放为止。</p><p>&#160; &#160; 占有并等待：一个进程必须占有至少一个资源，并等待另一个资源，而该资源为其他进程所占有</p><p>&#160; &#160; 非抢占：进程不能被强占，即资源只能被进程在完成任务后自愿释放。</p><p>&#160; &#160; 循环等待：若干进程之间形成一种头尾相接的环形等待资源关系。</p><p>5.死锁处理的基本策略和常用方法：</p><p>&#160; &#160; 预防死锁，避免死锁，检测死锁，解除死锁，鸵鸟算法（把头埋进沙子里，当做啥也没发生）</p><p>6.死锁预防的基本思想：</p><p>&#160; &#160; 只要确保死锁发生的四个必要条件中至少一个不成立，就能预防死锁的发生。</p><p>具体方法：</p><p>&#160; &#160; 打破互斥条件：允许进程同时访问某些资源。但是，有些进程不能被同时访问是由资源的属性决定的，因此这种方法并无实用价值。<br />&#160; &#160; 打破占有并等待条件：可以实行资源的预先分配策略（进程在运行前一次性向系统申请它所需要的所有资源，若所需全部资源得不到满足，则不分配任何资源，此进程暂不运行；只有当系统满足当前进程所有资源时，才一次性的将全部资源分配给该进程）或者只允许在没有占有资源时才可以申请资源（一个进程可以申请资源并使用他们，但是当前进程申请更多资源前，必须释放所占有资源）。这种策略存在一些缺点，在很多情况下，无法预知一个进程执行前所需的全部资源，因为进程是动态执行的，不可预知的；同时，会降低资源利用率，导致降低进程的并发性。<br />&#160; &#160; 打破非抢占条件：允许进程强行从占有者那里夺取某些资源。当一个进程占有了一部分资源，在其中请求新的资源且得不到满足，它必须释放所有的资源以使其他线程使用，这种预防死锁的方式实现起来困难会降低系统性能。<br />&#160; &#160; 打破循环等待条件：实行资源有序分配策略。对所有资源排序编号，所有进程对资源的请求必须严格按照资源序号递增的顺序提出，即只占用了小号资源才能申请大号资源，这样就不会产生环路，预防死锁发生。</p><p>7.死锁避免的基本思想</p><p>死锁避免的基本思想是动态的检测资源分配状态，以确保循环等待条件不成立，从而确保系统处于安全状态。所谓的安全状态指：如果系统能按照某个顺序为每个进程分配资源，那么系统状态是安全的，换句话说就是，如果存在一个安全序列，那么系统处于安全状态。资源分配图算法和银行家算法是两种经典的死锁避免算法，其可以确保，系统始终处于安全状态。其中资源分配图算法应用场景为每种资源类型只有一个实例（申请边，分配边，需求边，不形成环再允许分配）而银行家算法应用于每种资源类型可以有多个实例的场景。<br />8.死锁解除的常用方法</p><p>进程终止和资源抢占：</p><p>&#160; &#160; 所谓进程终止是指简单地终止一个或多个进程以打破循环等待，包括两种方式：终止死锁进程和一次只终止一个进程直到取消死锁循环为止。</p><p>&#160; &#160; 所谓资源抢占是指从一个或多个死锁进程那里抢占一个或多个资源，此时需要考虑三个问题：</p><p>&#160; &#160; &#160; &#160; 选择一个牺牲品<br />&#160; &#160; &#160; &#160; 回滚，回滚到安全状态<br />&#160; &#160; &#160; &#160; 饥饿，在代价因素中加上回滚次数，回滚的越多则越不可能继续被作为牺牲品。避免一个进程被一直回滚。</p><p>9.进程有几种状态</p><p>&#160; &#160; 就绪状态：进程已获得除处理机外的所需资源，等待分配处理及资源<br />&#160; &#160; 运行状态：占用处理机资源运行，处于此状态的进程数小于等于CPU数<br />&#160; &#160; 阻塞状态：进程等待某种条件，条件满足前无法执行</p><p>10.线程有哪几种状态</p><p>&#160; &#160; 就绪：线程准备运行，不一定立马就能开始执行<br />&#160; &#160; 运行中：进程正在执行线程代码<br />&#160; &#160; 等待中：线程处于阻塞状态，等待外部的处理结束<br />&#160; &#160; 睡眠中：线程被强制睡眠<br />&#160; &#160; I/O阻塞：等待I/O操作完成<br />&#160; &#160; 同步阻塞：等待获取锁<br />&#160; &#160; 死亡：线程完成了执行</p><p>11.分页和分段有什么区别（内存管理）</p><p>&#160; &#160; 段式分配管理是一种符合用户视角的内存分配管理方案，在段式存储管理中，将程序的地址空间划分为若干段，堆栈段；这样每个进程有一个二维地址空间，相互独立，互不干扰。段式管理的优点是：没有内碎片（因为段大小可变，改变段大小来消除内碎片）。但段换入换出时，会产生外部碎片（比如4K的段换5K的段，会产生1K的外碎片）</p><p>&#160; &#160; 页式存储管理方案是一种用户视角内存与物理内存相分离的内存分配管理方案。在页式存储管理中，将程序的逻辑地址分为固定大小的页，而物理内存划分为同样大小的帧，程序加载时，可以将任意一页放入内存中任意一个帧，这些帧不必连续，从而实现离散分离。页式存储管理的优点是：没有外部碎片（因为页大小固定），单会产生内碎片（一个页可能填充不满）</p><p>两者不同点：</p><p>&#160; &#160; 目的不同：分页是由于系统管理的需要而不是用户的需要，他是信息的物理单位；分段的目的是为了更好地满足用户的需要，它是信息的逻辑单位，它含有一组其意义相对完整的信息<br />&#160; &#160; 大小不同：页的大小固定且有系统决定，而段的长度大小却不固定，由其所完成的功能决定<br />&#160; &#160; 地址空间不同：段向用户提供二维地址空间，页向用户提供的是一维地址空间<br />&#160; &#160; 信息共享：段是信息的逻辑单位，便于存储保护和信息的共享，页的保护、共享受到限制<br />&#160; &#160; 内存碎片：页式存储管理的优点是没有外碎片，单会产生内碎片，段式管理的优点是没有内碎片，但段的换入换出时会产生外部碎片</p><p>12.操作系统进程调度策略</p><p>&#160; &#160; FCFS（先来先服务，队列实现，非抢占）：先请求CPU的进程先分配到CPU<br />&#160; &#160; SJF（最短作业优先调度算法）：平均等待时间最短，但难以知道下一个CPU区间长度<br />&#160; &#160; 优先级调度算法（可以是抢占的也可以是非抢占的）：优先级越高的越先分配到CPU，相同优先级先到先服务，存在的主要问题是：低优先级进程无穷等待CPU，会导致无穷阻塞式饥饿，解决方案：老化（随着时间推移，那些越老的进程优先级越高）<br />&#160; &#160; 时间片轮转调度算法（可抢占）：队列中没有进程被分配超过一个时间片的CPU时间，除非他是唯一可运行的进程。如果进程的CPU区间超过了一个时间片，那么进程就被抢占并放回就绪队列<br />&#160; &#160; 多级队列调度算法：将就绪队列分成多个独立的队列，每个队列都有自己独立的调度算法，队列之间采用固定优先级抢占调度，其中，一个进程根据自身属性被永久地分配到一个队列中。<br />&#160; &#160; 多级反馈队列调度算法：与多级队列调度算法相比，其允许进程在多列之间移动，若进程使用过多CPU时间，那么他会被转移到更低的优先级队列，在较低的优先级队列等待时间过长的进程会被转移到更高优先级的队列，以防饥饿发生。</p><p>13.进程同步的机制有哪些</p><p>&#160; &#160; 原子操作，信号量机制，自旋锁管理，会合、分布式管理（?）</p><p>14.虚拟内存是什么</p><p>&#160; &#160; 内存的发展历程：没有内存抽象-&gt;有内存抽象-&gt;连续内存分配-&gt;不连续内存分配</p><p>&#160; &#160; 虚拟内存允许执行进程不完全在内存中。虚拟内存的基本思想是：每个进程拥有独立的地址空间，这个空间被分为相等大小的多个块，称为页，每个页都是一段连续的地址。这些页被映射到物理内存，但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时，由硬件立即进行必要的映射；当程序引用到一部分不在物理内存中的地址空间时，有操作系统负责将缺失的部分装入物理内存并重新执行失败的命令。这样，对于进程而言，逻辑上似乎拥有很大的内存空间，实际其中一部分对应物理内存上的一块（称为帧，通常也和帧大小相等），还有一些没加载在内存中的对应在硬盘上，注意：请求分页系统，请求分段系统和请求段页式系统都是针对虚拟内存的，通常请求实现内存和外村的信息置换，虚拟内存实际上可以比物理内存大。当访问虚拟内存时，会访问内存管理单元去匹配对应的物理地址，如果虚拟内存的页并不存在于物理内存中会产生缺页中断，从磁盘取得缺的页放入内存，如果内存已满，会根据某种算法将磁盘中的页换出。</p><p>15.页面置换算法有哪些</p><p>&#160; &#160; FIFO先进先出算法：比如作业调度（实现简单）<br />&#160; &#160; LRU最近最少用算法根据使用时间到现在的长短来判断<br />&#160; &#160; OPT最优置换算法：理论最优，保证置换出去的页是不再被使用的页（或最长时间里不被使用的页）<br />&#160; &#160; LFU最少使用次数算法：根据使用次数判断</p><p>16. 虚拟内存的应用与优点有哪些</p><p>&#160; &#160; 虚拟内存很适合在多道程序设计系统中使用，许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时，可以吧CPU交给另一个进程使用。</p><p>&#160; &#160; 在内存中可以保留多个进程，系统并发性提高<br />&#160; &#160; 接触了用户与内存间的紧密约束，进程可以比内存的全部空间还大</p><p>17.颠簸是什么（抖动）</p><p>颠簸本质上是指频繁的页调度行为，具体来讲，进程发生缺页中断，这时必须置换某一个页。然而，其他所有页都在使用，它置换一个页，但又立刻再次需要这个页。因此会不断地产生缺页中断，导致整个系统效率急剧下降，这种现象称为颠簸。<br />18.如何解决内存颠簸</p><p>&#160; &#160; 如果是因为页面置换策略失误，可以修改算法来解决这个问题<br />&#160; &#160; 如果是因为运行的程序太多，造成程序无法同时将所有频繁访问的页面调入内存，则要降低多道程序的数量<br />&#160; &#160; 否则，终止该进程或增加物理内存的容量</p><p>19.局部性原理是什么</p><p>&#160; &#160; 时间上的局限性：最近被访问的页在不久的将来还会被访问<br />&#160; &#160; 空间上的局限性：内存中被访问的页周围的页很可能被访问</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Mon, 02 Jan 2023 04:40:09 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=697#p697</guid>
		</item>
	</channel>
</rss>
