华中科大MOOC 操作系统原理讨论题
1没有安装操作系统的计算机启动过程和结果?
启动会比较快,但功能很局限,无法使用常见的软件应用,对于普通用户来说,功能很局限,对于专业工程师来说,想使用没有操作系统的计算机也有难度。启动后进入 BIOS
2虚拟机软件(例如VMware,VirtualPC等)能不能理解为操作系统
虚拟机本身运行在一个操作系统上,但对虚拟机上运行的程序来说,它是一个OS。
Q:现代操作系统会不会因为内存太小,而让应用程序无法启动运行或让系统崩溃?
操作系统的内存管理能使较大的应用程序在内存小的情况下运行
Q:在多道批处理中尝试不断增加程序的数量,系统的效率会不会持续增加?结果会如何?
不会,计算机效率达到峰值时,继续增加程序数量,系统会崩溃
Q:分时技术的时间片设置太大或太小,应该根据哪些因素来考虑?是尽量大好还是尽量小好?
时间片小,每次运行时间短,但是等待时间短;时间片大,每次运行时间长,但是等待时间也长;根据分时操作系统的特点:多路调制性、独占性、互交性分析,时间片应尽量小;就绪队列中进程的数目,系统对响应时间的要求,系统的处理能力。
Q:你认为国产操作系统能否成功?影响成功的因素有哪些?
能,但对目前而言成功的概率可能有点小。对于现在国内如果发布新的操作系统在技术,组织管理,还有资金,有多少厂家能够共同撑起,等因素;国家政策支持;然后国产操作系统势必会照顾国内用户体验,因此会更受民众支持;技术层次也在一直进步
Q:操作系统的微内核结构的优点对我们设计大规模的应用程序有什么启示?
(1)提高了系统的可扩展性
(2)增强了系统的可靠性
(3)可移植性强
(4)提供了对分布式系统的支持
(5)融入了面向对象技术
Q:用户态向内核态转有多种情形(用户请求OS提供服务、发生中断、用户进程产生错误、用户态企图执行特权指令),但是本质上就是一种情形,即通过中断的形式进入。如何理解这句话?
系统在运行时由用户态转到内核态的最主要的三种方式包括1.系统调用2.异常3. 外围设备的中断 而其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。 从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,所以即是用户态向内核态转有多种情形,本质上就是一种情形,即通过中断。
Q:CPU收到外部中断信号后,是如何响应该外部信号,完成中断服务程序后,并最后自动回到原程序继续运行的?这个过程中硬件,软件会做哪些工作?
识别中断源
保护断点和现场
装入 中断服务程序地址CS:ip
进入中断服务程序
恢复断点和现场
中断返回
Q:操作系统的初始引导过程涉及哪些程序模块,各自存放的介质是什么,存放的形式是什么?
BIOS 它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,介质是电路程序固件,存放形式是硬件,MBR MBR为存储设备的第一个扇区,也就是该存储设备的最前面的512字节 介质是硬盘,存放形式是字节数据。
Q: make menuconfig的作用什么?它产生的最终结果是什么?或者说它输出什么?它是编译命令吗?
make menuconfig作用是配置Linux内核。它产生的最终结果是在源码主文目录中出现一个配置Linux内核的图形界面。它不是编译命令,是基于文本选项的配置界面
Q:比较DOS、Windows7与Linux早期版本都有哪些典型的操作界面?操作界面对普通用户(办公或娱乐)选择操作系统有何影响?
Windows:图形用户界面和系统功能调用 Linux:键盘命令与系统功能调用 命令行模式、用户图形界面,更人性化的操作界面,会使用户使用起来更加方便
Q:如何理解Shell与内核之间的交互?
不能,Shell就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。它是一个桥梁,用户和内核之间建立的友谊,都是通过这个桥梁完成的,也就是我们想让内核帮我们做一些事情,首先需要将用户的指令去传递给shell,翻译成内核可以理解的一些信息,从而让内核为我们服务。
Q: printf,open都是Linux中典型的隐式系统调用。当我们在“为Linux内核增加新的系统调用实验”中增加一个新的系统调用后,我们在应用程序中是如何调用的它们的?为何我们不能像printf,open等函数一样简单地调用?
printf, open等函数都是linux种典型的隐式系统调用,类似Q:PI函数,通常在高级语言中使用,在编译时隐式系统调用会转化为显式的系统调用,
因此可以在系统中直接调用。而在Linux中新增一个系统调用,则需要先在核态中写入一个函数,
再将函数的日寇地址加入系统调用函数入口地址列表中,然后为其设置一个中断号,并存放对应地址。
当在应用程序中调用时,函数先在用户态执行,遇到INT 80H指令时,到system_call中找到相应的子函数入口地址,再到核心态中调用该系统函数
Q:进程具有异步性。异步,即每个程序不考虑其它程序的运行进度,按自己的逻辑往前运行。那么,异步性这个特点,好不好呢?是进程的优点还是缺点呢?
优点是:
1、异步流程可以立即给调用方返回初步的结果。
2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。
3、异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。
4、异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率。
异步的执行效率高,节省时间,
缺点是:
实际操作系统中
会占用更多的资源,不利于我们对进程进行控制。
Q:为何没有“阻塞到运行”或“就绪到阻塞”这样的状态迁移?,为何没有“阻塞到运行”或“就绪到阻塞”这样的状态迁移?
阻塞态不能到运行态,因为CPU在同一时刻只能处理一个进程。 就绪态不能到阻塞态,一个就绪进程是不可能做任何会产生阻塞的 I/O 或者别的什么事情。只有运行的进程才能被阻塞
Q:进程控制块中“内部进程通信信息”这一类成员变量(显然不止一个)的作用是什么?
1 进程标识符。 2 处理机状态。处理机状态也称处理机上下文,主要由处理机的各种寄存器中的内容组成。 3 进程调度信息 4 进程控制信息。
Q:“撤销进程”的定义中提到,撤销一个进程之前,先【递归】检查其是否有子进程,如有,应先“撤销”子进程。请问,Linux是否会按这个要求去撤销某个进程?如果是的话,会有什么后果?如果不是的话,系统如何处理该进程的子孙进程(这些进程将失去父进程或祖先进程)?
不是 1.收回进程的所有资源 2.撤销该进程的PCB :从PCB队列中检索到该PCB,获取该进程的状态,若进程处于运行态,立即终止进程;若进程具有子进程,则先递归撤销子进程;Linux不会撤销子进程,而是由另一个进程接管,释放进程的所有资源,将进程从PCB队列中移除
Q:列举你知道的WINDOWS中,在程序启动exe程序创建相应进程的方法?各有什么特点?
1、点击应用程序对应的图标或在控制台上直接输入可执行程序的名字按回车,此方法简单易操作,消费者无需对代码有要求。
2、system()函数创建进程:建立独立进程,拥有独立的代码空间,内存空间,等待新的进程执行完毕,system才返回.(阻塞)。
3、WinExec()函数创建进程:函数简单只有两个参数,前一个指定路径,后一个指定显示方式。
4、ShellExec()函数创建进程:可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,还可以打开网页,启动相应的邮件关联 发送邮件等等。
5、CreateProcess()函数创建进程:一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果要得到足够多的关于新的进程的信息,控制新的进程的细节属性,就需要使用CreateProcess函数。
Q:如何理解fork()函数的返回值有2个取值?
fork()函数是创建一个新进程, 它的返回值分别是:“子进程返回 0”和“父进程返回子进程的进程号 (PID)”,即可以通过fork()函数的返回值识别父子进程,让其通过if else分流,干不同的事情
fork( )函数在子进程中返回值为0,用于标记该进程为子进程; 在父进程中返回值为子进程的id,便于链接父进程和子进程,实现父进程对子进程的寻找、控制; 当出错时返回值为-1,便于处理错误创建进程。
Q:画圆和画方两个过程是完全同步的吗
“用线程实现并发画圆和画方” ,画圆和画方两个过程是完全同步的吗(即它们是一起开始一起结束的吗)?如果不是,为什么不是?如果不是,应当如何做才能完全同步呢?
不是,因为CPU是严格按照程序的顺序执行的。
“同时”是宏观上的同时。即根据程序的并发执行特点:编写一个画圆的函数和一个画方的函数,然后再用CreateThread函数创建两个线程,分别画圆和画方,就可以实现并发的画圆和画方了。
第一,直接在控制台对应的坐标打印*来画圆和画方,但这样画出来太丑。因此,我们采取第二种方法,导入graphcis.h头文件,创建画板,再调用里面的putpixel函数,给对应坐标的像素点赋色。这样画出来的圆和方就是一个标准的圆和方了。
Q:临界区的设置大些好还是小些好?各有什么缺点?
如果临界区过大,可能导致等待程序饿死或者中断调度执行其他事件
如果临界区过小,可能导致临界资源不在临界区内,程序并发执行产生混乱应该把临界资源恰当地控制在临界区内 保护起来
Q:Lock(S)与unLock(S)
把课件中4.4.2节中提到的Lock(S),unLock(S)源代码直接拷贝到应用程序的源代码中,并定义S是全局变量,并设置合适的初值。请问Lock(S),unLock(S)两个函数能否用于控制多线程之间的临界区访问?注意:不考虑语法错误。
1.lock与unlock 多线程中如果对共享数据同时读取,则没有问题。如果有的线程对共享数据进行读,有的数据进行写,则程序会崩溃,就需要阻止这一情况的发生。 互斥量mutex类 中有lock和unlock 这两个可以保证数据安全。 互斥量中枷锁 解锁是成对使用的,本次如果只有lock没有unlock时,下次运行到lock时会停在此处,等运行了unlock才可以继续下去。所以一定要成对使用。 互斥量的枷锁是需要一定时间的。
2.lock_guard 是一个类模板,需要包含了lock与unlock 在使用时,给其定义在局部作用域内,离开此作用域时,就释放了,此时会调用unlock函数,这样会避免方法一中 unlock忘记调用的尴尬。lock_guard 只是方便了上锁,解锁这个过程,并不管理互斥对象的生命周期。
3.在同一个进程的多线程同步锁,宜用临界区锁,它比较节约线程上下文切换带来的系统开销。但因临界区工作在用户模式下,所以不能对不同进程中的多线程进行同步。 因互斥对象锁属于内核对象,所以在进行多线程同步时速度会比较慢,但是可以在不同进程的多个线程之间进行同步。
Q:举出生活中类似“司机和售票员”的同步例子,并分析其中的关键操作。
去医院先挂号然后才可以找到医生看病,取到要化验的项目,然后去化验室验血,得到化验结果后再去找医生,医生根据化验结果开药
读者和作家
1.多个读者,只能read,不能write
2.多个作家,既能read,也能write
3.允许多个reader同时读
4.不允许reader和writer同时操作
5.不允许多个作家同时操作
本质:保证一个writer进程必须与其他进程互斥地访问共享对象
Q:V操作定义中的q队列里面的进程都是阻塞进程。请问这些进程是从何而来的?或者说这些进程是怎么变成阻塞状态进入q队列的?
大于或等于0时代表可供并发进程使用的资源实体数;小于0时代表正在等待使用临界区的进程数;用于互斥的信号量初始值应大于0;只能通过P、V原语操作而改变;信号灯是一个具有整数值的对象,它支持两种操作P()和V()。P()操作减少信号灯的值,如果新的信号灯的值小于0,则操作阻塞;V()操作增加信号灯的值,如果结果值大于或等于0,则唤醒一个等待的进程。通常用信号灯来做进程的同步和互斥。
V操作顺序执行下述两个动作:
①S值加1,即S=S+1;
②如果S>0,则该进程继续运行;
如果S≤0,则释放信号量队列上的第一个PCB(即信号量指量指针项所指向的PCB)所对应的进程(把阻塞态改为就绪态),执行V操作的进程继续运行
Q:在4.5.3节“例子:3个进程Pa,Pb,Pc 。临界资源数量为1,CSa,b,c是临界区”中,三个进程并发过程中,是不是一定会发生阻塞或唤醒操作?如果mutex初值设置为0或2会有什么结果?在实际应用中,应该怎么合理的设置互斥量的初值?
以Pa,Pb,Pc为程序顺序运行:
是的,mutex=1时,Pa=0不堵塞,Pb=-1堵塞后被唤醒,Pc=-2堵塞后被唤醒,即三个进程并发过程中,一定会发生阻塞或唤醒操作;
当mutex=0时,三个程序都会堵塞;
当mutex=2时,Pa=1不堵塞,Pb=0不堵塞,Pc=-1堵塞后被唤醒。
互斥量的初值:由于只允许一个进程进入,因此信号量中整型值的初始应设为1.该值表示可以允许多少个进程进入,当该值<0时,其绝对值就是等待使用临界资源的进程数,也就是等待队列中的进程数.
Q:应该怎么合理的设置信号量的初值?
在4.5.4节“实现进程同步的例子:司机vs售票员”中,如果把两个信号量S1,S2的初值都设置为1,司机和售票员还能否正确同步?如果不能,请给出反例证明。在实际应用中,应该怎么合理的设置信号量的初值?
不能,因为都设置为1的话,直接司机从起步行驶停车一个进程就结束了,体现不了同步。在实际应用中,我们应该根据限制条件以及导致结果使设置的初值可以相互影响限制,体现出两个进程的同步。
Q:“读者和编者问题”:“读者优先”,“编者优先”
“编者和读者”同步问题在严格意义上讲是一个同步问题还是一个互斥问题?如果把题目的同步要求做一个加强:如果有读者和编者同时在等一个编者“写完”,则当前的“写”操作完后,等待的编者能优先进入。新的情形应当如何完成P-V同步操作?【建议网上查阅“读者和编者问题”,“读者优先”,“编者优先”】
同步问题,
互斥问题。
编者优先:
1.编者线程的优先级高于读者线程。
2.当有编者到来时应该阻塞读者线程的队列。
3.当有一个编者正在写时或在阻塞队列时应当阻塞读者进程的读操作,直到所有编者进程完成写操作时放开读者进程。
4.当没有写者进程时读者进程应该能够同时读取文件。
Q:“生产者-消费者”问题的同步的实现
在实际编程中,举出1个类似“生产者-消费者”问题的同步例子,并简单描述你准备采用什么样的同步机制实现同步?要求给出具体的函数名字。(限Windows或Linux任一平台)
多线程同步例子:当厨师线程开始执行put方法或者服务员开始get方法时,都必须先获取MediContainer对象的锁,如果该锁被其他线程占用,另一个线程就只能在锁池中等待。这种锁机制使得厨师线程执行put方法的整个过程中,服务员线程不会执行get方法,同样,在服务员线程在执行get方法的整个过程中,厨师线程不执行put方法。
假设在一个宾馆服务中,每人一次只能购用一间房(buy),每个保洁工一次只能清理一间房(clean),在一个人购买时,另一个人需要等待其购买完毕(wait),同样,在清理房间时,也需要等待用户退房。定义信号量x,y表示需要打扫房间的总数和打扫完成的总数,定义z用来实现购买房间时和打扫房间时的互斥。因此,在清理工打扫时实现clean方法前,需要使用P(x)限制房间数量进入缓冲区和P(z)实现打扫房间时的互斥,clean方法实现后,通过V(z)和V(y)用于释放互斥量和唤醒用户购买房间。在用户购买房间时,通过P(y)限制购买房间和P(z)实现购买房间时的互斥,buy方法实现后,通过V(z)和V(x)用于释放互斥量和唤醒清洁工打扫房间。
公共电话厅里有多个电话,如某人要打电话,首先要进行申请,看是否有电话空闲,若有,则可以使用电话,如果电话亭里所有电话都有人正在使用,那后来的人只有排队等候。当某人用完电话后,则有空电话腾出,正在排队的第一个人就可以使用电话。
empty——表示缓冲区是否为空,初值为1。
full——表示缓冲区中是否为满,初值为0。
生产者进程:
某人要打电话,首先要进行申请,相当于执行一次P(empty)操作,申请一个可用资源(电话),执行一次V(full)操作
消费者进程:
某人用完电话,则有空电话腾出,相当于执行一次P(full)操作,释放一个可用资源(电话),执行一次V(empty)操作
Q:进程的exit( )函数返回参数由父进程处理或接收。那么,在控制台上直接启动的一个应用程序,其末尾的exit( )函数返回参数由谁处理或接收?
由所有进程的祖先进程 0号进程回收
Q:匿名管道为什么不能在两端同时使用read或write完成读写操作,而要一端是使用重定向?
匿名管道创建函数pipe()系统调用底层的实现就相当于一个特殊的文件系统,每次调用的时候创建一个inode关联着两个file,一个用于读,一个用于写,从而实现数据的单向流动.
一个管道实际上就是一个无形(只存在于内存中)的文件,对这个文件的操作要通过两个已经打开的文件进行,分别代表该管道的两端 .
每个文件都是有一个inode数据结构代表的。虽然一个管道实际上是一个无形的文件,但是也得有一个inode数据结构。由于这个文件在创建管道之前并不存在,所以需要在创建管道时临时创建一个inode结构。
Q:Linux信号机制与中断机制有什么异同?
相同:
(1)采用了相同的异步通信方式;
(2 )当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;
(3 )都在处理完毕后返回到原来的断点;
(4 )对信号或中断都可进行屏蔽。
不同:
(1 )中断有优先级,而信号没有优先级,所有的信号都是平等的;
(2 )信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;
(3 )中断响应是及时的,而信号响应通常都有较大的时间延迟。
Q:“死机”或“宕机”或“系统卡住,键鼠没有任何响应”
在Linux或Windows的实际应用中,用户常说的“死机”或“宕机”或“程序卡住”或“系统卡住,键鼠没有任何响应”与本章的“死锁”是同一问题吗?
死锁与死机等不是同一问题,死锁是系统还在运行,只不过发生了循环等待,导致无法正常执行功能。死机是系统崩溃无法运行了死锁与死机等不是同一问题,死锁是系统还在运行,只不过发生了循环等待,导致无法正常执行功能。死机是系统崩溃无法运行了
不是。 从原因看: 造成死机的原因大致有三种可能,一是应用程序被病毒感染,再就是应用程序本身存在bug,还有就是应用程序与操作系统之间存在一些冲突。 而造成死锁的原因是由于竞争资源而引起的。 从结果来看: 死机造成的后果十分严重,影响所有进程,而死锁只是部分进程受到影响,并不影响其他进程的运行。
Q:如何证明“参与死锁的进程至少有2个已经占有资源”?
两个进程都阻塞并且等待着别的进程释放他所持有的资源。
Q:在Linux或Windows是如何处理死锁的?
鸵鸟策略,对死锁视而不见,留给用户自行处理
Q:进程调度的7个目标中,你觉得windows或Linux重点在于满足哪些目标?为什么这么认为?
Windows重点在于用户:响应速度要快、对所有进程要公平;
Linux重点在于服务器:响应速度要快、系统吞吐量大、避免饥饿。
Q:考虑静态优先数
考虑静态优先数的时候,下列因素“基于进程所需的资源多少”,“基于程序运行时间的长短”,“基于进程的类型[IO/CPU,前台/后台,核心/用户]”是如何影响静态优先数确定的?譬如:进程所需的资源多(或少),就分配较小(或较多)的静态优先数?!你的理由何在?
考虑静态优先数的时候,下列因素基于进程所需的资源多少,基于程序运行时间的长短,基于进程的类型[IO/CPU,前台/后台,核心/用户]譬如:进程所需的资源多(或少) 所需资源量越多(少),静态优先数越小(大)。 程序运行时间越长(短),静态优先数越小(大) 。
进程所需资源越少,静态优先数越大。使进程处理时间尽可能短。
进程运行时间越短,静态优先数越大。使系统吞吐量尽可能大,资源利用率尽可能高。
I/O类进程静态优先数更大,用户一般比较重视I/O进程
前台类进程静态优先数更大
核心类进程静态优先数更大,因为内核的权限比用户权限高
Q:考虑动态优先数
考虑动态优先数的时候,下列因素“当使用CPU超过一定时长时”,“当进行I/O操作后”,“当进程等待超过一定时长时”是如何影响动态优先数确定的?譬如:当使用CPU超过一定时长时,就减少(或增加)的动态优先数?!你的理由何在?
IO发起后,降低优先数,极有可能要阻塞态了,高优先是不合理的;I/O完成后、进程阻塞转就绪,提高优先数,资源到了就进行利用,避免死锁
当使用CPU超过一定时长后,减少动态优先数,不阻塞其他进程太长时间 当进行I/O操作后,增加动态优先数,提高进程优先级执行其他可能的I/O操作 当进程等待时间超过一定时长后,增加动态优先数,避免该进程一直饥饿
Q: Linux创建子进程时,其COUNTER值为什么只继承父进程的一半,原因何在?
为了资源的公平利用
防止有恶意的用户进程不断创建子进程长期占用CPU的时间
Q:何为地址映射功能?为何需要地址映射功能或者它的的作用是什么?在VS(C/C++)开发环境中,我们用”int i,j ;” 定义的i,j变量与地址是什么关系?
地址映射 :把程序中的地址(虚拟地址/虚地址/逻辑地址)变换成内存的真实地址(实地址/物理地址)的过程。
作用 :操作系统只能够访问到真实地址(实地址/物理地址),然后进行一系列的操作。而在编写程序的时候的变量是一个虚地址,所以需要通过地址映射转换为物理地址操作系统才能够进行访问。
变量与地址 :程序里面的地址是一个虚地址,变量经过编译以后转化为一个虚拟地址,这个地址要通过地址映射转化为内存里面的真实地址才能够被操作系统访问,进而进程相关的操作。
Q:使用虚拟存储管理功能的操作系统,还需不需要真是的内存?
需要真实的内存
Q:分区存储管理用在专用的,具有特定工作任务的,嵌入式系统中,可不可行?
不好
Q:三种放置策略中,最佳适应法是不是比最坏适应法或首次适应算法性能要优异?为什么?
不是。
一、首次适应算法(First Fit):该算法从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。
二、最佳适应算法(Best Fit):该算法总是把既能满足要求,又是最小的空闲分区分配给作业。为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足要求的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。
三、最坏适应算法(Worst Fit):最坏适应算法是将输入的作业放置到主存中与它所需大小差距最大的空闲区中。空闲区大小由大到小排序。
Q:内存覆盖技术有哪些缺点?
编程复杂:程序员划分程序模块并确定覆盖关系
程序执行时间长:从外存转入内存耗时
Q:内存交换技术在实现过程,为何要考虑地址重定位的问题?
进程进入内存时,原本的位置可能已经被占用,会产生冲突,当被装入非原始位置时就需要考虑重定位的问题进程进入内存时,原本的位置可能已经被占用,会产生冲突,当被装入非原始位置时就需要考虑重定位的问题
Q:内存在分配过程中产生碎片的本质是什么?有哪些方法可以消除或减轻碎片问题?
本质: 过小的空闲区满足不了程序所需内存,而一直得不到利用,形成了内存碎片。 解决办法: 规定门限值,分配空闲区时,如果剩余部分小于门限值, 则将此空闲区整体分配给此程序。 内存拼接技术,将内存碎片(所有的空闲区)进行拼接成为一个大的空闲区。 让程序能够在不同内存分区进行运行,即把程序分开装入不同的空闲区,充分利用空闲区,避免造成碎片。
Q:在虚拟内存管理方案的支持下,Windows或Linux还会不会因为内存过小导致应用程序无法运行或崩溃呢?
不会,因为使用了虚拟内存技术,使得操作系统能最大程度上以较小的内存运行较大的程序。
Q:页表在页式内存管理中起到什么重要的作用?
程序访问的是虚拟地址,但实际访问内存却需要使用物理地址,页表的作用就是通过线性地址来找到实际的物理地址。
Q:在有快表的存储管理系统中,一条访存指令要访问到真正的数据,需要访问内存几次?
若快表命中,则可直接得到页帧号,与页内偏移拼接成物理地址后访问内存,进行指令或者数据的存取。(只需访问一次内存)
若快表不命中,则需去内存中访问页表,形成物理地址后,再一次访问内存进行指令或者数据的存取。(需要访问两次内存)
Q:页式虚拟内存管理是否适合实时操作系统采用
实时操作系统要求,每条指令或过程的完成时间是确定的或有上限的。依据此要求,你认为页式虚拟内存管理是否适合实时操作系统采用?
不适合,由于页式虚拟内存的每条指令的时间不确定,可能发生缺页中断,可能导致花费的时间超过实时操作系统的时间上限
Q:最佳算法(OPT算法, Optimal)
页面淘汰算法中的最佳算法(OPT算法, Optimal)为何在实际中无法实现?既然无法实现,它的存在意义何在?
因为在程序没有执行之前 是无法得知进程之后需要访问哪个页面. 也就不知道之后会不会再访问或者很长时间再访问的页面. 所以无法实现.。 存在意义的话, 个人理解是为了指导其他算法的目标命中率,即设计其他算法时, 使用最佳算法的命中率做参考, 使新设计算法的结果逐步向最佳命中率靠拢
Q:页面淘汰和缺页中断两个概念对我们平时编写高效率程序有什么启示?
在请求页式存储管理中,当根据虚拟地址查页表而发现所要访问的页不在内存时,就会产生缺页中断。系统响应中断后,就由操作系统到辅存把所需要的页读入内存。内存可能有空闲的块,也可能没有。只有当内存中没有空闲块时,才会出现将内存现有页面淘汰出去的问题,即要进行页面淘汰。所以,缺页中断和页面淘汰之间的关系是:页面淘汰一定是由缺页中断所引起;但缺页中断则不一定引起页面淘汰。
Q:段式或段页式内存管理方案中的“段”概念和汇编语言中的“段Segment”含义相同吗?
不相同. 汇编语言中的段指的是程序段, 是用寄存器寻址使用的. 段式中的段指的是内存段, 是指物理内存与操作系统转换时所涉及到的概念
Q:把DS,CS等段寄存器理解为段基址
若在保护模式下,把DS,CS等段寄存器理解为段基址的话,会推导出一些不合实际的谬论出来。
Q:区分目标段的段描述符是在GDT表中还是LDT表中
在逻辑地址转换到线性地址的过程中,访存指令如何去区分目标段的段描述符是在GDT表中还是LDT表中?
选择子中TI=0表示在GDT表中,TI=1表示在LDT表中
Q:为何Linux在形式上要采用三级页表结构
Linux本质上采用的是二级页表结构。为何它在形式上要采用三级页表结构?
linux的页表结构是为了节省地址转换所需要的空间。分为PGD/PUD/PMD/PTE,P代表page,G代表global,D代表目录(Director),U代表上级,M代表中间,T代表Table,E代表Entry。PTE是页表项。他们之间的关系是层级结构,通过PGD访问到最低端的PTE,访问方式是上一层地址+偏移量(offset)。PTE+页内偏移量可以访问到具体的物理地址。
Q:Linux中段机制的作用什么?
Linux中的软中断和工作队列是中断上下部机制中的下半部实现机制。
1.软中断一般是可延迟函数的总称,它不能睡眠,不能阻塞,它处于中断上下文,不能进城切换,软中断不能被自己打断,只能被硬件中断打断(上半部),可以并发的运行在多个CPU上。所以软中断必须设计成可重入的函数,因此也需要自旋锁来保护其数据结构。
2.工作队列中的函数处在进程上下文中,它可以睡眠,也能被阻塞,能够在不同的进程间切换,以完成不同的工作
Q:操作系统公司(例如微软)会不会去专门花精力编写外设的控制程序/驱动程序呢?设备驱动管理或设备驱动程序是不是操作系统必须的组成部分?
不会,操作系统公司制定接口标准,驱动程序有各自设备厂家按接口标准实现。 不属于,只是各位附加功能
1按“信息组织特征”对设备分类,可以分为 。
字符设备
块设备
网络设备
2下面说法错误的是 。
设备管理模块具有将逻辑设备映射到物理设备的功能。
A.设备管理模块具有将逻辑设备映射到物理设备的功能。
B.逻辑设备是一类物理设备的抽象。
C.逻辑设备是物理设备的实例。
D.物理设备具有用户容易理解的友好名(Friendly Name)。
C、D
3关于设备独立性的说法正确的是 。
Q:用户使用统一规范的方式使用设备。
B.用户编程时使用设备逻辑名。
C.更换同类物理设备时不影响用户的使用。
D.操作系统统一把设备当做文件来处理。
A、B、C、D
4关于设备驱动程序说法正确的是 。
A.设备驱动程序实质是对物理设备进行I/O操作。
B.设备驱动程序为用户提供操作设备的接口。
C.设备驱动程序工作在核态。
D.操作系统仅规定驱动接口规范,而不限定其内部实现细节。
A、B、C、D
Q:Spooling技术在微机上(以WIN7 64为例)有哪些应用
Spooling技术在微机上(以WIN7 64为例)有哪些应用?查看任务管理器,其中有个spoolsv.exe程序,从字面曹操它的的作用,然后试着从网上了解它的作用?
脱机输入输出系统的模拟,主要是为了缓和CPU的高速性与I/O设备低速性的矛盾等
1关于设备分配方法说法正确的是 。
A.独占型设备任意时间段内最多只能被一个进程占用。
B.虚拟设备技术是指在一类物理设备上模拟另一类物理设备的技术。
C.独占型设备主要是字符串设备。
D.共享型设备主要是块设备。
A、B、C、D
2下面关于SPOOLin技术说法正确的是 。
A.SPOOLing系统是虚拟技术和虚拟分配的一种实现。
B.输出时进程将结果暂放于输出缓冲区,待外设空闲时再实际输出。
C.输入/输出监控进程相当于脱机系统中的卫星机。
D.Spooling技术将独占设备改造为“共享”设备。
A、B、C、D
Q:什么是LINUX模块机制,如果没有模块机制,内核在更新,功能扩充,裁剪等方面会是什么样的一种情形?
首先,一个内核模块,就是一个ELF文件。内核本身也是一个ELF文件。一个模块,可能是一个协议,一个文件系统,一个驱动,一种具体的应用,等等任何东西。也可能是多种东西的组合。内核在运行时,通过动态加载/卸载内核模块,可以动态扩展/删减内核的功能。每个模块在编译时(假设模块名为xxx),会自动生成一个xxx.mod.c的文件,该文件会链接到xxx模块中去。
Q:谈谈你如何理解“设备是文件”这一重要概念的
通过Linux驱动程序的结构,开发过程,谈谈你如何理解“设备是文件”这一重要概念的?
设备文件实际上是DOS管理设备的一种方法:为设备起一个固定的文件名,可以象使用文件一样方便地管理这些设备。 设备与其对应的设备文件名见表 设备文件名对应设备 Q:UX 第一个串口,也叫做COM1 COMn 串口或通信口,DOS3.3以上版本n值可为1-4 CON 键盘或屏幕 LPTn 并口,因打印机多接在并口上,往往用于表示打印机 NUL 虚拟的空设备 PRN 打印机,同LPT1 PRT 某些MS-DOS版本中的打印机称谓 在DOS命令中最常用的是CON、NUL、PRN三个设备文件
Q:1驱动程序工作在 (选填“用户”或“内核”)态。
正确答案:内核
2以字节为单位逐个进行I/O操作的设备类型是 (选填“字符”或“块”)设备。
正确答案:字符
3之所以把设备当成文件看待,是因为用户采用 (选填“自定义的接口”或“文件接口”)来操作设备。
正确答案:文件接口
4标识设备种类或标识驱动程序的是 (选填“主”或“次”)设备号。
正确答案:主
重做
Q:谈谈你如何理解“设备是文件”这一重要概念的
通过Windows驱动程序的结构,开发过程,谈谈你如何理解“设备是文件”这一重要概念的?
设备文件实际上是DOS管理设备的一种方法:为设备起一个固定的文件名,可以象使用文件一样方便地管理这些设备。 设备与其对应的设备文件名见表 设备文件名对应设备 Q:UX 第一个串口,也叫做COM1 COMn 串口或通信口,DOS3.3以上版本n值可为1-4 CON 键盘或屏幕 LPTn 并口,因打印机多接在并口上,往往用于表示打印机 NUL 虚拟的空设备 PRN 打印机,同LPT1 PRT 某些MS-DOS版本中的打印机称谓 在DOS命令中最常用的是CON、NUL、PRN三个设备文件。
Q:谈谈你如何理解“设备是文件”这一重要概念的
通过Windows驱动程序的结构,开发过程,谈谈你如何理解“设备是文件”这一重要概念的?
设备文件实际上是DOS管理设备的一种方法:为设备起一个固定的文件名,可以象使用文件一样方便地管理这些设备。 设备与其对应的设备文件名见表 设备文件名对应设备 Q:UX 第一个串口,也叫做COM1 COMn 串口或通信口,DOS3.3以上版本n值可为1-4 CON 键盘或屏幕 LPTn 并口,因打印机多接在并口上,往往用于表示打印机 NUL 虚拟的空设备 PRN 打印机,同LPT1 PRT 某些MS-DOS版本中的打印机称谓 在DOS命令中最常用的是CON、NUL、PRN三个设备文件。
1文件的 (选填“逻辑”或“物理”)结构强调文件信息项的构成方式和用户的存取方式。
正确答案:逻辑
2文件的 (选填“逻辑”或“物理”)结构强调合理利用储存空间,缩短I/O存取时间。
正确答案:物理
3Windows 7(64位)中的“学生成绩表.txt”文件属于 (选填“记录式”或“流式”)文件。
正确答案:流式
4文件的存取方法有两种:顺序存取和 存取。
正确答案:随机
Q:计算机中还有哪些重要的信息存取方式
文件是计算机信息存取的一种重要组织形式。计算机中还有哪些重要的信息存取方式(包括存储设备,存取方式等方面)?
数据有数值型和非数值型两类,这些数据在计算机中都必须以二进制形式表示(也就是我们常说的0和1)。一串二进制数既可表示数量值,也可表示一个字符、汉字或其他。一串二进制数代表的数据不同,含义也不同。
1串联文件属于文件的 (选填“逻辑”或“物理”)结构。
正确答案:物理
2索引文件的文件内容存放在 (选填“连续”或“不连续”)的存储块中。
正确答案:不连续
3FQ:T文件系统中文件属于 (选填“索引”或“串联”或“连续”)文件。
正确答案:串联
Q:比较索引文件和串联文件的异同?他们的优点何在?
索引文件:在文件中随机存取记录,需要指导记录的地址。整个索引文件都载入到内存中(文件很小,只占用很小的内存空间)。搜索项目,用高效的算法(如折半查询法)查找目标键。检索记录的地址。按照地址,检索数据记录并返回给用户。
Q:文件还原工具的工作原理是什么
如果磁盘上的文件(假定是FQ:T16或FQ:T32)被彻底删除(回收站没有了),如果需要还原文件的话,往往需要用到“文件还原工具”。请问这些工具的工作原理是什么?
删除文件并不是在硬盘上把数据抹掉,而是直接在分区表中在这个文件的前面添加一个标记,就表示已经删除了(不然删除将是个漫长的过程),以后有新文件写入的时候,系统就会把有删除标记的文件覆盖掉 如果没有被新文件覆盖的话,那原始文件是好好的在那里的,恢复工具只要取消掉这个标记就可以恢复文件
Q:拷贝时文件的内容,文件的属性,文件所在目录的读写或存储情况
用U盘从一台电脑上拷贝一个文件到另外一台电脑上时,考虑文件的内容,文件的属性,文件所在目录的读写或存储情况?
拷贝的时候会读取文件的目录项,将目录项写到目标目录文件,然后再将文件内容写到目标目录。 文件内容复制,文件属性更新,文件目录更改,读写权限不变,存储情况更新
3.1 BIOS中断是INT XXh的形式,例如INT 13H是磁盘读写服务。那么INT 21H与这些BIOS中断的机制是不是一样的呢?
机制一样,但实现方法有区别。二者都是中断,过程表现为识别中断源、保护断点和现场、装入中断服务程序的入口地址、进入中断服务程序、结束中断程序后恢复现场和断点、中断返回。但BIOS中断由硬件电路实现,INT 21H由软件程序指令实现。
3.2 操作系统的初始引导过程涉及哪些程序模块,各自存放的介质是什么,存放的形式是什么?
操作系统初始引导是指通过引导程序把操作系统核心装入内存并使之接管计算机系统的过程。首先BIOS读取MRB引导程序到内存运行,MRB的引导程序根据BIOS提供的参数读取硬盘指定位置的文件到内存,该文件加载指定操作系统的内核并初始化基本参数,操作系统内核逐步加载剩余操作系统程序,最后完全控制计算机。
3.3 比较DOS、Windows7与Linux早期版本都有哪些典型的操作界面?操作界面对普通用户(办公或娱乐)选择操作系统有何影响?
主要有GUI界面(win7)和命令行(DOS、Linux)两种。GUI界面更易被初学者或普通用户接受,操作简单并且可以浏览使用各种图形数据,命令行界面的操作需要学会使用指令,入门成本高,且难以处理复杂图像应用。
3.4 Linux的Shell能否看成操作系统的内核功能?如何理解Shell与内核之间的交互?
不能。Shell可以看作是用户和操作系统信息交互的中间桥梁。用户用过Shell将命令下达给操作系统,操作系统通过Shell将需要展示给用户的信息返回,Shell本身不执行命令,仅仅是组织和管理命令。
3.5 printf,open都是Linux中典型的隐式系统调用。当我们在“为Linux内核增加新的系统调用实验”中增加一个新的系统调用后,我们在应用程序中是如何调用的它们的?为何我们不能像printf,open等函数一样简单地调用?
不能。printf和open是高级语言的Q:PI接口,Linux中隐式系统调用也会在编译时转化为显式的系统调用,最终用到INT80h。我们在自己制作的操作系统中加入的自定义系统调用,并没有现成的高级语言Q:PI接口供我们使用,可以通过汇编语言调用INT80端口使用或封装成高级语言Q:PI接口直接调用。
单元作业
1 系统BIOS的功能有哪些?
BIOS全程Basic I/O System,是一种固件(Firmware),是以硬件形式储存的软件,储存主板启动配置信息、基本设备I/O服务,完成系统的加电自检、初始化基本硬件。
2 计算机加电后执行的第一条指令存放在哪里,有什么特点?
BIOS的指令位置位于F0000-FFFFF处,按下开机或重启键后执行的第一条指令位于FFFFQ处,执行JUMP POST(加电自检)动作,POST位于BIOS内部,该指令由硬件电路实现,功能是初始化基本硬件,若自检错误通过喇叭或数显二极管的方式提示。
3 何为操作系统的生成?简述Linux内核的生成过程。
操作系统的生成是指满足特定硬件环境和用户需要,组装和构建操作系统的过程。
Linux操作系统的生成过程如下:
1、获取Linux内核的源代码
2、选择和启动内核配置程序
3、根据需要配置内核模块的参数
4、程序编译新的内核
5、编译和安装模块
6、启动新内核
4 何为用户界面?有哪些类别?各有什么特点?
用户界面是指操作系统提供给用户控制计算机的机制,又称用户接口。分为操作界面和系统调用。
操作界面通过GUI或控制台接受普通命令、批处理程序或Shell指令,一般不涉及核心资源或硬件操作。
系统调用需要操作系统内核为应用程序提供服务或函数,CPU运行于核态,调用过程会产生自愿中断。
5 何为shell?有哪4类典型的shell?
Shell可以看作是用户和操作系统信息交互的中间桥梁。用户用过Shell将命令下达给操作系统,操作系统通过Shell将需要展示给用户的信息返回,Shell本身不执行命令,仅仅是组织和管理命令。
Shell有Bsh、Csh、Ksh、Bash四种,前三种是早期版本,各有优缺点,Bsh有较强编程功能,Csh交互方便,Ksh结合Bsh和Csh优势,Bash是Bsh的升级并且吸收了Ksh的特性。
6 何为输出重定向?举一个Linux或Windows中的重定向的应用命令或例子。
输出重定向是指将命令输出由默认的显示器更改为指定的文件。
在Linux命令行中输入ls /etc/ > etcdir.log
,可以将原本会在命令行中显示的etc目录信息储存在当前目录下的etcdir.log文件中。
7 试述运行shell脚本程序的三种方式?
第一种是直接运行,用缺省版本的Shell运行程序;
第二种是使用特定版本,在运行程序时输入Shell版本+程序名可以使用特定版本,如bash my_script 。
第三种是在脚本文件首行指定。在脚本开头加一行:#!/bin/bush 。
8 系统调用与普通用户态函数比较,有何异同点?
系统调用一般设计核心资源或硬件的操作,CPU运行于核态,每个系统调用具有唯一ID,调用过程会产生自愿中断,实现过程较复杂。相同点是都属于用户接口,实现用户对计算机的控制。
9 何为隐式系统调用?
隐式调用是指通过高级语言的Q:PI接口在编译时转化为显式的系统调用,最终用到特定的中断执行系统调用指令。使用隐式系统调用可以快捷方便的使用计算的机某些内核资源。
10 试述Linux系统调用(INT 80H)的工作原理?
应用程序调用库函数(Q:PI);
Q:PI将系统调用号存入EQ:X,然后通过中断调用使系统进入内核态;
内核中的中断处理函数根据系统调用号,调用对应的内核函数(系统调用);
系统调用完成相应功能,将返回值存入EQ:X,返回到中断处理函数;
中断处理函数返回到Q:PI中;
Q:PI将EQ:X返回给应用程序。
11 试述为Linux增加新的系统调用的过程?
1、在sys.c中加入函数
2、添加声明
3、添加ID
4、重新配置安装内核
12 回顾汇编语言中关于寄存器结构和定义部分的知识,理解各个寄存器的基本作用和用法。
寄存器是中央处理器内的组成部份。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(Q:CC)。
寄存器的作用:可将寄存器内的数据执行算术及逻辑运算;存于寄存器内的地址可用来指向内存的某个位置,即寻址;可以用来读写数据到电脑的周边设备。
数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
寄存器 ESI、EDI称为变址寄存器(Index
Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
寄存器EBP、ESP、BP和SP称为指针寄存器(Pointer Register),主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
段寄存器是根据内存分段的管理模式而设置的。内存单元的物理地址由段寄存器的值和一个偏移量组合而成的,这样可用两个较少位数的值组合成一个可访问较大物理空间的内存地址。
指令指针EIP、IP(InstructionPointer)是存放下次将要执行的指令在代码段的偏移量。
标志寄存器用于实现特定功能。
13 尝试去理解用
menucofig命令去配置Linux内核时,配置界面上每个条目的含义和作用?
Code maturity level options:代码成熟等级
Loadable module support:对模块的支持
General setup:常规内核选项
Memory Technology Devices (MTD):配置存储设备
Parallel port support:配置并口
Plug and Play configuration:即插即用支持
Block devices:块设备支持
Multiple devices driver support:多设备驱动支持
Networking options:网络选项
Telephony Support:电话支持
Q:TQ:/IDE/MFM/RLL support:配置对Q:TQ:,IDE,MFM和RLL的支持
SCSI support:SCSI设备的支持
I2O Device Support:I20设备支持
Network Device Support:网络设备支持
Q:mateur Radio support:配置业余广播支持
IrDQ:(infrared)support:配置红外线(无线)通讯支持
ISDN subsystem:配置ISDN
Old CD-ROM drivers(not SCSI、not IDE):配置老CDROM
Input Core Support:提供USB支持
Character devices:字符设备
Multimedia Devices:配置多媒体设备
File System:配置文件系统
Console drivers:配置控制台驱动
USB support:配置USB支持
kernel hacking:配置“kernel hacking”
https://blog.csdn.net/xuyuefei1988/article/details/8635539
14 在Linux上练习使用管道命令。
curl
-s https://api.github.com/repos/iissnan/hexo-theme-next/releases/latest | grep
tarball_url | cut -d '"' -f 4 | wget -i - -O- | tar -zx -C themes/next
--strip-components=1
这条指令是一个管道指令,首先打开指定网络文件,获取tarball_url对应的值,去掉首末端双引号得到一个网址,下载对应文件并解压到指定目录,去掉第一层目录。
华中科大MOOC 操作系统原理讨论题的更多相关文章
- Linux操作系统原理
Linux操作系统原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机经历的四个时代 1.第一代: 真空管计算机,输入和输出:穿孔卡片,对计算机操作起来非常不便,做一件事 ...
- 操作系统原理2——OS结构
操作系统原理2——OS结构 计算机系统是由硬件系统和软件系统两部分组成, 操作系统是软件系统的一个组成部分,它是直接在硬件系统的基础上工作的,所以在研究操作系统之前,先必须对计算机系统的结构有一个 ...
- pxe网络安装操作系统 原理与详细过程
摘要:在实际工作中,我们经常会遇到这样的情况:想要安装Linux但是计算机不带光驱或软驱,或者是笔记本配置的非标准的软驱和光驱,如1394接口,USB接口等,在Linux安装时所引导的Linux内核一 ...
- (Mark)操作系统原理
Q:什么是中断?A:中断嘛,举个容易理解的例子吧. 比如莲莲和唐唐在下象棋,眼看莲莲就快招架不住了,正当此紧要关头,唐唐的女友来了,非要唐唐陪她上街买衣服不可(唐唐晕倒:-) ),于是唐唐不得不同 ...
- (华中科大)江南雨烟 C++ STL 专栏
本文转载来自,华中科技大学江南雨烟的C/C++专栏部分STL剖析文章,以作学习之用. [1] [C++ STL学习之一]容器的共通能力和共通操作总结 [2] [C++ STL学习之二]容器vect ...
- day 30 1.操作系统原理 2. Process 模块学习
进程: 起源:进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作 ...
- 操作系统原理之I/O设备管理(第六章上半部分下)
五.I/O软件原理 输入输出软件的总体目标是将软件组织成一种层次结构 低层软件用来屏蔽硬件的具体细节 高层软件则主要是为用户提供一个简洁.规范的界面 设备管理的4个层次: 用户层软件 ->向系统 ...
- 基于操作系统原理的Linux 的基本操作和常用命令的使用
一.实验目的 1.学会不同Linux用户登录的方法. 2.掌握常用Linux命令的使用方法. 3.了解Linux命令中参数选项的用法和作用. 二.实验内容 1. 文件操作命令 (1) 查看文件与目录 ...
- 基于操作系统原理的Red Hat Linux的基本操作
一.实验目的 1.了解Linux操作系统的启动与登录方法. 2.掌握Red Hat Linux图形用户界面下的基本操作. 3.学会Red Hat Linux基本设置. 二.实验内容 1. 登录 2. ...
随机推荐
- .NET gRPC 核心功能初体验,附Demo源码
gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心). 由Google开源,目前是一个Cloud Native Computing Foundation(CNCF)孵 ...
- eureka server 配置
启动类 import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure. ...
- 剑指 Offer 32 - III. 从上到下打印二叉树 III + 双端队列使用 + 蛇形打印层次遍历序列 + 正倒序输出
剑指 Offer 32 - III. 从上到下打印二叉树 III Offer_32_3 题目详情 题解分析 本题我想的比较复杂,其实题目的要求只是需要遍历的结果逆序和正序交替,这个其实可以使用Coll ...
- POJ-1015(背包变形+输出路径)
Jury Compromise POJ-1015 推荐几个较好的介绍和理解:https://blog.csdn.net/lyy289065406/article/details/6671105 htt ...
- POJ-2195(最小费用最大流+MCMF算法)
Going Home POJ-2195 这题使用的是最小费用流的模板. 建模的时候我的方法出现错误,导致出现WA,根据网上的建图方法没错. 这里的建图方法是每次到相邻点的最大容量为INF,而花费为1, ...
- Python 第三方登录 实现QQ 微信 微博 登录
本人写的AgentLogin,能快速返回QQ.微信.微博第三方用户名信息,主要用于快速登录 用 pip命令安装 pip install AgentLogin 用法 : 导入这个包 from Agent ...
- Python爬虫学习二------爬虫基本原理
爬虫是什么?爬虫其实就是获取网页的内容经过解析来获得有用数据并将数据存储到数据库中的程序. 基本步骤: 1.获取网页的内容,通过构造请求给服务器端,让服务器端认为是真正的浏览器在请求,于是返回响应.p ...
- redis安装以及使用
一.安装 1.源码安装 1.下载redis源码 $ wget http://download.redis.io/releases/redis-4.0.10.tar.gz 2.解压缩 $ tar -zx ...
- 翻译:《实用的Python编程》05_00_Overview
目录 | 上一节 (4 类和对象) | 下一节 (6 生成器) 5. Python 对象的内部工作原理 本节介绍 Python 对象的内部工作原理.来自其它语言的程序员通常会发现 Python 的类概 ...
- POJ_1273 Drainage Ditches 【网络流】
一.题面 Drainage Ditches 二.分析 网络流的裸题. 1 Edmonds-Karp算法 求解网络流其实就是一个不断找增广路,然后每次找到一条增广路后更新残余网络的一个过程. EK算法主 ...