操作系统
文章平均质量分 79
Unique-You
这个作者很懒,什么都没留下…
展开
-
《现代操作系统(中文第三版)》课后习题——第二章 进程与线程
http://blog.csdn.net/cztqwan/article/details/52712392第二章 进程和线程1、图2-2中给出了三个进程状态,在理论上,三个状态可以有六种转换,每个状态两个。但是,图中只给出了四种转换。有没有可能发生其他两种转换中的一个或两个?答:从阻塞到运行的转换是可以想象的。假设某个进程在I/O上阻塞,而且I/O结束,如果转载 2018-01-11 11:03:10 · 3667 阅读 · 1 评论 -
哲学家就餐问题
哲学家就餐的同步问题:五个哲学家围坐在一张圆桌周围,每个哲学家面前都有一盘通心粉。由于通心粉很滑,所以需要两把叉子才能夹住。相邻两个盘子之间放有一把叉子,餐桌如图2-44所示。 哲学家的生活中有两种交替活动时段:即吃饭和思考(这只是一种抽象,即对哲学家而言其他活动都无关紧要)。当一个哲学家觉得饿了时,他就试图分两次去取其左边和右边的叉子,每次拿一把,但不分次序。如果成功地得到了两把叉子,就开始吃饭...原创 2018-05-02 21:51:35 · 2809 阅读 · 0 评论 -
读者-写者问题
哲学家就餐问题对于互斥访问有限资源的竞争问题(如I/O设备)一类的建模过程十分有用。另一个著名的问题是读者-写者问题(Courtois 等人,1971),它为数据库访问建立了一个模型。例如,设想一个飞机订票系统,其中有许多竞争的进程试图读写其中的数据。多个进程同时读数据库是可以接受的,但如果一个进程正在更新(写)数据库,则所有的其他进程都不能访问该数据库,即使读操作也不行。这里的问题是如何对读者和...原创 2018-05-02 22:07:09 · 1455 阅读 · 0 评论 -
地址空间,基址寄存器和界限寄存器,动态重定位
地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了在一些特殊情况下进程需要共享它们的地址空间外)。给每个程序一个自己的地址空间,使得一个程序中的地址28所对应的物理地址与另一个程序中的地址28所对应的物理地址不同。方法:基址寄存器与界限寄存器使用一种简单的动态重定位,把每个进程的地址空间映射到物理内存的不同部分。当使用基址...原创 2018-05-03 09:10:44 · 10059 阅读 · 3 评论 -
交换技术
如果计算机物理内存足够大,可以保存所有进程,那么之前提及的所有方案都或多或少是可行的。但实际上,所有进程所需的RAM数量总和通常要远远超出存储器能够支持的范围。把所有进程一直保存在内存中需要巨大的内存,如果内存不够,就做不到这一点。有两种处理内存超载的通用方法。a、交换技术,即把一个进程完整调入内存,使该进程运行一段时间,然后把它存回磁盘。空闲进程主要存储在磁盘上,所以当它们不运行时就不会占用内存...原创 2018-05-03 09:41:10 · 29662 阅读 · 0 评论 -
空闲内存管理,位图,空闲链表
在动态分配内存时,操作系统必须对其进行管理。有两种方式跟踪内存使用情况:位图和空闲链表。1. 使用位图的存储管理使用位图方法时,内存可能被划分成小到几个字或大到几千字节的分配单元。每个分配单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)。一块内存区和其对应的位图如图3-6所示。 分配单元的大小是一个重要的设计因素。分配单元越小,位图越大。然而即使只有4个字节大小的分配单元,32位(4字节...原创 2018-05-03 10:16:44 · 14400 阅读 · 0 评论 -
虚拟内存,页表,快表,多级页表,倒排页表
虚拟内存尽管基址寄存器和界限寄存器可以用于创建地址空间的抽象,还有另一个问题需要解决:管理软件的膨胀(bloatware)。虽然存储器容量增长快速,但是软件大小的增长更快。需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需要,但总体来看,它们仍然超出了内存大小。交换技术(swapping)并不是一个有吸引力的解决方案(换入换出耗时),...原创 2018-05-03 11:45:10 · 15106 阅读 · 4 评论 -
分页系统中的设计问题---局部分配和全局分配、负载控制、页面大小、分离的指令空间和数据空间、共享页面、共享库、 内存映射文、清除策略件、虚拟内存接口
分页系统中的设计问题在前几节里讨论了分页系统是如何工作的,并给出了一些基本的页面置换算法和如何实现它们。然而只了解基本机制是不够的。要设计一个系统,必须了解得更多才能使系统工作得更好。下面将讨论为了使分页系统达到较好的性能,操作系统设计者必须仔细考虑的一些其他问题。局部分配策略与全局分配策略请见点击打开链接在前几节中,我们讨论了在发生缺页中断时用来选择一个被置换页面的几个算法。与这个选择相关的一个...原创 2018-05-03 22:42:30 · 1268 阅读 · 0 评论 -
虚拟内存实现---分页相关工作、缺页中断处理、指令备份、锁定内存中的页面、后备存储、 策略和机制的分离
3.6 有关实现的问题实现虚拟内存系统要在主要的理论算法(如第二次机会算法与老化算法,局部页面分配与全局页面分配,请求调页与预先调页)之间进行选择。但同时也要注意一系列实际的实现问题。3.6.1 与分页有关的工作操作系统要在下面的四段时间里做与分页相关的工作:进程创建时,进程执行时,缺页中断时和进程终止时。当在分页系统中创建一个新进程时,操作系统要确定程序和数据在初始时有多大,并为它们创建...原创 2018-05-04 11:35:27 · 1386 阅读 · 2 评论 -
分段---纯分段的实现、分段和分页结合
分段到目前为止我们讨论的虚拟内存都是一维的,虚拟地址从0到最大地址,一个地址接着另一个地址。对许多问题来说,有两个或多个独立的地址空间可能比只有一个要好得多。比如,一个编译器在编译过程中会建立许多表,其中可能包括:1) 被保存起来供打印清单用的源程序正文(用于批处理系统)。2) 符号表,包含变量的名字和属性。3) 包含用到的所有整型量和浮点常量的表。4) 语法分析树,包含程序语法分析的结果。5) ...原创 2018-05-04 11:46:12 · 4009 阅读 · 0 评论 -
伙伴(buddy)算法及位图
伙伴(buddy)算法,它不能根据需要从被管理内存的开头部分创建新内存。它有明确的共性,就是各个内存块可分可合,但不是任意的分与合。每个块都有个朋友,或叫“伙伴”,既可与之分开,又可与之结合。伙伴分配程序把内存块存放在比链接表更先进的数据结构中。这些结构常常是桶型、树型和堆型的组合或变种。一般来说,伙伴分配程序的工作方式是难以描述的,因为这种技术随所选数据结构的不同而各异。由于有各种各样的具有已知...转载 2018-05-05 20:07:52 · 16019 阅读 · 7 评论 -
内存分配方式
内存分配方式有两种:连续内存分配方式和离散内存分配方式。不同的分配方式又有不同的分配算法。①连续内存分配方式1)固定分区分配将内存划分成若干个固定大小的块。将程序装入块中即可。内存划分成各个块之后,块大小不再改变。当然,划分块的方式有:所有的块大小相等;划分的块大小不相等。这种方式,在实际的内存分配之前,就已经知道了所有的内存块大小了。---- 固定分区分配是最简单的一种可运行多道程序的存储管理方...原创 2018-05-05 20:14:42 · 4186 阅读 · 0 评论 -
内存碎片---内部碎片&外部碎片
内部碎片的产生:因为所有的内存分配必须起始于可被 4、8 或 16 整除(视处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户。假设当某个客户请求一个43字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节、48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片。外部碎片的产生:频繁的分配与回收物理页面会导...转载 2018-05-05 20:44:01 · 17016 阅读 · 3 评论 -
slab算法
slab算法提出原因:Buddy 系统解决了物理内存分配的外部碎片问题,但由于粒度太大(内存块的单位较大),以页为单位,采用伙伴算法分配内存时,每次至少分配一个页面(4K),显然用起来有些浪费,当如果要申请一些小的内存(请求分配的内存大小为几十个字节或几百个字节时,即对于小块内存的分配和回收),并且会频繁的申请相同数据结构的内存来存储一些内核中的数据时,这时 Slab 便应运而生了。在内核中,经常...转载 2018-05-06 21:23:36 · 4093 阅读 · 0 评论 -
死锁---资源、检测和恢复、避免、预防
资源:需要排他性使用的对象怕;随着时间推移,必须获得、使用以及释放的任何东西可抢占资源:可以从拥有的进程中抢占而不会产生任何副作用,例如、存储器(内存)不可抢占资源:在不引起相关的计算失败的情况下,无法把它从占有它的进程处抢占过来死锁与不可抢占资源有关,有关可抢占资源的潜在死锁通常可通过在进程之间重新分配资源而化解。死锁:如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那...原创 2018-05-07 16:36:46 · 5211 阅读 · 1 评论 -
线程调度
当若干进程都有多个线程时,就存在两个层次的并行:进程和线程。在这样的系统中调度处理有本质差别,这取决于所支持的是用户级线程还是内核级线程(或两者都支持)。首先考虑用户级线程。由于内核并不知道有线程存在,所以内核还是和以前一样地操作,选取一个进程,假设为A,并给予A以时间片控制。A中的线程调度程序决定哪个线程运行,假设为A1。由于多道线程并不存在时钟中断,所以这个线程可以按其意愿任意运行多长时间。如...原创 2018-05-02 21:25:41 · 803 阅读 · 0 评论 -
策略和机制
到目前为止,我们隐含地假设系统中所有进程分属不同的用户,并且,进程间相互竞争CPU。通常情况下确实如此,但有时也有这样的情况:一个进程有许多子进程并在其控制下运行。例如,一个数据库管理系统可能有许多子进程,每一个子进程可能处理不同的请求,或每一个子进程实现不同的功能(如请求分析,磁盘访问等)。主进程完全可能掌握哪一个子进程最重要(或最紧迫)而哪一个最不重要。但是,以上讨论的调度算法中没有一个算法从...原创 2018-05-02 21:12:08 · 2708 阅读 · 0 评论 -
进程
1、为什么要引入进程?为了使多道程序能够并发执行。提高资源利用率和系统吞吐量。2、什么是进程?进程是一个正在执行程序的实例,包括程序计数器,寄存器和变量的当前值。进程是某种类型的一次活动,有程序、输入、输出和状态,单个处理器可被多个进程共享,使用进程调度算法决定何时停止一个进程并转而执行另一个进程(即进程切换)。若一个程序执行两遍,则算作两个进程。3、进程的特征:动态性:是程序的一次执行;并发性:...原创 2018-03-21 11:28:31 · 371 阅读 · 0 评论 -
内存分配策略和分配方法
点击打开链接----- 在为进程分配内存时,将涉及到3个问题:1)最小物理块数的确定;2)物理块的分配策略;3)物理块的分配算法。1、最小物理块数的确定-- 这里所说的最小物理块数,是指能保证进程正常运行所需的最小物理块数。-- 当系统为进程分配的物理块数小于此值时,进程将无法运行。-- 进程应获得的最少物理块数与计算机的硬件结构有关,取决于指令的格式、功能和寻址方式。2、物理块的分配策略-- 在...转载 2018-04-23 16:29:15 · 5719 阅读 · 0 评论 -
线程
一、为什么要引入线程引入线程的好处(1)易于调度。(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。(3)开销少。创建线程比创建进程要快,所需开销很少。。(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。由于进程是资源的拥有者,所以在...原创 2018-05-01 14:39:04 · 774 阅读 · 1 评论 -
竞争条件,临界区,忙等待的互斥
一、竞争条件和临界区在同一个应用程序中运行多个线程本身并不会引起问题。当多个线程访问相同的资源时才会出现问题。比如多个线程访问同一块内存区域(变量、数组、或对象)、系统(数据库、 web 服务等)或文件。事实上,只有一个或多个线程改写这些资源时才会出现问题。多个线程只读取而不会改变这些相同的资源时是安全的。两个线程访问同一个资源而且与线程访问资源时的顺序有关的这样一种情形就叫竞争条件。 导致竞争条...原创 2018-05-01 15:50:16 · 2604 阅读 · 0 评论 -
睡眠与唤醒,生产者消费者问题
Peterson解法和TSL或XCHG解法都是正确的,但它们都有忙等待的缺点。这些解法在本质上是这样的:当一个进程想进入临界区时,先检查是否允许进入,若不允许,则该进程将原地等待,直到允许为止。这种方法不仅浪费了CPU时间,而且还可能引起预想不到的结果。考虑一台计算机有两个进程,H优先级较高,L优先级较低。调度规则规定,只要H处于就绪态它就可以运行。在某一时刻,L处于临界区中,此时H变到就绪态,准...原创 2018-05-01 16:57:41 · 1988 阅读 · 4 评论 -
信号量,生产者消费者
信号量(semaphore)使用一个整型变量来累计唤醒次数,供以后使用。一个信号量的取值可以为0(表示没有保存下来的唤醒操作)或者为正值(表示有一个或多个唤醒操作)。两种操作:down和up(PV原语)(分别为一般化后的sleep和wakeup)。对一信号量执行down操作,则是检查其值是否大于0。若该值大于0,则将其值减1(即用掉一个保存的唤醒信号)并继续;若该值为0,则进程将睡眠,而且此时do...原创 2018-05-01 17:22:35 · 1879 阅读 · 0 评论 -
互斥量,生产者消费者
如果不需要信号量的计数能力,有时可以使用信号量的一个简化版本,称为互斥量(mutex)。互斥量仅仅适用于管理共享资源或一小段代码。由于互斥量在实现时既容易又有效,这使得互斥量在实现用户空间线程包时非常有用。互斥量是一个可以处于两态之一的变量:解锁和加锁。这样,只需要一个二进制位表示它,不过实际上,常常使用一个整型量,0表示解锁,而其他所有的值则表示加锁。互斥量使用两个过程。当一个线程(或进程)需要...原创 2018-05-01 20:06:18 · 1018 阅读 · 0 评论 -
管程,生产者消费者
有了信号量和互斥量之后,进程间通信看来就很容易了,实际是这样的吗?答案是否定的。考察图2-28点击打开链接中向缓冲区放入数据项以及从中删除数据项之前的down操作。假设将生产者代码中的两个down操作交换一下次序,将使得mutex的值在empty之前而不是在其之后被减1。如果缓冲区完全满了,生产者将阻塞,mutex值为0。这样一来,当消费者下次试图访问缓冲区时,它将对mutex执行一个down操作...原创 2018-05-01 21:10:09 · 5610 阅读 · 1 评论 -
消息传递,生产者消费者
上面提到的其他的方法就是消息传递(message passing)。这种进程间通信的方法使用两条原语send和receive,它们像信号量而不像管程,是系统调用而不是语言成分。因此,可以很容易地将它们加入到库例程中去。例如:send(destination, &message);和receive(source, &message);前一个调用向一个给定的目标发送一条消息,后一个调用...原创 2018-05-01 21:38:00 · 3455 阅读 · 2 评论 -
屏障
最后一个同步机制是准备用于进程组而不是用于双进程的生产者-消费者类情形的。在有些应用中划分了若干阶段,并且规定,除非所有的进程都就绪准备着手下一个阶段,否则任何进程都不能进入下一个阶段。可以通过在每个阶段的结尾安置屏障(barrier)来实现这种行为。当一个进程到达屏障时,它就被屏障阻拦,直到所有进程都到达该屏障为止。屏障的操作如图2-37所示。在图2-37a中可以看到有四个进程接近屏障,这意味着...原创 2018-05-01 21:45:39 · 882 阅读 · 0 评论 -
进程间通信(IPC)-管道、消息队列、共享内存、信号、信号量、套接字
多进程:首先,先来讲一下fork之后,发生了什么事情。由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。将子进程id返回给父进程的理由是:因为一个进程的子进程可以多于一个,没有一个函数使一个进程可以获得其所有子进程的进程id。对子进程来说,之所以fork返回0给它,是...转载 2018-05-02 08:59:14 · 7054 阅读 · 0 评论 -
调度简介,调度算法分类,调度算法的目标
2.4 调度当计算机系统是多道程序设计系统时,通常就会有多个进程或线程同时竞争CPU。只要有两个或更多的进程处于就绪状态,这种情形就会发生。如果只有一个CPU可用,那么就必须选择下一个要运行的进程。在操作系统中,完成选择工作的这一部分称为调度程序(scheduler),该程序使用的算法称为调度算法(scheduling algorithm)。尽管有一些不同,但许多适用于进程调度的处理方法也同样...原创 2018-05-02 19:36:40 · 6686 阅读 · 0 评论 -
批处理系统中的调度---先来先服务、最短作业优先、最短剩余时间优先
1. 先来先服务在所有调度算法中,最简单的是非抢占式的先来先服务(first-come first-severd)算法。使用该算法,进程按照它们请求CPU的顺序使用CPU。基本上,有一个就绪进程的单一队列。早上,当第一个作业从外部进入系统,就立即开始并允许运行它所期望的时间。不会中断该作业,因为它需要很长的时间运行。当其他作业进入时,它们就被安排到队列的尾部。当正在运行的进程被阻塞时,队列中的第一...原创 2018-05-02 19:49:46 · 22662 阅读 · 2 评论 -
交互式系统中的调度---轮转调度、优先级调度、多级队列、最短进程优先、保证调度、彩票调度、公平分享调度
1. 轮转调度一种最古老、最简单、最公平且使用最广的算法。每个进程被分配一个时间段,称为时间片(quantum),即允许该进程在该时间段中运行。如果在时间片结束时该进程还在运行,则将剥夺CPU并分配给另一个进程。如果该进程在时间片结束前阻塞或结束,则CPU立即进行切换。很容易实现,调度程序所要做的就是维护一张可运行进程列表,如图2-41a所示。当一个进程用完它的时间片后,就被移到队列的末尾,如图2...原创 2018-05-02 20:46:41 · 3096 阅读 · 3 评论 -
实时系统中的调度
实时系统是一种时间起着主导作用的系统。典型地,外部的一种或多种物理设备给了计算机一个刺激,而计算机必须在一个确定的时间范围内恰当地做出反应。例如,在CD播放器中的计算机获得从驱动器而来的位流,然后必须在非常短的时间间隔内将位流转换为音乐。如果计算时间过长,那么音乐就会听起来有异常。其他的实时系统例子还有,医院特别护理部门的病人监护装置、飞机中的自动驾驶系统以及自动化工厂中的机器人控制等。在所有这些...原创 2018-05-02 21:00:56 · 3028 阅读 · 0 评论 -
两阶段加锁、通信死锁、活锁、饥饿
两阶段加锁第一阶段:进程试图对所有所需的记录进行加锁,一次锁一个记录。若第一阶段加锁成功,就开始第二阶段,完成更新然后释放锁。若在第一阶段某个进程需要的记录已被加锁,则该进程释放它所有加锁的记录,然后重新开始第一阶段。通信死锁在一系列进程中,每个进程因为等待另外一个进程引发的时间而产生阻塞。超时可以中断通信死锁,只要一个信息被发送至一个特定的地方,并等待其返回一个预期的回复,发送者就同时启动计数器...原创 2018-05-07 17:06:43 · 987 阅读 · 0 评论