操作系统面试题

1.进程 线程 协程

1.进程是程序的一次执行,是资源分配的基本单位。一个进程可以拥有多个线程。每个进程间往往是独立的。从Java内存区域来讲...
2.线程是CPU调度的基本单位,可以有多个协程。线程间往往会相互影响。线程开销小。线程依赖于进程而存在,一个进程至少有一个线程;进程有自己的独立地址空间,线程共享所属进程的地址空间;
3.协程
在一个子程序中断,之后执行其他函数,但不是函数调用。下面中的输出结果就是执行了函数A后可能随机执行B,又可能随时执行A。每个协程有独立的栈,而栈既保留了变量的值,也保留了函数的调用关系、参数和返回值。
优势:

  1. 没有线程切换的开销
  2. 只有一个线程,因此操作共享资源不需要加锁
def A():
    print '1'
    print '2'
    print '3'

def B():
    print 'x'
    print 'y'
    print 'z'
//可能的输出
1
2
x
y
3
z

2.进程通信方式

1.匿名管道(父子进程或兄弟进程)

特点:

  • 半双工(数据只能由一端流向另外一端,通信需要两个管道)
  • 有亲缘关系的进程
  • 写的一端写到尾部,读的一段从头部读
  • 没有格式的字节流,双方要知道每次读写多少字节
  • 只存在内存中的文件
2.管道
  • 读写类似匿名管道,只是可以扩展到任意进程
  • 以读的方式打开管道前,必须有另外一个进程以写的方式打开管道,否则会阻塞。
  • 存在磁盘上
3.信号
  • 信号可以在任何时候发给某一进程,而无需知道该进程的状态。
  • 如果接受信号的进程未处于Running,则由内核保存起来,等进程恢复执行时再传递给它
  • 信号可以再用户进程和内核交互
  • 来源由ctrl+c kill命令等
4.消息队列
  • 存在于内核中的消息链表
  • 某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。
5.共享内存
  • 进程共享的一块内存区域
6.信号量
7.套接字

3.线程通信方式

  1. volatile
  2. synchronized+wait/notify
  3. yield()
  4. Condition
  5. join
  6. CountDownLatch CyclicBarrier Semaphore

4.虚拟内存

  • 使得可以用户多于物理地址大小的内存空间
  • 使得应用程序认为自己有连续的可用内存

5.从硬盘加载到内存的过程

6.页面置换算法

  1. FIFO
  2. LRU
  3. LFU
  • 淘汰用的最少的
  1. OPT

7.分页分段

5.进程调度算法

抢占式指的是当前有进程正在进行,此时新来一个高优先级的进程,此时就切换到该进程执行。下面的3,4,6支持抢占
1.先来先服务

  • 选择就绪队列中等待时间最长的进程
    2.短作业优先
  • 下一次执行耗时最短的作业
    3.时间片轮转法
    分配一个时间片,就绪队列中每个进程都执行这么长的时间。如果用不了这么长时间就执行完了,就会调度下一个进程。
    4.最短剩余时间优先
  • 每次选剩余执行时间最少的进程执行,如果突然来了一个更小的,则抢占。
    5.最高响应比优先
    相应比 = (已经等待的时间 + 进程执行要花的时间)/ 进程执行要花的时间
    6.多级反馈队列
  • 设置多个就绪队列,并为各个队列赋予不同的优先级。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。
  • 当一个新进程进入内存后,首先放入第一队列的末尾,按照先来先去原则排队等候调度。如果他能在一个时间片中完成,便可撤离;如果未完成,就转入第二队列的末尾,同样等待调度.....如此下去,当一个长作业(进程)从第一队列依次将到第n队列(最后队列)后,便按第n队列时间片轮转运行。
  • 仅当第一队列空闲的时候,调度程序才调度第二队列中的进程运行;仅当第1到(i-1)队列空时,才会调度第i队列中的进程运行,并执行相应的时间片轮转。
  • 如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列,则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。

12.虚拟地址空间

c语言中的地址

6.为什么要有协程

每个协程有独立的栈,而栈既保留了变量的值,也保留了函数的调用关系、参数和返回值在64位linux中,线程的栈有 8MB,而协程栈的大小通常只有几十 KB。

  • 节省CPU。当线程时间片用完或调用了阻塞的函数后会进行线程上下文的切换,造成CPU资源的浪费。协程是用户态的线程,用户可以自行控制协程的创建于销毁,极大程度避免了系统级线程上下文切换造成的资源浪费。
  • 节省内存。在 64 位的 Linux 中,一个线程需要分配 8MB 栈内存和 64MB 堆内存,系统内存的制约导致我们无法开启更多线程实现高并发。而在协程编程模式下,可以轻松有十几万协程,这是线程无法比拟的
  • 开发效率,使用协程在开发程序之中,可以很方便的将一些耗时的 IO 操作异步化,例如写文件、耗时 IO 请求等。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 进程和线程以及它们的区别 进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发; ...
    六艺str阅读 518评论 0 0
  • 写在前面: 找工作告一段落,期间经历了很多事情,也思考了许多问题,最后也收获了一些沉甸甸的东西 —— 成长和一些来...
    java爪哇阅读 951评论 0 2
  • 1 进程和线程 进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独...
    川少叶阅读 3,038评论 0 6
  • 1. 进程与线程的区别 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一...
    Briarbear阅读 592评论 0 4
  • 1、进程和线程以及它们的区别: 进程是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的...
    Lovealfy阅读 224评论 0 0