
操作系统
文章平均质量分 91
张十五
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
死锁应对.
发生死锁的原因大部分人可能都见过交通阻塞,一大堆汽车因为争夺行路权,互不相让而造成阻塞。又或者因车辆发生故隙抛锚或两辆车相撞,造成道路阻塞。在这种情况下,所有的车都停下来,谁也无法前行,这就是死锁。死锁的发生,归根结底是因为对资源的竞争。 因为大家都想要某种资露,但又不能随心所欲地得到所有资源,在争夺的僵局中,导致任何人都无法继续推进。在一个多道编程的环境里,一个系统里存在多个进程或线程,面这些远程和线程共享该计算机系统里的资源。因为资源竞争面造成系统无法继续推进就是难以避免的了。这里所说的资源就是一原创 2021-11-08 22:05:38 · 359 阅读 · 0 评论 -
输入输出.
什么是输入输出计算机归根结底是为人类服务的,这就要求计算机必须提供某种机制使得人可以向计算机发出命令或操纵计算机。也就说计算机与人之间必须存在某种沟通的机制。 这种沟通的机制就是计算机的输入输出机制。输入提供的是一个“人→计算机”的通道。即人或外部世界通过输人向计算机发出命令或提供数据。输出提供的则是相反方向的通道,即“计算机→人”的通道。计算机通过这个通道向人或外部世界输出自己的计算结果,包括对其他设备的控制操纵命令。显然,输入输出的存在才使得计算机的存在有了意义。就像一个人,如果没有输入输出,即他原创 2021-11-07 23:21:23 · 2135 阅读 · 0 评论 -
优先级倒挂(priority inversion)
优先级倒挂( priority inversion)在之前已经有所提及。其所指的是一个低优先级任务持有一个被高优先级认为所需要的共享资源。这样高优先级任务因资源缺乏处于受阻状态,一直到低优先级任务释放资源为止。 这样实际上造成了这两个任务的优先级倒挂。如果此时有其他优先级介于二者之间的任务,并且其不需要这个共享资源,则该中级优先级的进程将获得CPU控制,从面超越这两个任务。在某些时候,优先级倒挂并不会造成损害。高优先级任务的延迟并不会被注意,因为低优先级进程最终会释放资源。但在其他一些时候,优先级倒挂则可原创 2021-11-05 19:55:57 · 932 阅读 · 0 评论 -
进程调度.
调度的目标前面讲过,在多进程,多线程并发的环境里,虽然从概念上看,有多个进程或线程在同时执行,但在单一CPU下,实际上在任何时刻只能有一个进程或线程处于执行状态。而其他线程则处于非执行状态。那么这就有一个需要解决的问题:我们是如何确定在任意时刻到底有哪个线程执行,哪些不执行呢?或者说,我们是如何进行线程调度的呢?进程/线程的调度是操作系统进程管理的一个重要组成部分。其任务是怎么选择下一个要运转的进程。而要探明这一点,则首先需要确定操作系统进程调度的目标是什么。这样,就知道选择什么进程最合适。那么操作系原创 2021-11-04 23:01:21 · 701 阅读 · 0 评论 -
进程同步.
为什么要同步我们前面说过,线程之间的关系是合作关系。既然是合作,那就得有某种约定的规则,不然合作就会出问题。例如,假如我们有两个线程同时运行,第一个线程在执行了一些操作后想检查当前的错误状态errno,但在其作出检查之前,线程2却修改了errno。这样,当第一个线程再次获得控制权后,检查将是线程2改写过的errno,这是不正确的,如图所示。之所以出现上述问题,是因为两个原因:errno是线程之间共享的全局变量。线程之间的相对执行顺序是不确定的。因此,要解决上述问题有两个办法,即分别消除上述两原创 2021-11-04 09:42:37 · 506 阅读 · 0 评论 -
线程通信(ITC)
为什么要通信通信是人的基本需求。而进程作为人的发明,自然脱离不了人的习性,也有通信需求。如果进程之间不进行任何通信,那么进程所能完成的任务就要大打折扣。 例如,父进程在创建子进程后,通常须要监督子进程的状态,以便在子进程没有完成给定的任务时,可以再创建一个子进程来继续。这就需要父子进程间通信。而线程间的通信则需要更多。由于一个进程通常包括多个线程,这多个线程之间因资源共享自然地就存在一种合作关系。这种合作关系虽然可以表现为相互独立,但更多地时候是互相交互。这就是通信。就像舞台上的多个演员,他们之间是一种原创 2021-11-02 22:53:17 · 6257 阅读 · 0 评论 -
线程(Thread)
线程概念那么线程是什么?我们知道,进程是运转的程序,是为了在CPU上实现多道编程而发明的一个概念。但是进程在一个时间只能干一件事情。 如果想同时干两件事,例如同时看两场电影,我们自然想到传说中的分身术,就像孙悟空那样同时变出多个真身。当然,人在现实中进行分身是办不到的。但进程却可以办到,办法就是线程。线程就是我们为了让一个进程能够同时干多件事情而发明的“分身术”。既然线程是进程的分身,每个线程自然在本质上是一样的,即拥有同样的程序文本。但由于是分身,自然也应该有不一样的地方,这就是线程执行时的上下文不原创 2021-11-02 21:21:39 · 7945 阅读 · 0 评论 -
进程(Process)
进程概念进程管理.内存管理和文件管理是操作系统的三大核心功能。那么什么是进程呢?顾名思义,进程就是进展中的程序,或者说进程是执行中的程序。 就是说,一个程序加载到内存后就变为进程。即:进程=程序+执行单一操作员单一控制终端、批处理均存在效率低下的问题,即CPU使用率不高。为了提高CPU利用率,人们想起将多个程序同时加载到计算机里,并发执行。这些同时存在于计算机内存的程序就称为进程。进程让每个用户感觉到自己独占CPU。因此,进程就是为了在CPU上实现多道编程而出现的概念,如图所示。进程模型那么进程到原创 2021-11-02 19:53:33 · 4334 阅读 · 0 评论 -
操作系统基本概念
计算机硬件基本知识从概念上讲,计算机的结构非常简单:首先布置一根总线,然后将各种硬件设备挂在总线上。所有这些设备都有一个控制设备,外部设备都由这些控制器与CPU通信。所有设备之间的涌信均需通过总线、如图所示。图中的粗线条为总线。为了提高计算机的效率,人们又设计出了流水线结构,即仿照工业流水装配线,将计算机的功能部件分为多个梯级,并将计算机的每条指令分拆为同样多个步骤,使每条指令在流水线上流动,到流水线最后一个梯级时指令执行完毕。流水线上的每个梯级都可以容纳一条指令同时执行,如上图所示。为了进一步提高原创 2021-11-01 22:34:10 · 503 阅读 · 0 评论 -
操作系统历史
第一阶段:状态机操作系统(1940年以前)这是计算机处在萌芽期时出现的操作系统。这种操作系统运行在英国人巴贝斯 ( Babbes )想像中的自动机中。 所谓状态机操作系统实际上算不上是我们现在通常所定义的操作系统,而是一种简单的状态转换程序:根据特定输入和现在的特定状态进行状态转换而已。这个时候的计算机也不是现代意义上的计算机,而是所谓的自动机,其功能非常简单,可以用“原始”来形容。能做的计算也只限于加减法。这个时代的操作系统没有什么功能,不支持交互命令输入,也不支持自动程序设计。甚至这个时候还没有存储程原创 2021-11-01 21:15:23 · 1997 阅读 · 0 评论 -
操作系统导论
程序是如何运行的计算机程序是怎样运行的呢?对于多数人来说,或多或少地知道任何程序必须首先有人写出来,即“编程”,然后放到计算机里即可运行。这种解释当然是过于简单了。计算机程序的运行实际上是一件十分复杂的事情,牵扯到方方面面。首先当然是进行编程,而编程需要计算机程序设计语言作为基础。对于绝大多数编写程序的人来说,使用的编程语言称为“高级程序设计语言”,如C,C++ ,Java等。但由于计算机并不认识高级语言编写的程序,编好的程序需要通过编译变成计算机能够识别的机器语言程序,而这需要编译器和汇编器的帮助。其原创 2021-10-31 18:46:21 · 811 阅读 · 0 评论 -
页面更换算法
页面需要更换之前介绍了分页系统。它克服了交换系统的各种缺点:外部碎片、难以增长、程序不能大于物理内存。但是天下没有免费的午餐,既然优点如此之多,那总得付出点代价。这个代价就是页面的更换。在交换系统下,一个程序作为一个整体加载到内存。因此,在运行时,无需再从磁盘上加载任何东西。而在分页系统下,一个程序的所有页面并不一定都在内存中这样,在执行的过程中就可能发生页面不在内存的情况。如果访问的页面不在内存,则系统将产生缺页中断。缺页中断服务程序将负责把位于磁盘上的数据加载到物理内存来。如果物理内存还有空闲页面,原创 2021-10-31 15:06:41 · 828 阅读 · 0 评论 -
段式内存管理
分页系统的缺点前面一节阐述了分页内存管理它克服了交换系统的所有缺点,但它自己有缺点吗?页表太大?这个缺占用多级页表克服了。多级页表速度慢?这个问题用TLB解决了绝大部分。页面来回更换?这个缺点用页面更换算法解决了大部分。 固定页面大小呢?这不应该算是一个缺点,因为可变页面大小的操作系统不仅难以选择最优的页面大小,而且会变得很复杂。内部碎片算是一个小小的缺憾,但总比交换系统的外部碎片强,一个进程的内部碎片所浪费的空间平均起来只有半个页面,相对于分页系统的诸多优点来说,这个缺点似乎微不足道。那么分页系统还原创 2021-10-30 16:56:59 · 1099 阅读 · 1 评论 -
页式内存管理
内存管理就是要将各种媒介组建成为一体,形成一个巨无霸似的虚拟存储系统。基址极限管理模式的问题到目前为止,已经讲述了几种基本的内存管理方法,分别是固定加载地址的内存管理、固定分区的内存管理、非固定分区的内存管理和交换内存管理,固定加载地址的内存管理只适合于单道编程,而其他三种则可用于多道编程。这三种适用于多道编程的内存管理模式均使用同一种实现机制:基址与极限基址与极限的工作原理是将程序发出的虚拟地址加上基址而获得物理地址!如果地址超过指定的极限,则视为地址出界而禁止访问,否则访问正常进行。在介绍过的三原创 2021-10-30 15:01:20 · 1979 阅读 · 0 评论 -
存储器的层次体系
计算机存储器的设计目标可归纳为三个问题:多大的容量?多快的速度?多贵的价格?“多大的容量”问题从某种意义上来说是无止境的,存储器有多大的容量,就可能开发出应用程序来使用它的容量。“多快的速度”问题相对易于回答,为达到最佳的性能,存储器的速度必须能够跟得上处理器的速度。换言之,当处理器正在执行指令时,我们不希望它会因为等待指令或操作数而暂停。“多贵的价格”问题也很重要。对一个实际的计算机系统,存储器的价格与计算机其他部件的价格相比应该是合理的。应该认识到,存储器的这三个重要特性即价格、容量和访问时间之间存原创 2021-10-29 21:45:31 · 1172 阅读 · 0 评论 -
基本内存管理
内存管理的环境程序要运行,必须先加载到内存。但在很久以前,准确地说是在操作系统出现以前,程序并不需要加载到内存才能运行。实际上,在那个已经久远的年代里,程序曾经是存放在卡片上,计算机每读一张卡片,就运行一条指令。因此,程序是直接从卡片到执行。但这种从外部存储媒介上直接执行指令的做法效率极低,且灵活性很差。因此,人们发明了内存储器来将需要运行的程序先行加载,再自动执行,从而提高效率和灵活性。这也导致了“存储的程序”概念,而存储的程序概念又导致计算机及软件系统的革命性变化。此后,人们对内存的要求是越来越多,原创 2021-10-29 19:48:20 · 1339 阅读 · 0 评论