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

系列文章目录

第一篇:语言基础

第二篇:设计模式

第三篇:数据库

第四篇:计算机网络

第五篇:操作系统

第六篇:LInux

第七篇:数据结构

第八篇:智力题

[101]

[102]Socket组成

int socket(int domain, int type, int protocol);由协议族(family)、Socket类型、指定协议三部分构成。

[103]会话

  1. ⼀个会话可以有⼀个控制终端。这通常是终端设备或伪终端设备;
  2. ⼀个会话中的⼏个进程组可被分为⼀个前台进程组以及⼀个或多个后台进程组;
  3. 如果⼀个会话有⼀个控制终端,则它有⼀个前台进程组,其它进程组为后台进程组;

[104]进程切换为何⽐线程慢(都需要进行上下文切换)

因为每个进程都有⾃⼰的虚拟地址空间,⽽线程是共享所在进程的虚拟地址空间的,所以同⼀ 个进程中的线程进⾏线程切换时不涉及虚拟地址空间的转换把虚拟地址转换为物理地址需要查找⻚表,⻚表查找是⼀个很慢的过程(⾄少访问2次内 存),因此通常使⽤Cache来缓存常⽤的地址映射,这样可以加速⻚表查找,这个cache就是 TLB(快表)。⻚表切换后TLB就失效了,所以很慢;而线程切换不会导致页表切换,TLB也不换,所以快

[105]进程同步的方式?

1.信号量semaphore:是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥与同步。P操作(递减操作)可以用于阻塞一个进程,V操作(增加操作)可以用于解除阻塞一个进程。2.管道:一个进程通过调用管程的一个过程进入管程。在任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程都被阻塞,以等待管程可用。3.消息队列:消息的链接表,放在内核中。消息队列独立于发送与接收进程,进程终止时,消息队列及其内容并不会被删除;消息队列可以实现消息的随机查询,可以按照消息的类型读取。(send receive进程间进程消息传递所需要的最小操作集。一个进程以消息的形式给另一个指定的目标进程发送消息;进程通过执行receive原语接收消息,receive原语中指明发送消息的源进程和消息

[106]线程同步的方式?(4种)

互斥锁、读写锁、信号量、条件变量、临界区、事件信号量ᰁ⼴泛⽤于进程或线程间的同步和互斥;信号用于进程间通信,不用于线程间通信。(线程通信因为共享同一进程·的·内存空间)

[107]互斥锁

⼀次只能⼀个线程拥有互斥锁,其他线程只有等待。属于sleep-waiting类型的锁。互斥锁是在抢锁失败的情况下主动放弃CPU进⼊睡眠状态直到锁的状态改变时再唤醒,⽽操作系统负责线程调度,为了实现锁的状态发⽣改变时唤醒阻塞的线程或者进程,需要把锁交给 操作系统管理,所以互斥锁在加锁操作时涉及上下⽂的切换。

[108]自旋锁

属于busy-waiting类型的锁,如果线程A是使⽤pthread_spin_lock操作去请求锁, 如果⾃旋锁已经被线程B所持有,那么线程A就会⼀直在core 0上进⾏忙等待并不停的进⾏锁请求,检查该⾃旋锁是否已经被线程B释放,直到得到这个锁为⽌。 因为⾃旋锁不会引起调⽤者睡眠,所以⾃旋锁的效率远⾼于互斥锁

[109]线程安全

多线程的程序运行结果是可预期的,而且与单线程的程序运行结果一样,那么说明是“线程安全”的。

[110]用户态和内核态

操作系统分为用户态和核心态。

内核态:它是一种特殊的软件程序,控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。

用户态:就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用

运行在用户态下的程序不能直接访问操作系统内核数据结构和程序,当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态,

[111]从用户态到内核态切换可以通过三种方式

1.系统调用,其实系统调用本身就是中断,但是软件中断,跟硬中断不同。2.异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。3.外设中断:当外设完成用户的请求时,会向CPU发送中断信号。

[112]为什么要区分⽤户态和内核态

1资源隔离2通过系统调⽤接⼝提供硬件资源

[113]在软件测试中UT,IT,ST,UAT分别是什么意思

[114]进程有多少种状态

**进程有五种状态:创建、就绪、运行、阻塞、终止。**一个进程创建后,被放入队列处于就绪状态,等待操作系统调度执行,执行过程中可能切换到阻塞状态(并发),任务完成后,进程销毁终止。创建状态一个应用程序从系统上启动,首先就是进入创建状态,需要获取系统资源创建进程管理块(PCB:Process Control Block)完成资源分配。就绪状态在创建状态完成之后,进程已经准备好,处于就绪状态,但是还未获得处理器资源,无法运行。运行状态获取处理器资源,被系统调度,当具有时间片开始进入运行状态。如果进程的时间片用完了就进入就绪状态。阻塞状态在运行状态期间,如果进行了阻塞的操作,如耗时的I/O操作,此时进程暂时无法操作就进入到了阻塞状态,在这些操作完成后就进入就绪状态。等待再次获取处理器资源,被系统调度,当具有时间片就进入运行状态。终止状态进程结束或者被系统终止,进入终止状态

[115]进程通信中的管道实现原理是什么

操作系统在内核中开辟一块缓冲区(称为管道)用于通信。管道是一种两个进程间进行单向通信的机制。因为这种单向性,管道又称为半双工管道,所以其使用是有一定的局限性的。半双工是指数据只能由一个进程流向另一个进程(一个管道负责读,一个管道负责写);如果是全双工通信,需要建立两个管道。管道分为无名管道和命名管道,无名管道只能用于具有亲缘关系的进程直接的通信(父子进程或者兄弟进程),可以看作一种特殊的文件,管道本质是一种文件;命名管道可以允许无亲缘关系进程间的通信。

1父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。2父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。3父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信。

[116]简述mmap的原理和使用场景

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间(虚拟内存),实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read, write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图:

使用场景:对同一块区域频繁读写操作;可用于实现用户空间和内核空间的高效交互可提供进程间共享内存及相互通信可实现高效的大规模数据传输。

[117]互斥量(互斥锁)能不能在进程中使用

能。不同的进程之间,存在资源竞争或并发使用的问题,所以需要互斥量。进程中也需要互斥量,因为一个进程中可以包含多个线程,线程与线程之间需要通过互斥的手段进行同步,避免导致共享数据修改引起冲突。可以使用互斥锁,属于互斥量的一种。

[118]协程是轻量级线程,轻量级表现在哪里?

(占用内存小、无需内核用户态切换、无需加锁)1协程调用跟切换比线程效率高:协程执行效率极高。协程不需要多线程的锁机制,可以不加锁的访问全局变量,所以上下文的切换非常快。2协程占用内存少:执行协程只需要极少的栈内存(大概是4~5KB),而默认情况下,线程栈的大小为1MB。3切换开销更少:协程直接操作栈基本没有内核切换的开销,所以切换开销比线程少。

[119]常见信号有哪些,表示什么含义?

编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会1 SIGHUP 该信号让进程立即关闭.然后重新读取配置文件之后重启2 SIGINT 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键9 SIGKILL 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程,可以前台,也可以后台15 SIGTERM 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 917 SIGCHLD 子进程结束时, 父进程会收到这个信号。

[120]线程间通信的方式有哪些?(线程同步)

线程间的通信方式包括临界区、互斥量、信号量、条件变量、读写锁:1临界区:每个线程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个线程使用的共享资源)。每次只准许一个线程进入临界区,进入后不允许其他线程进入。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。

2互斥量:采用互斥对象机制,只有拥有互斥对象的线程才可以访问。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。3信号量:计数器,允许多个线程同时访问同一个资源。4条件变量:通过条件变量通知操作的方式来保持多线程同步。5读写锁:读写锁与互斥量类似。但互斥量要么是锁住状态,要么就是不加锁状态。读写锁一次只允许一个线程写,但允许一次多个线程读,这样效率就比互斥锁要高。

[续]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++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等

全部评论
点赞 回复 分享
发布于 2023-08-11 19:03 山东
这不是照抄阿秀吗
点赞 回复 分享
发布于 2023-08-04 16:39 浙江

相关推荐

真的很糟糕:不一定是你的问题,当然你也可以做的更好一些,继续投相信自己一定会有的
点赞 评论 收藏
分享
评论
4
47
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务