面试资料(1)

1、进程和线程的区别?
1)、进程是程序的动态运行,是程序执行时的一个实例。是系统进行资源分配和调度的一个最小单位。
2)、线程是进程的一个实体,是CPU调度和分派的基本单位。
一个进程拥有一个或多个线程,至少拥有一个线程。进程拥有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。线程依附与进程存在,是一个进程中的不同执行路径。线程没有独立的地址空间(有自己的堆栈和局部变量),同一进程的所有线程共享该进程的所有资源。一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序更健壮。但是在程序切换是,进程切换耗费资源更大,效率差些。因此对于一些要求高并发的并且要共享某些变量的程序,只能用线程。
为什么要使用多线程而不是多进程?
1)、linux系统下,启动一个新的进程必需分配给它独立的地址空间,建立众多的数据表来维护他的代码段、堆栈段和数据段,地址空间开销较大。而运行与一个进程中的多线程,他们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远小于启动一个进程所花费的空间。而且线程间彼此切换所需时间也远小于进程间切换所需的时间。
2)、线程间方便的通信机制。对于不同进程来说,他们拥有独立的数据空间,数据传递只能通过通信方式进行,费时、不方便。对于线程,由于多个线程共享的是同一进程下的数据空间,所以一个线程的数据可以直接被其他线程所用,快捷方便。
2、TCP窗口值是做什么用的?
是来做流量控制的。TCP滑动窗口分为接受窗口,发送窗口。滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。对于ack报文,是收到数据后的一个确认报文。包含两个重要信息,一个是期望受到的下一字节的序号n,代表此前已经受到了n-1字节的数据。另一个是当前窗口大小m,发送方可以根据受到的ack报文中的这两个数据,计算出还可以发送多少字节数据给对方。(流控的原理)

3、netfilter中的4个表5条链?
4个表:raw表、nat表、mangle表、filter表。
5条链:prerouting、input、forward、output、postrouting。
5个挂载点:NF_INET_PRE_ROUTING:系统收到数据后,且没有经过路由
NF_INET_LOCAL_IN:系统收到数据,经过路由后,如果数据的目标地址是本机就经过该点
NF_INET_FORWARD:系统收到数据,经过路由后,如果数据的目标地址是其他地方就经过该点
NF_INET_LOCAL_OUT:系统发送数据时,未经过路由
NF_INET_POST_ROUTING:系统发送数据时,经过了路由阶段,马上就发出去了
如图:

4、用户态的几种锁?(内核态)
一般地开销、时间短推荐使用自旋锁,长期枷锁或者持锁睡眠推荐用互斥锁。
1)、自旋锁
自旋锁不应该被长时间持有,原因::浪费cpu时间。
作用:保护临界区资源;
pthread_spin_init(&lock, 0);

pthread_spin_lock(&lock);
/临界区资源…/
pthread_spin_unlock(&lock);
pthread_spin_destroy(&lock);
2)、读-写自旋锁
锁的用途可以明确分为读取和写入两个场景。对一个链表可能既要更新又要检索。当更新(写入)连宝石,不能有其他代码并发地写或者读链表,写操作要求完全的护持。另一方面,当对其检索(读取)链表时,只要求其他程序不对链表进行写操作就行了,可以有多个并发的读操作。类似于这种情况,就可以通过读-写锁进型保护。
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,
const pthread_rwlockattr_t *restrict attr); //初始化锁
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); //加读锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); //加写锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); //解锁
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); //销毁锁
3)、互斥锁
作用:保护临界资源。
pthread_mutex_init(&mutex);
pthread_mutex_lock(&mutex); //加锁
/临界区…/
pthread_mutex_unlock(&mutex); //解锁

5、为什么要内存对齐?
内存对齐的主要作用是:
1、 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台拒绝读取未对齐数据,否则抛出硬件异常。
2、 性能原因:经过内存对齐后,CPU的内存访问速度大大提升。

6、Tcp三次握手,四次挥手?
这里写图片描述
TCP三次握手
1)、第一次握手,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT(表示请求连接状态),等待服务器端的确认。(SYN:同步序列编号(synchronize sequence number);
2)、第二次握手,服务器收到syn包,必须要确认客户端的syn(ack=j+1),同时发送自己的syn包(syn=k)即向客户端发送syn+ack包,进入SYN_RECV状态;
3)、第三次握手,客户端收到服务器端的SYN+ACK包,向服务器发送ACK(ACK=K+1),发送完成后,客户端和服务器端进入连接状态,完成三次握手。
TCP四次挥手
(1)客户端调用close函数,此时TCP向服务器发送一个FIN包,表明客户端发送数据结束;
(2)服务器端接收到FIN段后向客户端发回ack确认报文,告诉客户端同意关闭请求;
(3)服务器端向客户端发送FIN报文请求关闭连接,同时进入last_ack状态;
(4)客户端在收到服务器端的FIN报文端后,向服务器端发回ack确认报文并进入TIME_WAIT状态,服务器端在收到ack确认报文后就关闭连接。客户端在等待2MSL时间后没有收到回复则证明服务器端已关闭,客户端也关闭连接。

7、声明和引用
声明就是告诉编译器,我这个是使用别人的,你别报错!到时候连接器会帮我找到的。
引用就是某个目标变量的“别名”(alias),对引用的操作与对变量直接操作效果完全相同。

8、C语言32个关键字。
5个基本数据类型、4个数据类型修饰符、5个复杂数据类型、6个存储级别、12个流控关键字。
Void、Char、short、Int 、float、double、long、signed、unsigned、struct、union、enum、auto、register、volatile、static、const、extern、default、typedef、return、sizeof、goto、continue、if、else、break、do、while、for、switch、case

9、大小端问题
大端:高位存在低地址,低位存在高地址;
小端:高位存在高地址,低位存在低地址;(intel的x86,ARM普遍都是属于小端)
如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为:
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

10、数组指针问题。
行指针取降为列指针,列指针取变为元素;
元素取&变为列指针,列指针取&变为行指针。

11、优先级问题
括号成员第一,全体单目第二,乘除余三加减四;移位五关系六,等于不等排第七。位与异或和位或,三分天下八九十。逻辑或跟与,十二和十一。条件高于赋值,逗号优先级最低。

12、MPLS多协议标签交换技术
MPLS:多协议标签交换,是介于2层与3层之间的协议。
MPLS报文数据的结构:
这里写图片描述

MPLS报文的标签结构:
这里写图片描述

MPLS标签结构总长度为32Bit,其中分为以下几个域段:
Label:一个固定20bit长度的值,用于标识一组报文的转发行为。类似于IP
地址,但功能不像IP地址那么单一,标签只是局部有效。
Exp:一个3bit长度的值,用于实现MPLS的QoS,这里可以实现8 种优先级,
支持语音、视频、数据的不同服务类型,类似于IP的TOS 域段。
S:本域段只有1bit长度,用于表示当前标签是否属于标签栈底。1:表示是,
0:不是。
TTL:Time-To-Live,8 个bit长度的值,用于防止报文传输时的环路,和IP
协议中的TTL相同。

13、进程间通信方式
无名管道、有名管道、信号、信号量、消息队列、共享内存、socket。
参考资料:https://blog.csdn.net/gatieme/article/details/50908749
14、内存5大分区
1)、栈区 (由编译器自动分配释放,存储函数参数、局部变量);
2)、堆区 (程序动态申请释放的内存,malloc、new等);
3)、全局区(存放全局变量,静态变量);
4)、常量区 (字符串、数字等);
5)、代码区 (存放函数体的二进制代码);
15、简述linux启动过程
1)、上电加载BIOS,BIOS自检;
2)、从BIOS设置第一个启动设备中读取MBR;
3)、bootloader或NTLDR引导启动内核镜像;
4)、读取内核镜像加载启动内核;
5)、用户层init进程启动,执行不同级别的启动脚本;
6)、执行/bin/login,进入登录状态;
16、原码、反码、补码
原码:第一位表示符号,其余位表示值;
反码:正数的反码是其自身;负数的反码是在原码的基础上其符号位不变,其余各位取反;
补码:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)
17、避免头文件重复包含的方法
方法1:

#ifdef  ARP_H
#define ARP_H
.....
#endif

方法2:

#pragma once 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次

18、ipv4地址分类
A类ip地址:第一个字节为网络地址(最高位固定为0),剩下三个字节为主机地址;
范围:1.0.0.0—126.255.255.255,0和127作为特殊ip地址;
掩码:255.0.0.0
B类ip地址:第一字节和第二字节为网络地址(最高位固定为10),剩下两个字节为主机地址;
范围:128.0.0.0—-191.255.255.255
掩码:255.255.0.0
C类ip地址:第一字节、第二字节和第三字节为网络地址(最高位固定为110),剩下两个字节为主机地址;
范围:192.0.0.0—-223.255.255.255
掩码:255.255.255.0
D类ip地址:D类地址不分网络地址和主机地址,它的第1个字节的最高位固定是1110;
范围:224.0.0.0—-239.255.255.255
用于组播的ip地址,无子网掩码;
E类ip地址:E类地址也不分网络地址和主机地址,它的第1个字节的最高位固定是11110;
范围:240.0.0.0-255.255.255.254

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值