面试题^0^
Posted 歌咏^0^
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题^0^相关的知识,希望对你有一定的参考价值。
用socket来进程间通信,本身用分包过程,不需要信号量
缺省:既系统默认状态
第二次open同一个文件,在内核中会维护另一个struct file与之对应
轮询缺点:占用总线,浪费cpu资源
死锁、银行家算法1:
1、死锁概念
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
产生死锁的必要条件:
① 互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进 程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。
② 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程 阻塞,但又对自己已获得的其它资源保持不放。
③ 不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。
④ 环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合P0,P1,P2,···,Pn中的P0正 在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。
2.银行家算法
1)背景
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。
2)银行家算法
银行家算法是避免死锁的一种重要方法。 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
3)缺点
银行家算法在避免死锁角度上非常有效,但是需要在进程运行前就知道其所需资源的最大值,且进程数也通常不是固定的,因此使用有限,但从思想上可以提供了解,可以转换地应用在其他地方银行家算法在避免死锁角度上非常有效,但是需要在进程运行前就知道其所需资源的最大值,且进程数也通常不是固定的,因此使用有限,但从思想上可以提供了解,可以转换地应用在其他地方
TCP协议2:
TCP是如何建立链接的
TCP的连接 ==》 三次握手(肯定是由客户端先行发起链接请求)
TCP的断开 ==》 四次挥手(服务器和客户端都可以先行发起)
TCP如何保证通信的可靠性
1.TCP是面向链接的网络通信
2.数据验证机制
1)应答机制:发送方每发送一次数据后,需要接收一次接收方回复的 应答,根据应答帧判断是否发送成功,成功发送下一帧,失败重传
2)周期性应答:发送发发送多次数据后,再收一次接收方的回复
3)滑动窗口:
select poll 和 epoll 的特点和区别3:
请简述 select poll 和 epoll 的特点和区别
野指针4:
1.野指针与垂悬指针的区别:
野指针:访问一个已销毁或者访问受限的内存区域的指针,野指针不能判断是否为NULL来避免
垂悬指针:指针正常初始化,曾指向一个对象,该对象被销毁了,但是指针未制空,那么就成了悬空指针。
2.野指针产生的原因:
1.指针定义时未被初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会随机指向一个区域,因为任意指针变量(出了static修饰的指针)它的默认值都是随机的
2.指针被释放时没有置空:我们在用malloc()开辟空间的时候,要检查返回值是否为空,如果为空,则开辟失败;如果不为空,则指针指向的是开辟的内存空间的首地址。指针指向的内存空间在用free()和delete释放后,如果程序员没有对其进行置空或者其他赋值操作的话,就会成为一个野指针
3.指针操作超越变量作用域:不要返回指向栈内存的指针或者引用,因为栈内存在函数结束的时候会被释放。
3.野指针的危害:
问题:指针指向的内容已经无效了,而指针没有被置空,解引用一个非空的无效指针是一个未被定义的行为,也就是说不一定导致错误,野指针被定位到是哪里出现问题,在哪里指针就失效了,不好查找错误的原因。
4.规避方法:
1.初始化指针的时候将其置为nullptr,之后对其操作。
2.释放指针的时候将其置为nullptr。
const关键字5:
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
volatile关键词6:
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。例子: 多线程应用中被几个任务共享的变量
static关键词6:
在 C 中主要用于定义全局静态变量、 定义局部静态变量、 定义静态函数。
在 C++中新增了两种作用:定义静态数据成员、 静态函数成员。
注意:因为 static 定义的变量分配在静态区,所以其定义的变量的默认值为 0,普通变量的默认值为随机数,在定义指针变量时要特别注意。
内联函数和宏定义7:
1、相同点:
1)二者的目的是相同的:都是能够节省频繁的函数调用过程中所产生的时间和空间的开销,提高程序执行的效率。
2)二者的实现也是类似的:内联函数和宏定义都是通过将函数调用替换成完整的函数体。
2、不同点:
1)根本的区别:宏定义仅仅只是字符串替换,而内联函数是个函数,具有函数基本性质,因此内联函数可以向普通函数一样调试,而宏定义不能。
2)代码展开发生在程序执行的不同阶段:宏定义的展开是在预处理阶段,而内联函数的展开是在编译阶段,因此许多编译阶段的工作只对内联函数有效,例如类型安全检查和自动类型转换。
3)内联函数作为类的成员函数时,可以访问类的所有成员,包括共有成员、保护成员、私有成员,而this指针也会被隐式地正确使用,而宏定义无法实现这些功能。
原文链接:https://blog.csdn.net/qq_34777600/article/details/79509425
原文链接:https://blog.csdn.net/zrh_CSDN/article/details/
原文链接:https://blog.csdn.net/l477918269/article/details/89949858
以上是关于面试题^0^的主要内容,如果未能解决你的问题,请参考以下文章