c++面试常见题·Part 3 TCP/IP&多线程编程&设计模式&Linux基操等

1.TCP/IP 四层模型:

(图来源于网络)

IP层(网络层)主要协议:

ARP(地址解析协议):负责将一个已知的ip地址解析成MAC地址,以便在交换机上进行通信、

ICMP(Internet控制消息协议):返回错误信息

DHCP(动态主机配置协议):由DHCP服务器动态分配ip

和RARP(反向地址转换协议)

2.TCP/UDP区别以及拥塞控制

TCP(Transmission Control Protocol,参数控制协议)和UDP(User Datagram Protocol,用户数据报协议)

TCP是面向连接的,保证可靠传输  ,传输效率低,利用滑动窗口拥塞控制

UDP无明确的连接,也不提供传输序列号确认和重传,传输效率高,无拥塞控制

3.https协议

HTTP+ 加密 + 认证 + 完整性保护 =HTTPS

与 SSL (Secure Socket Layer,安全套接层)组合使用的 HTTP 被称为 HTTPS

优点:安全

缺点:花费更多时间,解密等过程占用更多内存,消耗更多资源

4.奈奎斯特定理

W带宽 V波形个数,码元数

奈氏定理:理想低通信道下的极限数据传输率=2Wlog_{2}V(单位:b/s)

香农定理:有噪声的信道的极限数据传输速率= Wlog_{2}(1+S/N) (单位:b/s)  S/N成为信噪比

5.TCP三次握手四次挥手过程【重点】

(图来源于https://blog.csdn.net/qq_38950316/article/details/81087809

握手:1.(状态SYN_SENT)client——>发送SYN=1,seq=x

2.SYN=1,ACK=1,seq=y,ack=x+1<——server发送(状态:由listen转换成SYN_RCVD)

3.(状态变为Established)client发送——>ACK=1,seq=x+1,ack=y+1

发送数据

挥手:1.client——>发送FIN=1,seq=u

2.ACK=1,seq=v,ack=u+1<——sever端

3.FIN=1,ACK=1,seq=w,ack=u+1<——sever端

4.client——>ACK=1,seq=u+1,ack=w+1

====================================================

进一步提问:TIME_WAIT有什么作用,为什么会等2MSL的时间,MSL具体是什么

MSL=Maximum Segment Lifetime报文最大生存时间,就是报文在端到端传递所需的最长传输时间。

为了能保证客户传输的最后一个ACK报文能够到达服务端,服务端如果收不到会重传它上一次所发的报文,此时客户端已关闭不会收到所以不会重传,致使服务端不能正常close

2MSL是为了保证在服务器没有收到客户端最后一个ACK报文段而需要重传的情况时,客户端能知道这一情况而再次重传。

6.进程和线程区别

  • ·进程是分配资源的最小单位,线程是分配处理机的最小单位
  • ·一个进程可以有多个线程,进程有自己的独立地址空间,线程共享进程的资源空间(代码和数据空间),线程切换的开销比进程切换的开销小很多,线程也称作轻量级进程
  • ·线程间的通信通过共享全局变量,静态变量等,而进程间通信需要通过通信的方式
  • 进程之间一般没有影响,多线程进程中的线程有影响

7.进程间通信

  • 管道

半双工,只适用于父子进程或兄弟进程

  • 消息队列

消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取

  • 信号量

PV操作,用于进程间的同步互斥

  • 共享内存

共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。

因为多个进程可以同时操作,所以需要进行同步。

信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问

 

8.Socket编程   

服务器端:(1)创建socket对象——>绑定指定地址和端口

(2)监听(3)接受客户端的请求连接消息(4)传输服务(5)关闭socket

socket()->bind()->listen()->accept()->recv()->close()

用户端:(1)创建socket对象

(2)连接到服务器指定地址和端口

(3)send()传输消息

(4)关闭socket

socket()->connect()->send()->close()

9.设计模式(举几个例子而已)

(1)单例模式(最常见要手撕)

单例模式的类只允许一个实例存在

实现步骤:1.将该类的构造方法设置为私有的2.此类添加静态成员变量,并为其实例化  3.类内提供静态方法返回静态成员变量 就是唯一实例化的该类

代码有很多种写法-饿汉式,懒汉式,双重检查式,静态内部类,枚举式

1.饿汉式【静态变量】

//优点:简单,类装载的时候就完成实例化,避免了线程同步问题
//缺点:从始至终从未使用过这个实例,则会造成内存的浪费
public class singleton{
    private final static singleton INSTANCE=new singleton();
    private singleton(){}
    public static singleton getInstance{
        return INSTANCE;
    } 

饿汉式【静态代码块】

//类似上一种
public class Singleton{
    private static Singleton INSTANCE;
    static{
        INSTANCE=new Singleton();
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return INSTANCE;
    }
}

2、懒汉式

//线程不安全,不可用,只能在单线程下使用,不然容易产生多个实例对象
public class Singleton(){
    private static Singleton instance;
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}
//线程安全,但加锁影响效率
public class Singleton(){
    private static Singleton instance;
    private Singleton(){}
    public static synchronized Singleton getInstance(){
        if(instance==null){
            instance=new Singleton();
        }
        return instance;
    }
}

3、双重检查锁 double-checking locking

//增加了volatile,synchronized,进行了两次if检查
//优点:线程安全;延迟加载;效率较高
public class Singleton(){
    private static volatile Singleton instance;
    private Singleton(){}
    public static Singleton getInstance(){
        if(instance==null){
            synchronized(Singleton.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

静态内部类

//优点:避免了线程不安全,延迟加载,效率高
public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

还有枚举类(比较新颖不常用)

(2)观察者模式:又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式

(3)工厂模式:实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例

(4)策略模式

10.linux基本命令

  • cd  进入目录

cd ~返回home

cd ./x 进入当前目录的x文件夹 “.”表示当前目录

cd ../x  “..”表示上一层目录 

cd - 返回上一级

  • ls  罗列文件列表
  • ll=ls -l  罗列所有文件详细
  • cp 复制
  • mv  移动文件move
  • rm  删除文件夹 remove
  • rmdir
  • tar 解压缩

-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名【必须的】

例:tar –xvf file.tar  解压 tar包

tar –cvf jpg.tar *.jpg  将目录里所有jpg文件打包成tar.jpg

  • cat 查看文本内容
  • chmod 改变文件读写权限

u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。

r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行

r=4,w=2,x=1  
chmod 777 file=user group other都有权限  
chmod xxx file,xxx分别代表user group other的权限
  • vim 文本编辑
  • gcc /g++  编译c,c++程序成可执行程序
  • pwd 查看当前路径
  • mkdir 创建文件夹
  • grep 搜索

11.协程

协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component

线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值