网络编程和并发 (一)

  1. 简述 OSI 七层协议。

物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0

数据链路层:定义了电信号的分组方式

网路层:引入一套新的地址用来区分不同的广播域/子网,这套地址即网络地址

传输层:建立端口到端口的通信

会话层:建立客户端与服务端连接

表示层:对来自应用层的命令和数据进行解释,按照一定格式传给会话层。如编码、数据格式转换、加密解密、压缩解压
应用层:规定应用程序的数据格式

  1. 什么是C/S和B/S架构?
    c/s架构,就是client(客户端)与server(服务端)即:客户端与服务端的架构。

b/s架构,就是brosver(浏览器端)与sever(服务端)即:浏览器端与服务端架构

优点:统一了所有应用程序的入口、方便、轻量级

  1. 简述 三次握手、四次挥手的流程。
    三次握手:
    第一次握手
    1:客户端先向服务端发起一次询问建立连接的请求,并随机生成一个值作为标识
    第二次握手
    2:服务端向客户端先回应第一个标识,再重新发一个确认标识
    第三次握手
    3:客户端确认标识,建立连接,开始传输数据
    四次挥手 —> 断开连接
    第一次挥手
    客户端向服务端发起请求断开连接的请求
    第二次挥手
    服务端向客户端确认请求
    第三次挥手
    服务端向客户端发起断开连接请求
    第四次挥手
    客户端向服务端确认断开请求

  2. TCP和UDP的区别?
    TCP/UDP区别
    TCP协议是面向连接,保证高可靠性传输层协议
    UDP:数据丢失,无秩序的传输层协议(qq基于udp协议)

  3. 为何基于tcp协议的通信比基于udp协议的通信更可靠?
    tcp:可靠,因为只要对方回了确认收到信息,才发下一个,如果没收到确认信息就重发
    UDP:不可靠,它是一直发数据,不需要对方回应
    流式协议: TCP协议,可靠传输
    数据报协议: UDP协议,不可传输

  4. 什么是socket?简述基于tcp协议的套接字通信流程。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,
对用户来说,一组简单的接口就是全部。

服务端:
创建socket对象,
绑定ip端口bind(),
设置最大链接数listen(),
accept()与客户端的connect()创建双向管道,等到联接,
send(), recv(), 收发数据
close()

客户端:
创建socket对象,
connect()与服务端accept()创建双向管道 ,
send(),
recv(),
close()

  1. 什么是粘包? socket 中造成粘包的原因是什什么? 哪些情况会发生粘包现象?

只有TCP有粘包现象,UDP永远不会粘包
粘包:在获取数据时,出现数据的内容不是本应该接收的数据,如:对方第一次发送hello,第二次发送world,
  我方接收时,应该收两次,一次是hello,一次是world,但事实上是一次收到helloworld,一次收到空,这种现象叫粘包

原因
粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。

什么情况会发生:
1、发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)

2、接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,
服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

  1. IO多路复的作用?
    socketserver,多个客户端连接,单线程下实现并发效果,就叫多路复用。

与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

9.select、poll、epoll 模型的区别?(属于多路复用IO的模型)

都是i/o多路复用的机制,监视多个socket是否发生变化,本质上都是同步i/o
select,poll实现需要自己不断轮询所有监测对象,直到对象发生变化,在这个阶段中,
可能要睡眠和唤醒多次交替,而epoll也需要调用epoll_wait不断轮询就绪链表,但是当对象发生变化时,
会调用回调函数,将变化的对象放入就绪链接表中,并唤醒在epoll_wait中进入睡眠的进程。
虽然都会睡眠和唤醒,但是select和poll在被唤醒的时候要遍历整个监测对象集合,
而epoll只要判断就绪链表是否为空即可,节省了大量cpu的时间
select、poll、epoll都是IO多路复用的机制,但select,poll,epoll本质上都是同步I/O,
因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的.

FD(文件描述符)
select模型
优点:
1:可移植性好,在某些Unix系统不支持poll()
2:对于超时值提供了更好的精度:微妙,而poll是毫秒
缺点:
1:最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Select 模型的最大并发数就被相应限制了。
2:效率问题,select每次调用都会线性扫描全部的FD集合,所以将FD_SETSIZE 改大,会越慢
3:需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。

poll本质上和select 没有区别,它将用户传入的数组拷贝到内核空间,
它没有最大连接数的限制,原因是它基于链表来存储的但是同样有一个缺点:
大量的fd的数组被整体复制于用户态和内核地址空间,而不管这样的复制是不是有意义

  1. 什么是防火墙以及作用?
    防火墙是一个分离器、一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动,保证了内部网络的安全

作用
防火墙是网络安全的屏障
可以强化网络安全策略
对网络存取和访问进行监控审计
防止内部信息的外泄
除了安全作用,防火墙还支持具有Internet服务特性的企业内部网络技术体系VPN(虚拟专用网)。

  1. 简述 进程、线程、协程的区别 以及应用场景?

线程是指进程内的一个执行单元,

进程

进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。

线程

线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度

协程和线程

协程避免了无意义的调度,由此可以提高性能;但同时协程也失去了线程使用多CPU的能力

进程与线程的区别
(1)地址空间:线程是进程内的一个执行单位,进程内至少有一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是
(4)二者均可并发执行
(5)每个独立的线程有一个程序运行的入口

协程与线程
(1)一个线程可以有多个协程,一个进程也可以单独拥有多个协程,这样Python中则能使用多核CPU
(2)线程进程都是同步机制,而协程是异步
(3)协程能保留上一次调用时的状态

  1. GIL锁是什么?
    GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。

GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理

应用(总结):
多线程用于IO密集型,如socket,爬虫,web
多进程用于计算密集型,如金融分析

  1. 每个cpython进程内都有一个GIL

  2. GIL导致同一进程内多个进程同一时间只能有一个运行

  3. 之所以有GIL,是因为Cpython的内存管理不是线程安全的

  4. 对于计算密集型用多进程,多IO密集型用多线程

  5. Python中如何使用线程池和进程池?

  6. threading.local的作用?
    实现线程局部变量的传递。

ThreadLocal 最常用的地方:
为每个线程绑定一个资源(数据库连接,HTTP请求,用户身份信息等),这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。

  1. 进程之间如何进行通信?

  2. 什么是并发和并行?

并发:同一时刻只能处理一个任务,但一个时段内可以对多个任务进行交替处理(一个处理器同时处理多个任务)

并行:同一时刻可以处理多个任务(多个处理器或者是多核的处理器同时处理多个不同的任务)

类比:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。

  1. 进程锁和线程锁的作用?

  2. 解释什么是异步非阻塞?
    非阻塞:不等待
    即:遇到IO阻塞不等待(setblooking=False),(可能会报错->捕捉异常)
    - sk=socket.socket()
    - sk.setblooking(False)
    异步:回调,当达到某个指定的状态之后,自动调用特定函数

实例
nb_async.py 实现异步非阻塞的模块
异步体现在回调上,回调就是有消息返回时告知一声儿进程进行处理。非阻塞就是不等待,不需要进程等待下去,继续执行其他操作,不管其他进程的状态。

  1. 路由器和交换机的区别
    1:交换机:是负责内网里面的数据传递(arp协议)根据MAC地址寻址
    路由器:在网络层,路由器根据路由表,寻找该ip的网段
    2:路由器可以处理TCP/IP协议
    3:路由器可以把一个IP分配给很多个主机使用,这些主机对外只表现出一个IP。
    交换机可以把很多主机连起来,这些主机对外各有各的IP。
    4:交换机是做端口扩展的,也就是让局域网可以连进来更多的电脑。
    路由器是用来做网络连接,也就是;连接不同的网络

20.什么是域名解析?
在互联网上,所有的地址都是ip地址,现阶段主要是IPv4(比如:110.110.110.110)。
但是这些ip地址太难记了,所以就出现了域名(比如http://baidu.com)。
域名解析就是将域名,转换为ip地址的这样一种行为。

21.如何修改本地hosts件?
Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,
当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,
一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。

浏览器访问网站,要首先通过DNS服务器把要访问的网站域名解析成一个唯一的IP地址,之后,浏览器才能对此网站进行定位并且访问其数据。

文件路径:C:\WINDOWS\system32\drivers\etc。
将127.0.0.1 www.163.com 添加在最下面
修改后用浏览器访问“www.163.com”会被解析到127.0.0.1,导致无法显示该网页。

22.生产者消费者模型应用场景及优势?
生产者与消费者模式是通过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯,
而是利用阻塞队列来进行通讯,生产者生成数据后直接丢给阻塞队列,消费者需要数据则从阻塞队列获取,
实际应用中,生产者与消费者模式则主要解决生产者与消费者生产与消费的速率不一致的问题,达到平衡生产者与消费者的处理能力,而阻塞队列则相当于缓冲区。

应用场景:用户提交订单,订单进入引擎的阻塞队列中,由专门的线程从阻塞队列中获取数据并处理

优势:
1;解耦
假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。
将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。
2:支持并发
生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只能一直等着
而使用这个模型,生产者把制造出来的数据只需要放在缓冲区即可,不需要等待消费者来取

3:支持忙闲不均
缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。
当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

23.什么是cdn?
目的是使用户可以就近到服务器取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

cdn 即内容分发网络

24.LVS是什么及作用?
LVS :Linux虚拟服务器
作用:LVS主要用于多服务器的负载均衡。
它工作在网络层,可以实现高性能,高可用的服务器集群技术。
它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。
它易用,配置非常简单,且有多种负载均衡的方法。
它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

25.Nginx是什么及作用?

26.keepalived是什么及作用?

27.haproxy是什么以及作用?

28.什么是负载均衡?

29.什么是rpc及应用场景?

30.简述 asynio模块的作用和应用场景。

31.简述 gevent模块的作用和应用场景。

32.twisted框架的使用和应用

回到顶部
数据库和缓存(46题)

33.列举常见的关系型数据库和非关系型都有那些?
关系型数据库(需要有表结构)
mysql、oracle 、 spl、server、db2、sybase

非关系型数据库(是以key-value存储的,没有表结构)(NoSQL)
MongoDB
MongoDB 是一个高性能,开源,无模式的文档型数据库,开发语言是C++。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。
Redis
Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。目前由VMware主持开发工作。

34.MySQL常见数据库引擎及比较?
InnoDB
支持事务
支持表锁、行锁(for update)
表锁:select * from tb for update
行锁:select id,name from tb where id=2 for update

myisam
查询速度快
全文索引
支持表锁
表锁:select * from tb for update

NDB
高可用、 高性能、高可扩展性的数据库集群系统

Memory
默认使用的是哈希索引

35.简述数据库三大范式?
数据库的三大特性:
‘实体’:表
‘属性’:表中的数据(字段)
‘关系’:表与表之间的关系

数据库设计三大范式:

1:确保每列保持原子性(即数据库表中的所有字段值是不可分解的原子值)

2:确保表中的每列都是和主键相关(表中只能保存一种数据,不可以把多种数据保存在同一张表中)—>完全属于当前表的数据

3:确保每列都和主键直接相关,而不是间接相关(在一个数据库表中保存的数据只能与主键相关)----> 消除传递依赖(间接)
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。
而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
数据库五大约束’
1.primary KEY:设置主键约束;
2.UNIQUE:设置唯一性约束,不能有重复值;
3.DEFAULT 默认值约束
4.NOT NULL:设置非空约束,该字段不能为空;
5.FOREIGN key :设置外键约束。

36、什么是事务?MySQL如何支持事务?
事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。

事务的特性:
原子性: 确保工作单元内的所有操作都成功完成,否则事务将被中止在故障点,和以前的操作将回滚到以前的状态。
一致性: 确保数据库正确地改变状态后,成功提交的事务。
隔离性: 使事务操作彼此独立的和透明的。
持久性: 确保提交的事务的结果或效果的系统出现故障的情况下仍然存在。

Mysql实现事务
InnoDB支持事务,MyISAM不支持
# 启动事务:
# start transaction;
# update from account set money=money-100 where name=‘a’;
# update from account set money=money+100 where name=‘b’;
# commit;
‘start transaction 手动开启事务,commit 手动关闭事务’

37.简述数据库设计中一对多和多对多的应用场景?
FK(一对多)
下拉框里面的数据就需要用FK关联另一张表

M2M(多对多)
多选的下拉框,或者checkbox

38.如何基于数据库实现商城商品计数器?

39.常见SQL(必备)
group by 分组对聚合的条件进行筛选需要通过havhing

SQL的left join 、right join、inner join之间的区别
left join (左连接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右连接) 返回包括右表中的所有记录1和左表中联结字段相等的记录
inner join(内连接): 只返回两个表中联结字段相等的行

40.简述触发器、函数、视图、存储过程?
触发器:
对数据库某张表的增加、删除,修改前后定义一些操作

函数:(触发函数是通过select)
聚合函数:max/sum/min/avg
时间格式化:date_format
字符串拼接:concat

存储过程:
将SQL语句保存到数据库中,并命名,以后在代码调用时,直接调用名称即可
参数类型:
  in 只将参数传进去
  out 只拿结果
  inout 既可以传,可以取

函数与存储过程区别:
本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。

视图:
视图是一个虚拟表,不是真实存在的(只能查,不能改)

猜你喜欢

转载自blog.csdn.net/weixin_45011910/article/details/89853292