首页 > 《C++面试宝典》V1.0 冲刺大厂~持续更新(9)
头像
许嵩不爱吃土豆鸭
编辑于 2021-03-12 15:24
+ 关注

《C++面试宝典》V1.0 冲刺大厂~持续更新(9)

分享面试总结,涉及C++、算法、数据结构、操作系统、计算机网络、Linux、数据库、设计模式等后面持续更新~

内容多为一问一答式,多数来自收集。整理总结,视频、书籍学习所得,如有错误请指出,万分感谢!!!
学习建议:针对八股文,不太了解的可以网上扩展,自己总结,拿来主义最好能消化成自己的。
※代表高频问题(参考)

# 操作系统篇---  √3

41. I/O控制方式?

1) 直接I/O(轮询)
程序查询方式也称为程序轮询方式,该方式采用用户程序直接控制主机与外部设备之间输入/输出操作。CPU必须不停地循环测试I/O设备的状态端口,当发现设备处于准备好(Ready)状态时,CPU就可以与I/O设备进行数据存取操作。这种方式下的CPU与I/O设备是串行工作的,输入/输出一般以字节或字为单位进行。这个方式频繁地测试I/O设备,I/O设备的速度相对来说又很慢,极大地降低了CPU的处理效率,并且仅仅依靠测试设备状态位来进行数据传送,不能及时发现传输中的硬件错误。

2) 中断
当I/O设备结束(完成、特殊或异常)时,就会向CPU发出中断请求信号,CPU收到信号就可以采取相应措施。当某个进程要启动某个设备时,CPU就向相应的设备控制器发出一条设备I/O启动指令,然后CPU又返回做原来的工作。CPU与I/O设备可以并行工作,与程序查询方式相比,大大提高了CPU的利用率。但是在中断方式下,同程序查询方式一样,也是以字节或字为单位进行。但是该方法大大降低了CPU的效率,因为当中断发生的非常频繁的时候,系统需要进行频繁的中断源识别、保护现场、中断处理、恢复现场。这种方法对于以“块”为存取单位的块设备,效率是低下的。

3) DMA
DMA方式也称为直接主存存取方式,其思想是:允许主存储器和I/O设备之间通过“DMA控制器(DMAC)”直接进行批量数据交换,除了在数据传输开始和结束时,整个过程无须CPU的干预。每传输一个“块”数据只需要占用一个主存周期。

4) 通道
通道(Channel)也称为外围设备处理器、输入输出处理机,是相对于CPU而言的。是一个处理器。也能执行指令和由指令的程序,只不过通道执行的指令是与外部设备相关的指令。是一种实现主存与I/O设备进行直接数据交换的控制方式,与DMA控制方式相比,通道所需要的CPU控制更少,一个通道可以控制多个设备,并且能够一次进行多个不连续的数据块的存取交换,从而大大提高了计算机系统效率。


42. 伙伴系统?

1) 伙伴系统是一种经典的内存管理方法。Linux伙伴系统的引入为内核提供了一种用于分配一组连续的页而建立的一种高效的分配策略,并有效的解决了外碎片问题。

2) Linux中的内存管理的“页”大小为4KB。把所有的空闲页分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页块。最大可以申请1024个连续页,对应4MB大小的连续内存。每个页块的第一个页的物理地址是该块大小的整数倍。

3) 当向内核请求分配(2^(i-1),2^i]数目的页块时,按照2^i页块请求处理。如果对应的块链表中没有空闲页块,则在更大的页块链表中找。当分配的页块中有多余的页时,伙伴系统根据多余的页框大小插入到对应的空闲页块链表中。

当释放单页的内存时,内核将其置于CPU高速缓存中,对很可能出现在cache的页,则放到“快表”的列表中。在此过程中,内核先判断CPU高速缓存中的页数是否超过一定“阈值”,如果是,则将一批内存页还给伙伴系统,然后将该页添加到CPU高速缓存中。

当释放多页的块时,内核首先计算出该内存块的伙伴的地址。内核将满足以下条件的三个块称为伙伴:
(1)两个块具有相同的大小,记作b。
(2)它们的物理地址是连续的。
(3)第一块的第一个页的物理地址是2*(2^b)的倍数。如果找到了该内存块的伙伴,确保该伙伴的所有页都是空闲的,以便进行合并。内存继续检查合并后页块的“伙伴”并检查是否可以合并,依次类推。

4) 内核将已分配页分为以下三种不同的类型:
不可移动页:这些页在内存中有固定的位置,不能够移动。
可回收页:这些页不能移动,但可以删除。内核在回收页占据了太多的内存时或者内存短缺时进行页面回收。
可移动页:这些页可以任意移动,用户空间应用程序使用的页都属于该类别。它们是通过页表映射的。当它们移动到新的位置,页表项也会相应的更新。

43. Spooling技术?

1) 假脱机系统;在联机的情况下实现的同时外围操作的技术称为SPOOLing技术,或称为假脱机技术。
2) 组成:
a. 输入井和输出井:输入井和输出井的存储区域是在磁盘上开辟出来的。输入输出井中的数据一般以文件的形式组织管理,这些文件称之为井文件。一个文件仅存放某一个进程的输入或输出数据,所有进程的数据输入或输出文件链接成为一个输入输出队列。
b. 输入缓冲区和输出缓冲区:输入缓冲区和输出缓冲区的存储区域是在内存中开辟出来的。主要用于缓和CPU和磁盘之间速度不匹配的矛盾。输入缓冲区用于暂存有输入设备传送的数据,之后再传送到输入井;输出缓冲区同理。
c. 输入进程和输出进程:输入进程也称为预输入进程,用于模拟脱机输入时的外围控制机,将用户要求的数据从输入设备传送到输入缓冲区,再存放到输入井。当CPU需要的时候,直接从输入井将数据读入内存。反之,输出的同理。
d. 井管理程序:用于控制作业与磁盘井之间信息的交换。

3) 特点:
提高了I/O的速度:,对数据执行的I/O操作,已从对低速I/O设备执行的I/O操作演变为对磁盘缓冲区中数据的存取,如同脱机输入输出一样,提高了I/O速度,缓和了CPU和低速的I/Os设备之间速度的不匹配的矛盾。
将独占设备改造成了共享设备:因为在假脱机打印机系统中,实际上并没有为任何进程分配设备,而只是在磁盘缓冲区中为进程分配了一个空闲盘块和建立了一张I/O请求表。
实现了虚拟设备功能:宏观上,对于每一个进程而言,它们认为是自己独占了一个设备,即使实际上是多个进程在同时使用一***占设备。也可以说,假脱机系统,实现了将独占设备变换为若干台对应的逻辑设备的功能。


44. 通道技术?

1) 通道是独立于CPU,专门用来负责数据输入/输出传输工作的处理机,对外部设备实现统一管理,代替CPU对输入/输出操作进行控制,从而使输入,输出操作可与CPU并行操作。
2) 引入通道的目的:
为了使CPU从I/O事务中解脱出来,同时为了提高CPU与设备,设备与设备之间的并行工作能力。

45. 共享内存的实现?

1) 两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。
2) 共享内存是通过把同一块内存分别映射到不同的进程空间中实现进程间通信。而共享内存本身不带任何互斥与同步机制,但当多个进程同时对同一内存进行读写操作时会破坏该内存的内容,所以,在实际中,同步与互斥机制需要用户来完成。
3) (1)共享内存就是允许两个不想关的进程访问同一个内存;
(2)共享内存是两个正在运行的进程之间共享和传递数据的最有效的方式;
(3)不同进程之间共享的内存通常安排为同一段物理内存;
(4)共享内存不提供任何互斥和同步机制,一般用信号量对临界资源进行保护;
(5)接口简单。

OS问题一般问的较深,需深入理解!
OS部分还未整理,后期会持续整理+更新!



# Linux篇---  √1

1. inode节点?

1) Linux操作系统引进了一个非常重要的概念inode,中文名为索引结点,引进索引接点是为了在物理内存上找到文件块,所以inode中包含文件的相关基本信息,比如文件位置、文件创建者、创建日期、文件大小等待,输入stat指令可以查看某个文件的inode信息;

2) 硬盘格式化的时候,操作系统自动将硬盘分成两个区域,一个是数据区,一个是inode区,存放inode所包含的信息,查看每个硬盘分区的inode总数和已经使用的数量,可以用df命令;

3) 在linux系统中,系统内部并不是采用文件名查找文件,而是使用inode编号来识别文件。查找文件分为三个过程:系统找到这个文件名对应的inode号码,通过inode号码获得inode信息,根据inode信息找到文件数据所在的block读取数据;

4) 除了文件名之外的所有文件信息,都存储在inode之中。

2. Linux软连接、硬链接?

1) 软链接可以看作是Windows中的快捷方式,可以让你快速链接到目标档案或目录。硬链接则透过文件系统的inode来产生新档名,而不是产生新档案。

2) 软链接(符号链接)ln –s  source  target
硬链接 (实体链接)ln    source  target

3) 硬链接(hard link):A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指向同一个文件,A和B对文件系统来说是完全平等的。如果删除了其中一个,对另外一个没有影响。每增加一个文件名,inode节点上的链接数增加一,每删除一个对应的文件名,inode节点上的链接数减一,直到为0,inode节点和对应的数据块被回收。注:文件和文件名是不同的东西,rm A删除的只是A这个文件名,而A对应的数据块(文件)只有在inode节点链接数减少为0的时候才会被系统回收。

4) 软链接(soft link):A是B的软链接(A和B都是文件名),A的目录项中的inode节点号与B的目录项中的inode节点号不相同,A和B指向的是两个不同的inode,继而指向两块不同的数据块。但是A的数据块中存放的只是B的路径名(可以根据这个找到B的目录项)。A和B之间是“主从”关系,如果B被删除了,A仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。

5) 硬链接
不能对目录创建硬链接;不能对不同的文件系统创建硬链接;不能对不存在的文件创建硬链接;

6) 软连接
可以对目录创建软连接;可以跨文件系统;可以对不存在的文件创建软连接;

7) 因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。

请网上自行扩展!

3. Linux系统应用程序的内存空间是怎么分配的,用户空间多大,内核空间多大?


Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间“。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。


4. Linux的共享内存如何实现?

1) 管道只能在具有亲缘关系的进程间进行通信;通过文件共享,在处理效率上又差一些,而且访问文件描述符不如访问内存地址方便;

2) mmap内存共享映射,mmap本来是存储映射功能,它可以将一个文件映射到内存中,在程序里就可以直接使用内存地址对文件内容进行访问;Linux的mmap实现了一种可以在父子进程之间共享内存地址的方式;

3) XSI共享内存,XSI是X/Open组织对UNIX定义的一套接口标准(X/Open System Interface)。XSI共享内存在Linux底层的实现实际上跟mmap没有什么本质不同,只是在使用方法上有所区别。

4) POSIX共享内存,Linux提供的POSIX共享内存,实际上就是在/dev/shm下创建一个文件,并将其mmap之后映射其内存地址即可。

5. 文件处理grep  awk  sed的三个命令?

1) grep
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。常用来在结果中搜索特定的内容。

2) awk
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件(或其他方式的输入流,如重定向输入)逐行的读入(看作一个记录集),把每一行看作一条记录,以空格(或\t,或用户自己指定的分隔符)为默认分隔符将每行切片(类似字段),切开的部分再进行各种分析处理。

3) sed
sed更侧重对搜索文本的处理,如修改、删除、替换等等。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
常问!

6. 查询进程占用CPU的命令?

1) top
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。
2) ps
ps命令就是最基本进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到。ps是显示瞬间进程的状态,并不动态连续;如果想对进程进行实时监控应该用top命令。
基本上必问题,网上查询扩展,具体命令?


7. 一个程序从开始运行到结束的完整过程?

1) 预处理主要处理源代码中的预处理指令,引入头文件,去除注释,处理所有的条件编译指令,宏替换,添加行号。经过预处理指令后生成一个.i文件;
2) 编译编译过程所进行的是对预处理后的文件进行语法分析、词法分析、符号汇总,然后生成汇编代码。生成.s文件;
3) 汇编将汇编文件转换成二进制文件,二进制文件就可以让机器来读取。生成.o文件;
4) 链接由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。
再来一遍~

8. 一般情况下在Linux/windows平台下栈空间的大小?

windows是编译器决定栈的大小,记录在可执行文件中,默认是1M。linux是操作系统来决定的,在系统环境变量中设置,ulimit -s字节数命令查看修改,但是linux默认栈大小为10M,vs编译器设置:属性—>设置—>链接—>输出—>栈分配—>重新设置。

9. Linux重定向?



10. Linux常用命令

1) ls命令,不仅可以查看linux文件包含的文件,而且可以查看文件权限;
2) cd命令,切换当前目录到dirName
3) pwd命令,查看当前工作目录路径;
4) mkdir命令,创建文件夹;
5) rm命令,删除一个目录中的一个或多个文件或目录;
6) rmdir命令,从一个目录中删除一个或多个子目录项;
7) mv命令,移动文件或修改文件名;
8) cp命令,将源文件复制至目标文件,或将多个源文件复制至目标目录;
9) cat命令,显示文件内容;
10) touch命令,创建一个文件;
11) vim命令;
12) which命令,查看可执行文件的位置,whereis查看文件的位置,find实际搜寻硬盘查询文件名称;
13) chmod命令,用于改变linux系统文件或目录的访问权限,421对应ewr;
14) tar命令,用来压缩和解压文件。tar本身不具有压缩功能,只具有打包功能,有关压缩及解压是调用其它的功能来完成;
15) chown命令,将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;
16) ln命令;
17) grep命令,强大的文本搜索命令,grep全局正则表达式搜素;
18) ps命令,用来查看当前运行的进程状态,一次性查看,如果需要动态连续结果使用top;
19) top命令,显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等;
20) kill命令,发送指定的信号到相应进程。
等等,请网上自行查询扩展!!!非常重要

未完待续~

需资料分享,可私聊哈。




全部评论

(3) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

热门推荐