1. 进程间通信的方法有哪些(高频出现)
- 匿名管道
半双工 单向流动 一般多用于父子进程之间通信
步骤:
[1] 父进程创建管道,得到两个⽂件描述符指向管道的两端
[2] 父进程fork出子进程,⼦进程也有两个⽂件描述符指向同⼀管道。
[3] 父进程关闭fd[0],子进程关闭fd[1],即⽗进程关闭管道读端,⼦进程关闭管道写端(因为管道只支持单向通信)。⽗进程可以往管道⾥写,⼦进程可以从管道⾥读,管道是⽤环形队列实现的,数据从写端流⼊从读端流出,这样就实现了进程间通信。
-
有名管道
半双工通信方式 但是允许无血缘关系的进程之间进行通信 -
socket
同一主机内可以通信, 不同主机间也是可以的(网络通信) -
信号
接收事件发生的信号 -
信号量
锁机制,进程同步 -
消息队列
-
共享内存
多个进程访问同一片内存,效率高
2. 进程与线程的区别(高频出现)
[1] 进程是操作系统资源管理的最小单位。进程有单独的地址空间
[2] 线程是进程的一条执行路径,没有自己的地址空间。线程还是有自己的局部变量和堆栈的
[3] 简言之,一个程序至少有一个进程进程,一个进程至少有一个线程。
[4] 线程不能够独立执行
3. 同一个进程的线程有哪些资源是可以共用的,有哪些是独占的(重中之重)
-
共享的
进程的代码段、进程的公有数据、进程打开的文件描述符、信号的处理器、进程的当前目录、用户id和进程组id -
独占的
线程id、 寄存器组的值、线程堆栈、错误返回码、线程的信号屏蔽码、线程优先级
4. TCP三次握手分别发送了哪些数据(三次握手高频出现)
5. hash函数处理冲突的方法有哪两种(高频出现)
- 5.1开放定址法
- 线性探查法
- 平方探查法
- 双散列函数探察法
- 5.2 链地址法
- 5.3 再哈希法
- 5.4 建立公共溢出区
https://www.jianshu.com/p/4d3cb99d7580
6. 信号和信号量的区别在哪
1.信号:(signal)是一种处理异步事件的方式。信号时比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。linux除了支持unix早期的信号语义函数,还支持语义符合posix.1标准的信号函数sigaction。
2.信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。
7. 最大堆的实现原理
https://128kj.iteye.com/blog/1728555
8. 冒泡排序的实现(各种排序重中之重,高频出现)
public static void bubbleSort(int[] a ,int n)
{
for(int i=0;i<n;i++)
{
for(int j=1;j<n-i;j++)
{
if(a[j-1] > a[j])
{
int temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
}
9. 寻找范围在0-100000的数中有哪些重复(腾讯贼喜欢问这种海量数据处理的问题)
位图法
10. 哪些方法监控磁盘(我之前也被问过)
iostat命令
11. iostat中的svctm和wait time分别表示什么(我之前也被问过)
https://www.jianshu.com/p/bc1713ca8d18
await I/O 请求的平均等待时间,单位为毫秒。这个时间包括请求队列(这个概念很重要)消耗的时间和为每个请求服务的时间
svctm I/O 请求的平均服务时间,单位为毫秒(这个数据不可信!)
%util 处理 I/O 请求所占用的时间的百分比,即设备利用率。I/O请求期间CPU时间的百分比(即设备的带宽利用率)。当这个值接近100%时,表示磁盘I/O已经饱和
12. 除了上课和书籍,获取知识的途径还有哪些(我也被问过,开放性题目)
13. 然后问我有什么想问的(肯定会被问的一个问题,我也不知道这里应该问什么)
14. RDMA的最大带宽
https://zhuanlan.zhihu.com/p/37669618
15. RDMA与TCP之间的区别在哪,分别少了哪几次拷贝。
16. RDMA write的实现原理。
17. 磁盘IOPS达到多少。
18. c++内存管理的5种方法,分别用来干什么
19. 多态的实现原理,关键字
20. 虚函数的虚函数表在什么时候创建。
编译时
https://www.cnblogs.com/xiehongfeng100/p/4678892.html#autoid-0-0-0
21. 虚函数和纯虚函数的区别
定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
定义一个函数为纯虚函数,才代表函数没有被实现。
总结:
1、纯虚函数声明如下: virtual void funtion1()=0; 纯虚函数一定没有定义,纯虚函数用来规范派生类的行为,即接口。包含纯虚函数的类是抽象类,抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。
2、虚函数声明如下:virtual ReturnType FunctionName(Parameter);虚函数必须实现,如果不实现,编译器将报错,错误提示为:
error LNK****: unresolved external symbol “public: virtual void __thiscall ClassName::virtualFunctionName(void)”
3、对于虚函数来说,父类和子类都有各自的版本。由多态方式调用的时候动态绑定。
4、实现了纯虚函数的子类,该纯虚函数在子类中就编程了虚函数,子类的子类即孙子类可以覆盖该虚函数,由多态方式调用的时候动态绑定。
5、虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
6、在有动态分配堆上内存的时候,析构函数必须是虚函数,但没有必要是纯虚的。
7、友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。
8、析构函数应当是虚函数,将调用相应对象类型的析构函数,因此,如果指针指向的是子类对象,将调用子类的析构函数,然后自动调用基类的析构函数。
有纯虚函数的类是抽象类,不能生成对象,只能派生。他派生的类的纯虚函数没有被改写,那么,它的派生类还是个抽象类。
定义纯虚函数就是为了让基类不可实例化化
因为实例化这样的抽象数据结构本身并没有意义。
或者给出实现也没有意义
实际上我个人认为纯虚函数的引入,是出于两个目的
1、为了安全,因为避免任何需要明确但是因为不小心而导致的未知的结果,提醒子类去做应做的实现。
2、为了效率,不是程序执行的效率,而是为了编码的效率。
22. 了解云服务吗,对云服务了解多少。
吹吧
23. 讲讲Docker
想到什么就吹什么吧。这个问题大了
24. 拥塞控制
25. linux的操作,查看进程状态,读取100次(??)文件的末尾
ps -aux
tail
26. TCP建立连接过程中SYCN网络攻击,怎么解决
- tcp_max_syn_backlog
从字面上就可以推断出是什么意思。在内核里有个队列用来存放还没有确认ACK的客户端请求,当等待的请求数大于tcp_max_syn_backlog时,后面的会被丢弃。
所以,适当增大这个值,可以在压力大的时候提高握手的成功率。手册里推荐大于1024。
- tcp_synack_retries
这个是三次握手中,服务器回应ACK给客户端里,重试的次数。默认是5。显然攻击者是不会完成整个三次握手的,因此服务器在发出的ACK包在没有回应的情况下,会重试发送。当发送者是伪造IP时,服务器的ACK回应自然是无效的。
为了防止服务器做这种无用功,可以把tcp_synack_retries设置为0或者1。因为对于正常的客户端,如果它接收不到服务器回应的ACK包,它会再次发送SYN包,客户端还是能正常连接的,只是可能在某些情况下建立连接的速度变慢了一点。
- 启用tcp_syncookies
https://blog.csdn.net/hengyunabc/article/details/24934529
27. 平衡二叉树 插入之后会发生什么 怎么维持平衡
28. 算法 归并排序 0-20的数大概1000个,O(n)排序
29. 数据库索引和b+树,b-树和b树。
(心中完全没有b树(逼数))
30. 50个1-50的不同的数(实际就是1,2,3…50打乱),不许新建数组,不许直接写结果1,2,3…50,O(n)的时间完成
当前数字跟索引不一致,交换。
补充:
计数排序