操作系统

操作系统的共同目标

进程管理

  • 进程、线程和协程的区别
    1. 从调度上看,线程是CPU资源调度的基本单位,进程是系统资源调度和分配的基本单位
    2. 从开销上看,进程创建、销毁和切换的开销要大于线程。进程创建和销毁需要内核创建/释放页表、打开/关闭文件I/O设备,进程切换需要保存当前的CPU环境、切换页表。这些工作在线程切换时要简单得多,或者甚至不需要进行。
    3. 从通信上看,进程之间通过管道、IPC(信号量、共享内存、消息队列)、socket等方式进行通信,而线程则一般通过共享内存,辅以同步互斥机制确保数据的一致性(互斥锁、信号量、自旋锁、条件变量)
    4. 从隔离性上看,进程之间不会相互影响(不同的虚拟地址空间),而一个线程的崩溃往往会导致整个进程挂掉。
    5. 协程是一种比线程更加轻量级的微线程。一个线程可以有多个协程。协程是由用户调度的,所以它的的调度开销相比线程更小。由于协程是由用户调度的,在某种程度上它的协同执行效率更高,但公平性相应的就低。

内存管理

  • 什么是虚拟内存,虚拟内存的作用?

    • 虚拟内存是操作系统内存管理的一种手段,每个程序拥有自己的虚拟地址空间,虚拟地址空间映射到物理地址空间。
    • 虚拟内存的作用主要有两个,一是提供隔离性,虚拟内存使得应用程序之间、应用程序与内核之间能够隔离开来,无法修改对方的内存数据。二是提供抽象,这种抽象是许多功能的基础,比如扩展内存(物理内存往往非常有限,而虚拟地址空间可以很大,结合页面置换技术能够让计算机运行占用内存比物理内存大的程序)、 保护堆栈(guard page)、延时内存分配(copy on write)
  • Linux 的内存管理机制?
    段页式机制,但是段机制基本只是用于访问控制和内存保护
    段式、页式内存管理以及linux采用的方案图解

  • 内存分配?

    • 操作系统内存分配 几种常见的内存分配算法

      1. linear allocator
        预先创建内存块,然后在内存块上一直分配内存,这些分配出去的内存不用释放,到最后再一次性把内存块回收。
      2. fixed size allocator
        预创建内存块,然后将内存块切割成多个固定大小的小块,并将它们链接起来形成一个freelist;分配的时候从 freelist 取出小块返回;释放的时候将小块重新链接回 freelist;如果 freelist 没有多余内存就再创建一个内存大块。
      3. buddy allocator
        伙伴分配器,比 fixed size allocator 的限制小一些,可以分配不同大小的内存,不过这些大小必须是2的幂;在释放内存的时候,如果这块内存的伙伴内存也处于释放状态,分配器会将两块内存合并起来变成大一倍的内存,并且这个过程会一直重复,直到没有释放的伙伴内存为止。
    • C++ STL 内存分配 -- 两级空间配置

      一级空间配置器 -- malloc + free + new_handler

      二级空间配置器 -- 内存池 + 链表

      为什么采用二级空间配置 -- 避免太多小额区块造成的内存碎片,还有配置时的额外负担(区块越小,额外负担所占的比例就愈大,也就愈显得浪费)

全部评论

相关推荐

02-26 18:25
已编辑
南京大学 算法工程师
点赞 评论 收藏
分享
01-14 12:08
门头沟学院 Java
神哥了不得:(非引流)1.既然发出来了简历,就稍微提一点点小建议,确实简历很不错了,练手项目可以换一些质量高的,工作内容,可以加上一些量化指标,比如第一条系统响应速度由多少变成多少,减少了百分之多少,第4条就很不错。2.广投,年前实习招募比较少了
点赞 评论 收藏
分享
bLanK的小号:建议自己写一个比较新颖的项目,比如思维导图,在线文档,仿造postman,仿造一个组件库
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务