蒋豆芽的面试题专栏(16/操作系统之虚拟地址与页表)

  1. 简述GDB常见的调试命令,什么是条件断点,多进程下如何调试。⭐⭐⭐⭐

  2. 说说进程调度算法有哪些?⭐⭐⭐⭐⭐

  3. 简述LRU算法及其实现方式。⭐⭐⭐⭐⭐

  4. 什么是页表,为什么要有?⭐⭐⭐⭐⭐

  5. 简述操作系统中的缺页中断。⭐⭐⭐⭐⭐

  6. 简述一下虚拟内存和物理内存,为什么要用虚拟内存,好处是什么?⭐⭐⭐⭐⭐

  7. 虚拟地址到物理地址怎么映射的?⭐⭐⭐⭐⭐

  8. 说说什么是死锁,产生的条件,如何解决?⭐⭐⭐⭐⭐

=========================================================================================================

  • 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。
  • 本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。
  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
  • 针对于非科班同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。
  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。

=========================================================================================================

  1. 简述GDB常见的调试命令,什么是条件断点,多进程下如何调试。⭐⭐⭐⭐

    GDB调试:gdb调试的是可执行文件,在gcc编译时加入 -g ,告诉gcc在编译时加入调试信息,这样gdb才能调试这个被编译的文件 gcc -g tesst.c -o test

    GDB命令格式:

    1. quit:退出gdb,结束调试

    2. list:查看程序源代码

      list 5,10:显示5到10行的代码

      list test.c:5, 10: 显示源文件5到10行的代码,在调试多个文件时使用

      list get_sum: 显示get_sum函数周围的代码

      list test,c get_sum: 显示源文件get_sum函数周围的代码,在调试多个文件时使用

    3. reverse-search:字符串用来从当前行向前查找第一个匹配的字符串

    4. run:程序开始执行

    5. help list/all:查看帮助信息

    6. break:设置断点

      break 7:在第七行设置断点

      break get_sum:以函数名设置断点

      break 行号或者函数名 if 条件:以条件表达式设置断点

    7. watch 条件表达式:条件表达式发生改变时程序就会停下来

    8. next:继续执行下一条语句 ,会把函数当作一条语句执行

    9. step:继续执行下一条语句,会跟踪进入函数,一次一条的执行函数内的代码

    条件断点:break if 条件 以条件表达式设置断点

    多进程下如何调试:用set follow-fork-mode child 调试子进程

    ​ 或者set follow-fork-mode parent 调试父进程

  2. 说说进程调度算法有哪些?⭐⭐⭐⭐⭐

    1. 先来先服务调度算法
    2. 短作业(进程)优先调度算法
    3. 高优先级优先调度算法
    4. 时间片轮转法
    5. 多级反馈队列调度算法
  3. 简述LRU算法及其实现方式。⭐⭐⭐⭐⭐

    1. LRU算法:LRU算法用于缓存淘汰。思路是将缓存中最近最少使用的对象删除掉

    2. 实现方式:利用链表和hashmap

      当需要插入新的数据项的时候,如果新数据项在链表中存在(一般称为命中),则把该节点移到链表头部,如果不存在,则新建一个节点,放到链表头部,若缓存满了,则把链表最后一个节点删除即可。

      在访问数据的时候,如果数据项在链表中存在,则把该节点移到链表头部,否则返回-1。这样一来在链表尾部的节点就是最近最久未访问的数据项。

    3. 代码实现

      我们给出C++的具体实现,代码一看就懂了。

      class LRUCache {  
          list<pair<int, int>> cache;//创建双向链表  
          unordered_map<int, list<pair<int, int>>::iterator> map;//创建哈希表  
          int cap;  
      public:  
          LRUCache(int capacity) {  
              cap = capacity;  
          }  
      
          int get

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

- 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,总结出了高频面试考点(附有答案)共计309道,事半功倍,为大家春秋招助力。 - 本专栏内容分为七章:共计309道高频面试题(附有答案)

全部评论
虚拟内存:(1)引入的原因:物理内存有限下,在逻辑上扩充内存,实现更多进程并发。(2)依赖的原理:局部性原理(时间局部性和空间局部性),可以让程序一部分装入内存,其余留在外存就可以运行。(3)组成:请求调页+页面置换,1. 请求调页:是在基本分页之上的,需要相应的页表机制、缺页中断、地址变换。2. 页面置换:最佳置换、先进先出页面置换、最近最久未使用LRU
1 回复 分享
发布于 2021-05-07 15:58
虚拟地址到物理地址怎么映射的?先清楚几个概念 (1)进程中的块叫页,内存中的块叫页框,页和页框有对应关系(2)页面大小:一般是2的整数幂,如512,1024,大小适中,太大导致页内碎片过多;太小,页表数增多,页表会占用更多内存(3)页表,多个键值对--<页号P,块号F> ,便于在内存中寻找物理块(4)逻辑地址:多个键值对--<页号P(20bit),页偏W(12bit)>,上面分析的是三级页表机制,Linux内核就是三级(5)地址变换:逻辑地址A->物理地址(页面大小L=2^?) 1. 计算页号P=A/L, 页内偏移W=A%L 2. 比较页表长度M<=P?是越界中断 3. 物理地址:W+F(块号)*L
点赞 回复 分享
发布于 2021-05-07 11:43
死锁解决:死锁预防、死锁避免、死锁检测和解除。(1):破坏四个必要条件,互斥条件,不可剥夺条件不可破坏,请求保持条件--资源一次分配完(缺点:资源浪费,出现饥饿现象),循环等待条件--顺序资源分配(资源编号,但是不利于新的设备加入)(2):死锁避免:银行家算法--系统是否存在一个安全序列,存在则分配,不存在回退并不分配(3):死锁检测和解除:由死锁定理检测是否存在死锁,若存在通缩资源强行剥夺、撤销进程、回退进程解除死锁。(4)三种方法越来越严格,代价越来越大
点赞 回复 分享
发布于 2021-05-07 11:13
gdb调试命令:run执行、break断点、c执行到下一个断点、print(p)/display查看变量值、x查看内存值
点赞 回复 分享
发布于 2021-04-27 17:02

相关推荐

点赞 评论 收藏
分享
momo1saxax23:你这简历只能找个电子厂
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务