zoukankan      html  css  js  c++  java
  • 操作系统杂谈

    https://wenku.baidu.com/view/eaecff750912a216147929d6.html

    1.进程、线程、程序的区分以及为什么要引入线程:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html

    • 摘要:进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。一个车间里,可以有很多工人。他们协同完成一个任务,线程就好比车间里的工人。一个进程可以包括多个线程。车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
    • 总结:
      • 1.程序:一段完成特定功能的静态代码。
      • 2.进程:程序的一次动态执行。
      • 3.线程:CPU的基本调度单位,一个进程可以创建多个线程,线程可以共享进程的内存空间。
      • 为什么引入线程:由于进程是资源的拥有者,所以在创建、撤销、切换操作中需要较大的时空开销,限制了并发程度的进一步提高。为减少进程切换的开销,把进程作为资源分配单位和调度单位这两个属性分开处理,即进程还是作为资源分配的基本单位,把调度执行与切换的责任交给“线程”。这样做的好处不但可以提高系统的并发性,充分发挥多处理机的性能。

     

    2.什么是作业调度什么是进程调度?试列举至少两种作业调度算法和三种进程调度算法

    •  作业调度:作业调度的主要功能是根据作业控制块中的信息,以及按照一定的算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程插入就绪队列,准备执行。
    • 进程调度:
      • 长程调度,又称作业调度,用于决定把外存上处于后备队列中的哪些作业调入内存,并为它们创建进程、分配必要的资源,然后,再将新创建的进程排在就绪队列上,准备执行、
      • 短程调度,又称进程调度,用来决定就绪队列中的哪个进程应获得处理机,然后再由分派程序把处理机分配给该进程的具体操作
      • 中程调度,从就绪挂起到就绪,从阻塞挂起到阻塞,引入中程调度的主要目的,是为了提高内存利用率和系统吞吐量
    • 分别有哪些算法:

      (1)先来先服务调度算法(FCFS)(作业、进程调度):算法简单,但效率较低;有利于长作业,但对短作业不利,有利于CPU繁忙型作业,不利于I/O繁忙型作业。
      (2)短作业优先调度算法(SJF)(作业、进程调度):运行时间短的进程(作业)优先执行,该算法对长作业不利,易造成“饥饿”问题,即长进程(作业)由于优先级低可能长期得不到处理。
      (3)时间片轮转调度算法(进程调度):
      时间片的大小对系统性能影响很大,如果时间片足够大,以至于所有的进程都能在一个时间片内执行完毕,则退化为FCFS算法,如果时间片很小,那么处理机在进程间频繁切换,处理机真正用于运行用户进程的时间将减少。
      时间片的长短由:系统的响应时间、就绪队列中的进程个数和系统的处理能力决定。
      (4)优先级调度算法(作业、进程调度):根据进程优先级决定运行的进程
      (5)高响应比优先调度算法(作业调度):响应比 = 1 + 作业等待时间/估计运行时间重点内容
      (6)多级队列调度算法(进程调度):对多个就绪队列设计不同的调度算法
      (7)多级反馈队列调度算法:(UNIX调度用这个)

    3.产生死锁的必要条件?如何避免死锁。

    虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件。

    1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
    2)请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。
    3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
    4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。

    避免:有序资源分配法,破坏了环路等待条件;银行家算法

    4.为什么引入设备独立性?如何实现设备独立性?

    应用程序独立于具体使用的物理设备,应用程序以逻辑设备名请求使用某类设备。带来了两方面好处:1.设备分配时的灵活性2.易于实现IO重定向。

    引入逻辑设备和和物理设备概念,完成逻辑设备名到物理设备名的转换,从而实现设备的独立性

     

    1

    分区方式:

    连续分配管理方式

      1. 单一连续分配:系统区+用户区,且用户区只放一个进程
      2. 固定分区:又分为分区大小相等和分区大小不等
      3. 动态分区:需要是不是进行“紧凑”,就是合并空闲的外碎片,有4中策略:1.首次适应2.最佳适应3.最坏适应4.临近适应(从上次结束的地方继续查找)

    非连续分配管理方式:

          1.页式2.段式3.段页式

     

     2

    静态装入(绝对装入)是在编译阶段就算好物理地址

    可重定位装入(静态重定位)是在装入阶段算好物理地址

    动态运行时装入(动态重定位)是在执行阶段才算物理地址

     

    3

    分段为什么不会产生内碎片?

    首先明确一点,内部碎片是什么?
    内部碎片就是为每个进程分布的内存空间之中所没有被使用到的内存碎片。通常出现在分页式存储管理之中。分页式是什么应该很好理解,就是把内存按照分为一页页大小相同的页面,然后再把这些页面分配给进程。因此,在分配给进程时可能会出现这样的情况:进程需要3MB,分给他4页,每页1MB,这样4>3,就会造成1MB的内部碎片。
    而分段式存储管理为什么不会产生内部碎片?归根结底是由分段本身的定义出发的。如果说分页式是系统对内存的分割,那么分段式就是用户对程序数据的分割。分页式是没有任何逻辑意义的,而分段式是有其意义在的。比如说一个程序有主程序段Main类,有通用库,有数据段,这样我们就把这个程序分为三段,分别对应Main,库,数据(说的是最浅显的,详细的可以百度其他),是有逻辑意义的独立单位。都这样分了,怎么还会出现内部碎片?反之,如果是分页式,就可能出现Main类横跨两页,且整个程序装入内存后还有碎片空间的可能了。
    总之,引入分段式存储管理本就在一定程度上解决了内部碎片,并且满足了用户的需求。但是分段式存储管理也有不足之处,内存利用率变低了。因此又引入之后的段页式存储管理方式,这个自己百度就行。
    参看计算机操作系统第四版,欢迎指正

     

    4页表的始地址存放在_____中:页表的功能由一组专门的存储器实现,其始址放在页表基址寄存器。

  • 相关阅读:
    HDU
    HDU
    A. Reorder the Array
    A. New Building for SIS Codeforce
    HUD Is It A Tree?!!!!!)
    博客园申请博客批准
    一起学CC3200之CRC校验
    新安装CCS 编译问题Process_begin :createProcess
    一起学CC3200之开发环境简介(2)烧录程序
    新安装CCS 后编译出现问题:gmake:No rule to make target clean
  • 原文地址:https://www.cnblogs.com/liwenchi/p/9280869.html
Copyright © 2011-2022 走看看