【32】C++岗位求职面试八股文第三十二篇(操作系统)

系列文章目录

第一篇:语言基础

第二篇:设计模式

第三篇:数据库

第四篇:计算机网络

第五篇:操作系统

第六篇:LInux

第七篇:数据结构

第八篇:智力题

[41]内存交换中,被换出的进程保存在哪里?

保存在磁盘中,也就是外存中。具有对换功能的操作系统中,通常把磁盘空间分为文件区和对换区两部分。文件区主要用于存放文件,主要追求存储空间的利用率,因此对文件区空间的管理采用离散分配方式;对换区空间只占磁盘空间的小部分,被换出的进程数据就存放在对换区。由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理主要追求换入换出速度,因此通常对换区采用连续分配方式(学过文件管理章节后即可理解)。总之,对换区的I/O速度比文件区的更快

[42]在发生内存交换时,有些进程是被优先考虑的

可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间… (注意: PCB 会常驻内存,不会被换出外存)

[43]现在计算机系统通用的字符编码工作方式

ASCII、Unicode和UTF-8(1) 在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码1·

[44]系统并发和并行

并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。

并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。

操作系统通过引入进程和线程,使得程序能够并发运行

[45]页面置换算法

[46]为什么分段式存储管理有外部碎片而无内部碎片?为什么固定分区分配有内部碎片而不会有外部碎片

分段式分配是按需分配,而固定式分配是固定分配的方式。

[47]内部碎片与外部碎片

内碎片:分配给某些进程的内存区域中有些部分没用上,常见于固定分配方式

内存总量相同,100M

固定分配,将100M分割成10块,每块10M,一个程序需要45M,那么需要分配5块,第五块只用了5M,剩下的5M就是内部碎片;

分段式分配,按需分配,一个程序需要45M,就给分片45MB,剩下的55M供其它程序使用,不存在内部碎片。

外碎片:内存中某些空闲区因为比较小,而难以利用上,一般出现在内存动态分配方式中

分段式分配:内存总量相同,100M,比如,内存分配依次5M,15M,50M,25M,程序运行一段时间之后,5M,15M的程序运行完毕,释放内存,其他程序还在运行,再次分配一个10M的内存供其它程序使用,只能从头开始分片,这样,就会存在10M+5M的外部碎片

[48]如何消除碎片文件

对于外部碎片,通过紧凑技术消除,就是操作系统不时地对进程进行移动和整理。

解决外部内存碎片的问题就是内存交换。

可以把音乐程序占用的那 256MB 内存写到硬盘上,然后再从硬盘上读回来到内存里。不过再读回的时候,我们不能装载回原来的位置,而是紧紧跟着那已经被占用了的 512MB 内存后面。这样就能空缺出连续的 256MB 空间,于是新的 200MB 程序就可以装载进来。回收内存时要尽可能地将相邻的空闲空间合并

[49]冯诺依曼结构有哪几个模块?分别对应现代计算机的哪几个部分?

• 存储器:内存• 控制器:南桥北桥• 运算器:CPU• 输入设备:键盘• 输出设备:显示器、网卡

[50]多进程和多线程的区别是什么?换句话说,什么时候该用多线程,什么时候该用多进程?

• 频繁修改:需要频繁创建和销毁的优先使用多线程• 计算量:需要大量计算的优先使用多线程 因为需要消耗大量CPU资源且切换频繁,所以多线程好一点• 相关性:任务间相关性比较强的用多线程,相关性比较弱的用多进程。因为线程之间的数据共享和同步比较简单。• 多分布:可能要扩展到多机分布的用多进程,多核分布的用多线程。但是实际中更常见的是进程加线程的结合方式,并不是非此即彼的

[51]虚拟技术你了解吗?

虚拟技术把一个物理实体转换为多个逻辑实体。主要有两种虚拟技术:时(时间)分复用技术和空(空间)分复用技术。 * 多进程与多线程:多个进程能在同一个处理器上并发执行使用了时分复用技术*,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。

虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中

[52]服务器高并发的解决方案你知道多少?

应用数据与静态资源分离 将静态资源(图片,视频,js,css等)单独保存到专门的静态资源服务器中,在客户端访问的时候从静态资源服务器中返回静态资源,从主服务器中返回应用数据。

客户端缓存 因为效率最高,消耗资源最小的就是纯静态的html页面,所以可以把网站上的页面尽可能用静态的来实现,在页面过期或者有数据更新之后再将页面重新缓存。或者先生成静态页面,然后用ajax异步请求获取动态数据。

集群和分布式 (集群是所有的服务器都有相同的功能,请求哪台都可以,主要起分流作用)(分布式是将不同的业务放到不同的服务器中,处理一个请求可能需要使用到多台服务器,起到加快请求处理的速度。)可以使用服务器集群和分布式架构,使得原本属于一个服务器的计算压力分散到多个服务器上。同时加快请求处理的速度。

反向代理 在访问服务器的时候,服务器通过别的服务器获取资源或结果返回给客户端

[53]地址变换中,有快表和没快表,有什么区别?

[54]一个程序从开始运行到结束的完整过程,你能说出来多少?

四个过程:(1)预编译 主要处理源代码文件中的以“#”开头的预编译指令。处理规则见下1、删除所有的#define,展开所有的宏定义。2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他 文件。4、删除所有的注释,“//”和“/**/”。5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重 复引用。6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是 能够显示行号。

(2)编译 把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件。1、词法分析:利用类似于“有限状态机”的算法,将源代码程序输入到扫描机中,将其中的字符序列分割成一系列的记号。2、语法分析:语法分析器对由扫描器产生的记号,进行语法分析,产生语法树。由语法分析器输出的语法树是一种以表达式为节点的树。3、语义分析:语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。4、优化:源代码级别的一个优化过程。5、目标代码生成:由代码生成器将中间代码转换成目标机器代码,生成一系列的代码序列——汇编语言表示。6、目标代码优化:目标代码优化器对上述的目标机器代码进行优化:寻找合适的寻址方式、使用位移来替代乘法运算、删除多余的指令等。

(3)汇编将汇编代码转变成机器可以执行的指令(机器码文件)。 汇编器的汇编过程相对于编译器来说更简单,没有复杂的语法,也没有语义,更不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来,汇编过程有汇编器as完成。经汇编之后,产生目标文件(与可执行文件格式几乎一样)xxx.o(Linux下)、xxx.obj(Windows下)。

(4)链接将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。链接分为静态链接和动态链接:1、静态链接: 函数和数据被编译进一个二进制文件。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件。 空间浪费:因为每个可执行程序中对所有需要的目标文件都要有一份副本,所以如果多个程序对同一个目标文件都有依赖,会出现同一个目标文件都在内存存在多个副本; 更新困难:每当库函数的代码修改了,这个时候就需要重新进行编译链接形成可执行程序。运行速度快:但是静态链接的优点就是,在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。2、动态链接: 动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形成一个完整的程序,而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。共享库:就是即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多份副本,而是这多个程序在执行时共享同一份副本;更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。性能损耗:因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失

[55]简述GDB常见的调试命令,什么是条件断点,多进程下如何调试

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

[56]说说什么是大端小端,如何判断大端小端?

小端模式:低的有效字节存储在低的存储器地址。小端一般为主机字节序;常用的X86结构是小端模式。很多的ARM,DSP都为小端模式。

大端模式:高的有效字节存储在低的存储器地址。大端为网络字节序;KEIL C51则为大端模式定义联合体,一个成员是多字节,一个是单字节,给多字节的成员赋一个最低一个字节不为0,其他字节为0 的值,再用第二个成员来判断,如果第二个字节不为0,就是小端,若为0,就是大端。

[57]在进行网络通信时是否需要进行字节序转换?

相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换

[58]进程调度算法有哪些?

先来先服务调度算法短作业(进程)优先调度算法高优先级优先调度算法时间片轮转法多级反馈队列调度算法

1先来先服务调度算法:每次调度都是从后备作业(进程)队列中选择一个或多个最先进入该队列的作业(进程),将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

2短作业(进程)优先调度算法:短作业优先(SJF)的调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业(进程),将它们调入内存运行。

3高优先级优先调度算法:当把该算法用于作业调度时,系统将从后备队列中选择若干个优先权最高的作业装入内存。当用于进程调度时,该算法是把处理机分配给就绪队列中优先权最高的进程

4时间片轮转法:每次调度时,把CPU 分配给队首进程,并令其执行一个时间片。时间片的大小从几ms 到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

5多级反馈队列调度算法:综合前面多种调度算法。

在这些调度算法中,有抢占式和非抢占式的区别。区别:非抢占式(Nonpreemptive):让进程运行直到结束或阻塞的调度方式,容易实现,适合专用系统,不适合通用系统。抢占式(Preemptive):允许将逻辑上可继续运行的在运行过程暂停的调度方式可防止单一进程长时间独占,CPU系统开销大(降低途径:硬件实现进程切换,或扩充主存以贮存大部分程序)

[59]简述操作系统如何申请以及管理内存的?

1存储器有四个层次,分别是寄存器、高速缓存、主存、磁盘。寄存器:速度最快、量少、价格贵。高速缓存:次之。主存:再次之。磁盘:速度最慢、量多、价格便宜。

2虚拟内存:操作系统为每一个进程分配一个独立的地址空间,但是虚拟内存与物理内存存在映射关系,通过页表寻址完成虚拟地址和物理地址的转换。

[60]简述Linux系统态与用户态,什么时候会进入系统态?

1内核态与用户态:内核态(系统态)与用户态是操作系统的两种运行级别。内核态拥有最高权限,可以访问所有系统指令;用户态则只能访问一部分指令。

2什么时候进入内核态:共有三种方式:a、系统调用。b、异常。c、设备中断。其中,系统调用是主动的,另外两种是被动的。

3为什么区分内核态与用户态:在CPU的所有指令中,有一些指令是非常危险的,如果错用,将导致整个系统崩溃。比如:清内存、设置时钟等。所以区分内核态与用户态主要是出于安全的考虑。

[续]C++岗位求职面试八股文第三十三篇(操作系统)

更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317

企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm

机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0

软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM

更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH

欢迎关注、收藏、点赞后进行问题咨询及秋招建议

#如何判断面试是否凉了##我的求职思考##牛客在线求职答疑中心##牛客解忧铺##晒一晒我的offer#
软件开发八股面经 文章被收录于专栏

包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等

全部评论
cy
点赞 回复 分享
发布于 2023-08-19 02:58 辽宁

相关推荐

1. 描述C++程序到可执行程序的四个过程。2. 说明面向对象的特性。3. 区分静态多态和动态多态。4. 解释动态多态和静态多态的原理,并比较它们的效率。5. 什么是智能指针?6. `shared_ptr` 是否线程安全?7. 解释深拷贝和浅拷贝的区别。8. 比较 `i++`、`++i` 和 `++(i++)` 的行为。9. 解释右值引用、移动语义以及其底层原理。10. `vector` A 存储在哪里?`A.push_back(1)` 中的 `1` 存储在哪里?11. `vector` 的 `clear` 和 `push_back` 的时间复杂度及其原因。12. STL 容器是否线程安全?为什么?13. 线程和进程的区别。14. 计算线程创建的最大数量的公式。15. 什么是协程?协程是否有创建数量的限制?16. 什么是死锁?17. 每个线程需要 100 把锁,如何避免死锁?18. 解释 `thread_local` 的用法和作用。19. 什么是野指针?如何避免野指针?20. 解释 `new`、`delete` 和 `malloc`、`free` 的区别和常识。21. 虚函数、虚函数表和虚指针的概念是什么?22. 面向对象的基本特征。23. 解释死锁的四个必要条件。24. 区分内联函数和宏定义。25. 动态链接和静态链接的区别。26. 编译过程的各个阶段是什么?27. 如何找到两个无环链表的公共节点?28. 如何在无序的浮点数数组中找到中位数?29. 快速排序的原理及其优化方式。30. 列出三种智能指针及其特点。31. 解释左右值的概念。32. 描述三种特殊构造函数。33. `i++` 和 `++i` 是左值还是右值?34. 什么是完美转发?35. 右值能否取到地址?问题答案已经整理到专栏中了,关注我分享更多知识。  c++/嵌入式面经专栏-牛客网 https://www.nowcoder.com/creation/manager/columnDetail/MJNwoM
查看35道真题和解析
点赞 评论 收藏
分享
3 24 评论
分享
牛客网
牛客企业服务