IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 面经基础知识 -> 正文阅读

[网络协议]面经基础知识

计算机网络 操作系统

linux常用命令

  • 用户命令:who、su、sudo、pwd、cd、ls、cat、man

  • cp、mv、rm、mkdir

  • 创建文件 echo、touch、cat、vim

  • chmod

  • find命令 find . -name “file1”

  • grep命令 grep -nE “k” file1

  • head、tail、history

  • tar打包和压缩

  • scp命令

进程和线程

1.进程和线程的区别

  • 资源:进程是资源分配的基本单位,线程不独立拥有资源,但可以访问其隶属进程的资源。
  • 调度:线程是独立调度的基本单位,同一进程中线程的切换不会引起进程的切换;不同进程的线程的切换会引起进程的切换;
  • 系统开销:
    • 创建或撤销进程,系统要为其分配或回收资源(如内存空间、IO设备),所付出的开销远比创建或撤销线程大;
    • 进程切换,需要保存当前进程cpu环境,设置新调度进程的cpu环境

根本区别在于:每个进程都有自己的地址空间,线程则共享地址空间。所有的区别都是根据这个区别产生的。

2.进程通信方式IPC inter-process communication 进程间通信

  • 共享内存——一块可供多个进程访问的内存区域

  • 管道——半双工

  • 信号和信号量——通知接收进程某个事件已经发生;信号量是一个计数器,用户互斥和同步

  • 消息队列

  • 套接字——可用于不同设备间的进程通信

3.线程通信方式

  • 线程间通信可以通过 直接读写同一进程的数据 进行通信

    • 锁机制

      互斥锁:以排他方式防止数据结构被并发修改

      读写锁:允许多个进程同时读,对写是互斥的

      条件变量:可以以园子的方式阻塞进程,知道某个特定条件为真。条件测试是在互斥锁的保护下进行的,条件变量与互斥锁一起使用。

    • 信号量机制(Semophore)和信号机制(Signal)

  • 线程间通信目的主要用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

OSI七层、四层、五层网络协议

物理层:主要规定了比特流如何在传输媒体上传输

链路层:实现了具体每段链路之间的通信,帧的传输

网络层:实现了主机之间的通信,ip分组的传输

运输层:实现了进程之间的通信,TCP和UDP报文的传输

会话层:建立和管理会话

表示层:数据内部格式

应用层:为特定应用程序提供数据传输,HTTP,DNS

TCP和UDP

TCP

  • 面向连接、可靠的、传输TCP报文段、提供完整性服务

UDP

  • 无连接、不可靠、传输用户数据包、提供及时性服务

三次握手和四次挥手

1.三次握手

  • 客户端向服务器发送连接请求报文:SYN=1,ACK=0,报文序号seq=x
  • 服务器向客户端发送连接确认报文:SYN=1,ACK=1,报文确认号ack=x+1,seq=y
  • 客户端再向服务器确认:ACK=1,ack=y+1,sep=x+1

2.四次挥手

  • A发送连接释放报文:FIN=1,seq=u

  • B收到后确认:ACK=1,ack=u+1,seq=v

    此时连接处于半关闭状态

  • 当B不需要连接是,发送连接释放报文:FIN=1,ACK=1,ack=u+1,seq=w

  • A收到后确认:ACK=1,ack=w+1,seq=u+1

3.为什么分两次释放:

  • A向B发送连接释放请求,B收到请求后就进入了close-wait状态;这个状态是为了让B发送还未传送完毕的数据。传送完毕后,B会想A发送连接释放请求

4.A在向B进行确认以后进入time_wait状态,再进入closed状态

  • 等待2MSL,确保最后一个确认报文能够到达;如果不能到达,B会再次发送连接释放请求。

URL输入浏览器经历的过程

  1. DNS域名解析,浏览器查找DNS域名服务器获取域名对应的ip地址
  2. 浏览器和服务器建立TCP链接
  3. 浏览器向服务器发送一个HTTP请求;服务器处理请求,返回一个HTTP响应报文;浏览器解析和渲染页面;
  4. 释放TCP链接;

应用层使用了http协议,传输层使用了ospf协议和TCP协议,网络层使用了IP协议和ARP协议

操作系统

IO模型

IO概念和五种IO模型 - shengguorui - 博客园 (cnblogs.com)

什么是IO?

  1. linux中一切皆文件,文件就是一串二进制流而已;不管socket,还是FIFO、管道、终端、对我们来说,一切都是文件,一切都是流;

  2. 在信息交换的过程中、我们都是对这些流进行数据的收发工作、简称I/O操作(input and output)

    • 从流中读出数据,系统调用read
    • 往流中写入数据,系统调用write
  3. 计算机中有很多流,如何标识?

    采用文件描述符,fd;一个fd就是一个整数,所以对这个整数的操作,就是对这个文件(流)的操作;

    我们创建一个socket,通过系统调用会返回一个文件描述符;那么剩下对socket的操作就会转化为对在这个描述符的操作;这是分层和抽象的思想。

这里的IO主要侧重网络通信 数据应用程序等待网络数据,数据需要经过内核缓冲区。

IO交互?

用户空间< == >内核空间< == >设备空间(磁盘)

  • linux使用的是虚拟内存机制,用户应用程序必须通过系统调用请求内核协助完成IO操作,内核会为每个IO设备维护一个缓冲区。

  • 对于一个从磁盘到用户应用程序输入操作,系统调用后、内核会先看缓冲区有没有相应的缓存数据,没有的话再到设备中读取

  • 对于一个网络输入操作通常包括两个阶段:

    • 等待网络数据到达网卡,读取到内核缓冲区
    • 从内核缓冲区复制数据到用户空间

IO有内存IO、磁盘IO、网络IO三种,通常我们说的IO是后两种

IO模型有哪些?

1.阻塞IO(阻塞指阻塞程序)——一次等一个

  • 在内核将数据准备好之前,应用进程 系统调用会一直等待
  • 默认是阻塞IO

2.非阻塞IO

  • 在内核将数据准备好之前,应用进程 可以进行其他操作;

  • 但是会向内核轮询数据是否准备好

    每次客户询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当数据准备好,就进行拷贝。当数据没有准备好,不阻塞程序,内核直接返回为准备就绪的信号,等待用户程序的下一次轮询。

3.信号驱动IO

  • 用户程序告诉内核,当数据准备好时,给它发送一个信号;
    • 应用进程执行sigactiion系统调用,内核立即返回,应用程序可以继续执行;等待数据阶段是非阻塞状态
    • 数据准备好时,内核向应用进程发送SIGIO信号,应用进程收到信号后在信号处理程序中调用recvfrom将数据从内核缓冲区复制到应用进程中。

4.IO多路复用(事件驱动IO)——可以一次等多个

  • D同样也在河边钓鱼,但是D生活水平较好,D拿了很多鱼竿,一次性有很多鱼竿在等,D不断的查看每个鱼竿是否有鱼上钩。增加了效率,减少了等待的时间。

  • IO多路转接多了一个select函数,select函数有一个参数是文件描述符集合,对这些文件描述符进行循环间厅,当某个文件描述符就绪时,就对这个文件描述符进行处理。

    其中,select只负责等,recvfrom只负责拷贝。

  • IO多路转接是属于阻塞IO,但可以对多个文件描述符进行阻塞监听,所以效率较阻塞IO高

5.异步IO

  • E也想钓鱼,但是有事情,于是他雇来了F,让F帮他等待鱼上钩,一旦有鱼上钩,F就打电话给E,E就会将鱼钓上去
    • 应用程序执行aio_read系统调用,内核会立即返回,应用程序可以继续执行,等待数据阶段是非阻塞状态
    • 当数据准备好后,由内核将数据拷贝到应用程序中,调用aio_read中定义好的函数处理程序

信号驱动IO和异步IO的区别:

信号驱动IO的信号是通知应用程序可以开始IO,异步IO的信号是通知应用进程已经IO完成。

select/poll/epoll都是IO多路复用的具体实现

select、poll、epoll之间的区别总结整理- Rabbit_Dale - 博客园 (cnblogs.com)

  • select出现最早,之后是poll,再是epoll

  • IO多路复用就是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知应用程序进行相应的读写操作。

  • 但select、poll、epoll本质上都是同步IO,需要在读写事件就绪后自己负责进行读写,即读写过程是阻塞的。

    异步IO则无需自己负责进行读写,异步IO的实现会负责把数据从内核拷贝到用户空间。

1.select

  • 过程:应用程序进行系统调用,select函数遍历所有的fd,调用其对应的poll方法,poll方法会返回一个描述读写操作是否就绪的mask掩码。如果有fd已经准备就绪就进行复制操作,没有就继续睡眠一定时间再轮流检查。

  • select的三大缺点:

    • 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
    • 每次调用select,都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
    • select支持的文件描述符数量太小了,默认是1024

2.poll

  • poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构,而select使用fd_set结构,其他都差不多。
  • poll文件描述符使用链表实现,没有数量限制。

3.epoll

  • epoll是对select和poll的改进,解决了select的三大缺点

  • epoll与“select和poll“的调用接口不同:

    • select和poll都只提供了一个函数,select函数或者poll函数

    • epoll提供了三个函数:epoll_create创建一个epoll句柄、epoll_ctl注册要监听的事件类型、epoll_create等待事件的产生

      • 对于第一个缺点:epoll_ctl 每次注册新的事件到epoll句柄时,会将所有的fd拷贝进内核,而不是在epoll_wait时重复拷贝。保证了每个fd在整个过程中只会拷贝一次。

      • 对于第二个缺点:epoll不像select和poll每次都在内核遍历一遍所有传递进来的fd,epoll_ctl只遍历一次所有fd,并为每个fd在指定一个回调函数,当设备就绪,调用回调函数,把就绪的fd加入一个就绪链表。

        epoll_wait就是在就绪链表中查看有没有就绪的fd,实现睡一会,判断一会。

      • 对于第三大缺点,epoll为没有限制,支持的fd上限是最大可以打开文件的数目,这个数字一般非常大。

总结:

  • select和poll实现需要自己不断轮询所有fd集合,直到有设备就绪,期间可能要睡眠和唤醒多次交替。

    epoll也需要调用epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替;但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中进入睡眠的进程。

    虽然都要睡眠和交替,但是select和poll在“醒着”时需要遍历整个fd集合,而epoll在醒着时只需要判断一下就绪链表是否为空就行了。这节省了大量cpu时间,这就是回调机制带来的性能提升。

  • select和poll每次调用都要把fd从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次;

    而epoll整个过程只要拷贝一次,而且也只把current往等待队列挂一次,并为每个fd指定一个回调函数。

    这也能节省不少的开销。

应用场景:

  1. select的timeout参数精度更高,更适合实时性要求高的场景。几乎支持所有主流平台
  2. epoll只能运行在linux上;当fd集合数量较少时不能体现epoll优势,当有大量fd时考虑使用。

知道哪些锁?优劣?使用场景?

操作系统的各种锁_ZIMAJIM的博客-CSDN博客_操作系统锁的类型

1.互斥锁

  • 使用场景:多线程访问时,用于保证临界区互斥资源在任意时刻只有一个线程访问

2.读写锁

  • 使用场景:读共享,写独占。读写不能同时,写的优先级高
  • 当没有写锁时,允许多个进程同时读
  • 当没有读锁和写锁时,才能分配写锁用于写

3.条件变量

  • 条件变量严格意义上不是锁,但是条件变量能够阻塞线程

  • 互斥锁用于上锁,条件变量用于等待,每个条件变量总有一个互斥锁与之关联使用。

  • 互斥量:保护一块共享数据,条件变量引起阻塞

  • 条件不满足:线程阻塞;条件满足,唤醒阻塞线程

4.信号与信号量

信号量和信号机制用于线程之间的同步

5.自旋锁

  • 概念:用于进程或线程之间的同步。

    普通锁获取失败,该线程被阻塞。

    而cpu“处理阻塞引起的上下文切换”比“忙等”的代价高时(锁的已保持者保持锁的时间比较短),可以不放弃cpu时间片,而是在“原地”忙等,知道锁的持有者释放了该锁。

    这就是自旋锁的原理,自旋锁是一种非阻塞锁。

  • 存在问题:

    1. 过多占用cpu时间
    2. 死锁问题:一个线程自身递归调用自旋锁(自身两次调用),原则:递归程序不能在持有自旋锁是调用它自己,也不能在递归调用时试图获取相同的自旋锁。
  • 自旋锁与互斥锁区别:

    1. 类似互斥锁,都是为了实现保护资源共享

    2. 在任意时刻,都最多只能有一个保持者

    3. 获取互斥锁的线程,如果锁已被占用,则该线程将进入睡眠状态;

      获取自旋锁的线程不会睡眠,会一直死等,直到锁释放。

6.乐观锁和悲观锁(分类思想)

悲观锁:

  • 总是假设最坏的情况,每次拿取数据时都害怕别人会修改;所以每次去拿数据时都会上锁,

    这样别人想再拿这个数据就会阻塞(共享资源每次只给一个线程使用,其他线程阻塞,用完后再把资源转让给其他线程

  • 传统关系型数据库使用了很多这种锁机制,如表锁,行锁等。读锁,写锁,都是在操作之前先上锁。

    Java中synchronized和ReentrantLock等独占锁。

乐观锁:

  • 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,

    但是在数据更新的时候,会判断在此期间别人有没有去更新这个数据;

    可以使用版本号机制和CAS算法实现。

  • 乐观锁适用于多读的应用类型,这样可以提高吞吐量。

    像数据库提供的类似于write_condition机制

    Java中java.util.concurrent.atomic包下的原子变量类就是使用了乐观锁的一种实现方式CAS实现的

使用场景:

  • 各有优势,没有好坏之分
  • 乐观锁适用于多读场景,冲突很少发生时,可以省去锁的开销,加大系统的整个吞吐量
  • 悲观锁适用于多写场景,冲突比较多

乐观锁的两种实现方式:

  • 版本号机制

    一般在数据表中加上一个数据版本号version字段,数据更新前后验证数据版本号是否一致,一致才更新。

  • CAS算法

    • compare and swap,是著名的无锁算法。

      无锁编程,在不使用锁的情况下实现多线程之间的变量同步,非阻塞同步

    • 原理:CAS操作包含三个操作数——内存位置V、预期原值A,新值B。

      如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值,否则,处理器不做任何操作。

      第一次修改失败,后面重新尝试的过程称为自旋。

      当且仅当V的值等于A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作),一般情况下是一个自旋操作,即不断的尝试。

    • CAS有效的说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可”。

    • 只能保证一个共享变量的原子操作。

7.递归锁

  • 即在同一线程上该锁是可重入的,对于不同线程则相当于普通的互斥锁。

  • 同一线程上函数A递归获取已经获得的锁,不会形成死锁。但此时如果其他线程想要加锁,只有等待拥有锁的线程释放所有的锁(加锁几次就要释放几次)。

口述生产者消费者

负载均衡?轮询后端权重怎么确定?

如果希望根据连接数分配请求,你如何设计?(维护一个连接数的小根堆,外面带一个哈希表保存堆节点的地址)

GC回收

数据库

MySQL有哪些引擎、InnoDB和MyISAM区别

  • InnoDB引擎:支持事务、支持表级锁和行级锁、支持外键约束、不支持全文索引、表空间较大
  • MyISAM引擎:不支持事务、只支持表级锁、不支持外键约束、支持全文索引、表空间较小

事务

1.事务是什么?

  • 一个事务里的操作要么全部成功,要么全部失败。

2.事务有哪些操作?

  • 开始事务、提交、回滚;

  • 创建一个保存点、回到保存点

3.ACID

  • 原子性
  • 一致性:事务执行前后,数据库处于一致性状态,例如银行转账。
  • 隔离性:多个线程同时操作数据库
  • 持久性

4.隔离性造成的问题:

  • 脏读
  • 不可重复读
  • 幻读

索引

索引分类:主键索引、唯一索引、常规索引、全文索引

MySQL索引背后的数据结构及算法原理

摘要

数据结构及算法基础

MySQL索引实现

索引使用策略及优化

redis

Java基础

系统设计 面向对象

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-14 14:29:09  更:2021-08-14 14:31:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 19:18:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码