-
简述 OSI 7层模型及其作用?(2分)
应用层:与用户直接交互,软件、网站等
表示层:使用软件、网站可以查看的数据,图片等
会话层:保持登录状态,电脑中为cookie
传输层:选择TCP/UDP协议,进行数据发送。
网络层:通过IP路径寻址,并且对数据进行封装
数据链路层:使用mac地址寻址,又进行了数据封装
物理层:将上面得到的数据转化为信号
-
简述 TCP三次握手、四次回收的流程。(3分)
三次握手:
-
第一次握手:Client将标志设置为SYN=1,随机产生一个seq=J,并将该数据包发送给server,client进入SYN_SENT状态,等待server确认。
-
第二次握手:server收到数据包后由标志位SYN=1知道client请求建立链接,server将标志位SYN和ACK都设置为1,ack=J+1,随机产生一个值seq=K,并将数据包发送给client确认连接,server进入syn_rcvd状态。
-
第三次握手:client收到确认后,检查ack是否为J+1,ACK是否为1,如果正确则将标志位ACK设置为1,ack=K+1,并将该数据包发送给server,server检查ack是否为K+1,ACK是否为1,如果正确则建立链接,client和server进入ESTABALISED状态,完成三次握手。
四次挥手:
-
第一次挥手:客户端发送FIN到服务端请求断开链接。
-
第二次挥手:服务端收到这个FIN,发回一个ACK,确认序号为收到的序号+1,和SYN一样,FIN占用一个序号。
-
第三次挥手:服务器发送一个FIN给客户端,此时可以断开客户端链接,
-
第四次挥手:客户端收到FIN报文,会向服务端发送ACK确认,经过两个msl时长,断开链接。
-
-
TCP和UDP的区别?(3分)
TCP是可靠的,面向链接,速度慢,适用于上传、下载、发邮件,传递数据长度不受限制,流式传输,全双工。
UDP是不可靠的,面向数据报,速断快,适用于即时通讯 ,传递数据长度受限制,不占用链接。
-
什么是黏包?(2分)
当多条消息发送时,接收变成了一条或出现数据接收不准的清况。
-
什么 B/S 和 C/S 架构?(2分)
B/S:浏览器和服务端交互
C/S:客户端和服务端交互
-
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
# 服务端:
import socket
?
sk = socket.socket()
sk.bind((‘0.0.0.0‘,9899))
sk.listen()
?
conn,addr = sk.accept()
conn.send(‘我是客户端001‘).encode(‘utf-8‘)
msg = conn.recv(1024).decode(‘utf-8‘)
print(msg)
conn.close()
sk.close()
?
?
# 客户端
import socket
?
sk = socket.socket()
sk.connent("127.0.0.1",9899)
msg = sk.recv(1024).decode(‘utf-8‘)
print(msg)
sk.send(‘我是客户端002‘.encode(‘utf-8‘))
sk.close() -
简述进程、线程、协程的区别?(3分)
-
区别: 进程是计算机资源分配的最小单位。 线程时是计算机中CPU调度的最小单位。 协程又称为‘微线程’,是基于代码,人为创造的,而进程、线程时计算机中真实存在的,一个进程中可以有多个线程,一个线程可以创建多个协程。 计算密集型:用多进程 IO密集型:用多线程/协程+IO切换线程是CPU调度的最小单位
-
-
什么是GIL锁?(2分)
GIL是全局解释器锁,本质就是一把互斥锁,同一时刻保证每一个进程中只有一个线程可以被cpu调度,所以在python开发时要注意:计算密集型,用多进程;IO密集型,用多线程
-
进程之间如何进行通信?(2分)
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。
-
Python如何使用线程池、进程池?(2分)
通过ProcessPoolExecutor模块,限制程序中可创建线程&进程的个数,防止无节制创建线程&进程,导致性能降低
-
请通过yield关键字实现一个协程? (2分)
?
-
什么是异步非阻塞? (2分)
一个程序执行中调用了另一个程序,不等待这个任务完毕,就继续执行下一个程序。
-
什么是死锁?如何避免?(2分)
-
死锁:lock互斥锁两次、多个锁交叉使用会导致死锁。
-
避免:避免互斥锁两次,避免多个锁交叉使用。
-
-
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(False)
t.start()
# flag b
?
# 不到1秒 -
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(True)
t.start()
# flag b
?
# 不到1秒 -
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.start()
t.join()
# flag b
?
# 60秒 -
读程序,请确认执行到最后number是否一定为0(2分)
import threading
loop = int(1E7)
def _add(loop:int = 1):
global number
for _ in range(loop):
number += 1
def _sub(loop:int = 1):
global number
for _ in range(loop):
number -= 1
number = 0
ta = threading.Thread(target=_add,args=(loop,))
ts = threading.Thread(target=_sub,args=(loop,))
ta.start()
ta.join()
ts.start()
ts.join()
?
# 一定为0 -
读程序,请确认执行到最后number是否一定为0(2分)
import threading
loop = int(1E7)
def _add(loop:int = 1):
global number
for _ in range(loop):
number += 1
def _sub(loop:int = 1):
global number
for _ in range(loop):
number -= 1
number = 0
ta = threading.Thread(target=_add,args=(loop,))
ts = threading.Thread(target=_sub,args=(loop,))
ta.start()
ts.start()
ta.join()
ts.join()
?
# 不一定为0 -
MySQL常见数据库引擎及区别?(3分)
-
简述事务及其特性? (3分)
-
事务的隔离级别?(2分)
-
char和varchar的区别?(2分)
-
char 定长:节省时间,浪费空间 (255个字符)
-
varchar 变长:节省空间,浪费时间 (65535个字符)
-
-
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
-
char 定长:节省时间,浪费空间 (255个字符)
-
varchar 变长:节省空间,浪费时间 (65535个字符)
varchar(50):长度为50的字符串
-
-
MySQL中delete和truncate的区别?(2分)
delete只是删除数据
truncate删除数据和缓存
-
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c)
# (a),(a,b),(a,c),(a,b,c) -
组合索引遵循什么原则才能命中索引?(2分)
最左前缀
-
列举MySQL常见的函数? (3分)
concat() # 拼接
group_concat() # 打印分组下字段全部信息
regexp # 正则匹配
abs() # 返回绝对值
avg() # 平均值
max() # 最大值
min() # 最小值
sum() # 求和
insert() # 插入 -
MySQL数据库 导入、导出命令有哪些? (2分)
导出整个数据库(包括数据库中的数据):mysqldump -u username -ppassword dbname > dbname.sql
导出数据库中的数据表(包括数据表中的数据):mysqldump -u username -ppassword dbname tablename > tablename.sql
导出数据库结构(不包括数据,只有创建数据表语句):mysqldump -u username -ppassword -d dbname > dbname.sql
导出数据库中数据表的表结构(不包括数据,只有创建数据表语句):mysqldump -u username -ppassword -d dbname tablename > tablename.sql -
什么是SQL注入?(2分)
SQL注入是一种注入攻击,可以执行恶意SQL语句。
-
简述left join和inner join的区别?(2分)
-
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
-
inner join(等值连接) 只返回两个表中联结字段相等的行
-
-
SQL语句中having的作用?(2分)
过滤
-
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
varchar:最多65535个字符
text:最多65535个字符
-
MySQL的索引方式有几种?(3分)
单列
功能
普通索引:加速查找
唯一索引:加速查找 + 约束:不能重复(只能有一个空,不然就重复了)
主键(primay key):加速查找 + 约束:不能重复 + 不能为空
多列
联合索引(多个列创建索引)-----> 相当于单列的普通索引
联合唯一索引 -----> 相当于单列的唯一索引 -
什么时候索引会失效?(有索引但无法命中索引)(3分)
-
条件中有or
-
多列索引
-
like查询以%开头
-
-
数据库优化方案?(3分)
?
-
什么是MySQL慢日志?(2分)
-
设计表,关系如下: 教师, 班级, 学生, 科室。(4分) 科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。
1. 写出各张表的逻辑字段
2. 根据上述关系表
a.查询教师id=1的学生数
b.查询科室id=3的下级部门数
c.查询所带学生最多的教师的id?
-
有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)
-
根据表关系写SQL语句(10分)
-
查询所有同学的学号、姓名、选课数、总成绩;
-
查询姓“李”的老师的个数;
-
查询平均成绩大于60分的同学的学号和平均成绩;
-
查询有课程成绩小于60分的同学的学号、姓名
-
删除学习“叶平”老师课的score表记录;
-
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
-
查询每门课程被选修的学生数;
-
查询出只选修了一门课程的全部学生的学号和姓名;
-
查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
-
查询两门以上不及格课程的同学的学号及其平均成绩;
-
第二部分 补充题
-
什么是IO多路复用?
网络数据传输监控机制 - 多个网络连接复用一个监听机制
select模块\selectors模块
操作系统提供的io多路复用的机制 select poll epoll
epoll最好 用的是回调函数的机制
select poll 的内部机制 是 轮询
-
async/await关键字的作用?
async用来定义一个协程函数的
await用来控制一个可能发生io阻塞的任务的切入和切出
async def func():pass ? await asyncio.sleep(2) import asyncio loop = asyncio.get_event_loop() loop.run_until_complete(func)
-
MySQL的执行计划的作用?
不执行sql,在之前先查看以下sql的顺序 索引的使用情况 从而去推测 优化sql语句
4.简述MySQL触发器、函数、视图、存储过程?
触发器 trigger:在用户对某张表做完某个固定的操作(insert update delete) 会自动在数据库中触发另一个动作
insert 一条数据 苹果手机
往对应的统计表中 把苹果这条数据 +1
函数(function):根据参数进行判断 循环 得出一个结果 并返回,通过select 函数名(参数)来调用并查看结果
视图(view) : 帮助我简化查询部分的连表操作
存储过程(procedure): 可以实现非常负责的sql逻辑 并对数据进行增删改查 且可以返回多个结果 call 名字(参数)调用
5.数据库中有表:t_tade_date
id tade_date 1 2018-1-2 2 2018-1-26 3 2018-2-8 4 2018-5-6 ... 输出每个月最后一天的ID
-