【29】C++岗位求职面试八股文第二十九篇(操作系统)
系列文章目录
第一篇:语言基础
第二篇:设计模式
第三篇:数据库
第四篇:计算机网络
第五篇:操作系统
第六篇:LInux
第七篇:数据结构
第八篇:智力题
[1]虚拟内存和磁盘。内存关系
[2]内存管理:通过段页管理途径
每页4kb
每个页表项4个字节
总共需要20k
[3] Linux中查看进程运行状态的指令、查看内存使用情况的指令、tar解压文件的参数。
查看进程运行状态的指令:ps命令。“ps -aux | grep PID”,用来查看某PID进程状态查看内存使用情况的指令:free命令。“free -m”,命令查看内存使用情况。查看进程运行状态、查看内存使用情况的指令均可使用top指令。TopTar
X:解压 c:压缩-v:显示所有过程-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名-z:有gzip属性的-j:有bz2属性的
-zcvf -zxvf (带有z属性,c压缩x解压,v显示过程,f后面接文件)
[4]文件权限怎么修改
Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的read/write/execute权限修改权限指令:chmodchmod [-R] 777 文件或目录-R:同次目录下的所有文件都会变更
[5]说说常用的Linux命令
cd命令:用于切换当前目录ls命令:查看当前文件与目录grep命令:该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工。cp命令:复制命令 cp 源文件 目标文件(夹)mv命令:移动文件或文件夹命令rm命令:删除文件或文件夹命令ps命令:查看进程情况kill命令:向进程发送信号 kill -9 pidtar命令:对文件进行打包,调用gzip或bzip对文件进行压缩或解压cat命令:查看文件内容,与less、more功能相似top命令:可以查看操作系统的信息,如进程、CPU占用率、内存信息等pwd命令:命令用于显示工作目录。
[6]说说如何以root权限运行某个程序。
法1:sudo 指令法2:第一步:su 第二步:输入密码 第三步:执行命令
[7]说说软链接和硬链接的区别
1.定义不同软链接又叫符号链接,是一个文件,这个文件包含了另一个文件的路径名的指向。另一个文件可以是任意文件或目录,可以链接不同文件系统的文件。硬链接就是一个文件的一个或多个文件名。把文件名和计算机文件系统使用的节点号链接起来。因此我们可以用多个文件名与同一个文件进行链接,这些文件名可以在同一目录或不同目录。以防止“误删”的功能。2.限制不同硬链接只能对已存在的文件进行创建,不能交叉文件系统进行硬链接的创建;软链接可对不存在的文件或目录创建软链接;可交叉文件系统;3.创建方式不同硬链接不能对目录进行创建,只可对文件创建;软链接可对文件或目录创建;4.影响不同删除一个硬链接文件并不影响其他有相同 inode 号的文件。,以文件副本的形式存在。但不占用实际空间删除软链接并不影响原文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。软:ln -s 原文件 新文件硬:ln 原文件 新文件
[8]静态库和动态库怎么制作及如何使用,区别是什么。
[9]静、动态库可以当做一些目标代码的集合,不能单独执行,是可执行程序的一部分
lib库名.a lib库名.so区别:静态库代码装载的速度快,执行速度略比动态库快。动态库更加节省内存,可执行文件体积比静态库小很多。静态库是在编译时加载,动态库是在运行时加载。生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。Gcc -fpic -c hello.c -o hello.oGcc -shared hello.o -o libhello.so
[10]动态编译与静态编译(区别于静态链接和动态链接)
静态编译: gcc -static test.c -o test.out动态编译:gcc test.c -o test.out(一般默认是动态编译)都发生在编译阶段
• 静态编译,编译器在编译可执行文件时,把需要用到的对应动态链接库中的部分提取出来,连接到可执行文件中去,使可执行文件在运行时不需要依赖于动态链接库;
• 动态编译的可执行文件需要附带一个动态链接库,在执行时,需要调用其对应动态链接库的命令所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点是哪怕是很简单的程序,只用到了链接库的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行
[11]Python和c++区别
C++语言属于编译型语言,程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件。源程序经过预处理、编译、链接后生成可执行文件(二进制文件,可以直接与计算机底层打交道
Python语言是解释型语言,该语言编写的程序不需进行编译,Python解释器先把源代码转换成字节码文件,再由Python虚拟机一条一条地执行字节码指令,和CPU之间多了 解释器这一层;
c++需要经过编译才能运行;Python不需要经过编译。
[12]外中断和异常有什么区别?
外中断是指由 CPU 执行指令以外的事件引起,如 I/O 完成中断,表示设备输入/输出处理已经完成,处理器能够发送下一个输入/输出请求。此外还有时钟中断、控制台中断等。
而异常由 CPU 执行指令的内部事件引起,如非法操作码、地址越界、算术溢出等
[13]Linux下同步机制?(先后执行顺序)
•信号量:可用于进程同步,也可用于线程同步。•互斥锁 + 条件变量:只能用于线程同步
[14]进程同步的四种方法?
- 临界区 对临界资源进行访问的那段代码称为临界区。 为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。
- 同步与互斥 • 同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。 • 互斥:多个进程在同一时刻只有一个进程能进入临界区。
- 信号量 信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。
- 管程(一种程序结构,封装了数据及对数据的操作,)
管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其它进程永远不能使用管程。
[15]线程同步机制:
互斥锁+条件变量 信号量 读写锁
[16]操作系统在对内存进行管理的时候需要做些什么(考过4点)
分配回收 扩充 地址转换 保护• 操作系统负责内存空间的分配与回收。• 操作系统需要提供某种技术从逻辑上对内存空间进行扩充。• 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换。(段页式)• 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰
[17]进程通信方法(Linux和windows下),线程通信方法(Linux和windows下)
两个都有信号量线程通信方式就是线程实现同步的方式。
[18]共享内存最快原因:
物理内存映射到共享它的进程的虚拟地址空间,这些进程间数据传递不再涉及到内核
共享内存少了两次涉及用户态和内核态数据拷贝的时间和资源消耗 ,带来极高的效率
共享内存映射到两个进程的虚拟内存的不同地址空间中。
多个进程共享一段内存,因此需要依靠某种同步机制(如信号量)来达到进程间的同步及互斥。
[19]介绍一下几种典型的锁?
读写锁• 多个读者可以同时进行读• 写者必须互斥(只允许一个写者写,也不能读者写者同时进行)• 写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)
互斥锁一次只能一个线程拥有互斥锁,其他线程只有等待互斥锁是在抢锁失败的情况下主动放弃CPU进入睡眠状态直到锁的状态改变时再唤醒,而操作系统负责线程调度,为了实现锁的状态发生改变时唤醒阻塞的线程或者进程,需要把锁交给操作系统管理,所以互斥锁在加锁操作时涉及上下文的切换。
条件变量+互斥锁 一起使用,可以减少竞争,实现同步条件不满足,阻塞线程,解锁 条件满足,唤醒线程,加锁
互斥锁一个明显的缺点是他只有两种状态:锁定和非锁定。而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,他常和互斥锁一起使用,以免出现竞态条件。当条件不满足时,线程往往解开相应的互斥锁并阻塞线程然后等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正被此条件变量阻塞的线程并枷锁。总的来说互斥锁是线程间互斥的机制,条件变量则是同步机制。
自旋锁如果进线程无法取得锁,进线程不会立刻放弃CPU时间片,而是一直循环尝试获取锁,直到获取为止。如果别的线程长时期占有锁,那么自旋就是在浪费CPU做无用功,但是自旋锁一般应用于加锁时间很短的场景,这个时候效率比较高。
[20]你知道哪几种线程锁(POSIX)?
主讲互斥锁和自旋锁,扩充读写锁
互斥锁(mutex)互斥锁属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程A和B,它们分别运行在core 0和core 1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞,此时会通过上下文切换将线程A置于等待队列中,此时core 0就可以运行其他的任务(如线程C)。
条件变量(cond)(不是锁)
自旋锁(spin)自旋锁属于busy-waiting类型的锁,如果线程A是使用pthread_spin_lock操作去请求锁,如果自旋锁已经被线程B所持有,那么线程A就会一直在core 0上进行忙等待并不停的进行锁请求,检查该自旋锁是否已经被线程B释放,直到得到这个锁为止。因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远高于互斥锁。
[续]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##我的实习求职记录##软件开发薪资爆料##实习,投递多份简历没人回复怎么办##2022届毕业生现状#包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等