简述 OSI 7层模型及其作用?(2分)
应用层、
表示层、
会话层、
传输层、端口 UDP TCP 四层交换机 四层路由器
网络层、ipv4 ipv6协议 路由器 三层交换机
数据链路层、mac arp协议 网卡 (二层)交换机
物理层
简述 TCP三次握手、四次回收的流程。(3分)
第一次:客户端发送初始序号x和syn=1请求标志
第二次:服务器发送请求标志syn,发送确认标志ACK,发送自己的序号seq=y,发送客户端的确认序号ack=x+1
第三次:客户端发送ACK确认号,发送自己的序号seq=x+1,发送对方的确认号ack=y+1
第一次挥手:客户端发出释放FIN=1,自己序列号seq=u,进入FIN-WAIT-1状态
第二次挥手:服务器收到客户端的后,发出ACK=1确认标志和客户端的确认号ack=u+1,自己的序列号seq=v,进入CLOSE-WAIT状态
第三次挥手:客户端收到服务器确认结果后,进入FIN-WAIT-2状态。此时服务器发送释放FIN=1信号,确认标志ACK=1,确认序号ack=u+1,自己序号seq=w,服务器进入LAST-ACK(最后确认态)
第四次挥手:客户端收到回复后,发送确认ACK=1,ack=w+1,自己的seq=u+1,客户端进入TIME-WAIT(时间等待)。客户端经过2个最长报文段寿命后,客户端CLOSE;服务器收到确认后,立刻进入CLOSE状态。
TCP和UDP的区别?(3分)
TCP是面向连接的,UDP是无连接的,TCP提供可靠的服务,也就是说,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达,UDP没有可靠性。TCP是面向字节流的,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。
什么是黏包?(2分)
当多条消息发送时接受变成了一条或者出现接收不准确的情况
什么 B/S 和 C/S 架构?(2分)
C:client 客户端
S:server 服务端
B:browser 浏览器
S:server 服务端
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
import socket
sk = socket.socket()
sk.bind(('0.0.0.0',9001))
sk.listen()
conn,addr = sk.accept()
conn.send(b"hello")
import socket
sk = socket.socket()
sk.connect(('0.0.0.0',9001))
msg = sk.recv(1024)
简述进程、线程、协程的区别?(3分)
进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。
线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
什么是GIL锁?(2分)
全局解释器锁.同一时刻保证一个进程中只有一个线程可以被cpu调度
进程之间如何进行通信?(2分)
Queue和Pipe这两种方式,Queue用于多个进程间实现通信,Pipe是两个进程的通信
Python如何使用线程池、进程池?(2分)
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor
请通过yield关键字实现一个协程? (2分)
什么是异步非阻塞? (2分)
在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。
什么是死锁?如何避免?(2分)
2个线程互相等待对方的锁,互相占用着资源不释放。
为程序中的每一个锁分配一个唯一的id,然后只允许按照升序规则来使用多个锁
程序从flag a执行到falg b的时间大致是多少秒?(2分) 1
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(False)
t.start()
# flag b
程序从flag a执行到falg b的时间大致是多少秒?(2分)1
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(True)
t.start()
# flag b
程序从flag a执行到falg b的时间大致是多少秒?(2分) 60
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.start()
t.join()
# flag b
读程序,请确认执行到最后number是否一定为0(2分) 一定为0
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()
读程序,请确认执行到最后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()
MySQL常见数据库引擎及区别?(3分)
InnoDB、MyISAM和MEMORY
1、事务安全:
InnoDB支持事务安全,MyISAM和MEMORY两个不支持。
2、存储限制:
InnoDB有64TB的存储限制,MyISAM和MEMORY要是具体情况而定。
3、空间使用:
InnoDB对空间使用程度较高,MyISAM和MEMORY对空间使用程度较低。
4、内存使用:
InnoDB和MEMORY对内存使用程度较高,MyISAM对内存使用程度较低。
5、插入数据的速度:
InnoDB插入数据的速度较低,MyISAM和MEMORY插入数据的速度较高。
6、对外键的支持:
InnoDB对外键支持情况较好,MyISAM和MEMORY两个不支持外键。
简述事务及其特性? (3分)
事务应该具有4个属性:原子性、一致性、隔离性、持续性。
事务的隔离级别?(2分)
一个事务的执行不能被其他事务干扰。
char和varchar的区别?(2分)
char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
char所占的长度依然为10,除了字符‘’外,后面用空格补全
而varchar就立马把长度变为数据长度了
MySQL中delete和truncate的区别?(2分)
delete可以条件删除数据,而truncate只能删除表的所有数据
delete效率低于truncate,delete是一行一行地删除,truncate会重建表结构
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分) 没看懂(等于不会)
(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c)
组合索引遵循什么原则才能命中索引?(2分) 不会
列举MySQL常见的函数? (3分)
count() max() min() sum() avg()
MySQL数据库 导入、导出命令有哪些? (2分)
mysqldump -u用户名 -p 数据库名 > 数据库名.sql
mysql -u用户名 -p 数据库名 < 数据库名.sql
什么是SQL注入?(2分)
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
简述left join和inner join的区别?(2分)
left join以左表为准
inner join 选两张表都有的
SQL语句中having的作用?(2分)
过滤筛选
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
varchar(100),指的是100字符
一个TEXT列,最大长度为65535个字符
MySQL的索引方式有几种?(3分)
FULLTEXT,HASH,BTREE,RTREE
什么时候索引会失效?(有索引但无法命中索引)(3分)
数据库优化方案?(3分)
1、选取最适用的字段属性
2、使用连接(JOIN)来代替子查询(Sub-Queries)
3、使用外键
4、使用索引
5、优化查询语句
什么是MySQL慢日志?(2分)
mysql的慢查询日志是msyql提供的一种日志记录,它用来记录在msyql中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的sql,则会被记录到慢查询日志中。
设计表,关系如下: 教师, 班级, 学生, 科室。(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分)
查询所有同学的学号、姓名、选课数、总成绩;
select sname,sid,count(*),sum(number) from student inner join score on sid = student_id group by sutdent_id;
查询姓“李”的老师的个数;
select count(*) from teacher where tname like "李%";
查询平均成绩大于60分的同学的学号和平均成绩;
select student_id,avg(number) from score group by student_id having avg(number) > 60;
查询有课程成绩小于60分的同学的学号、姓名
select sid,sname from student where sid = (select student_id from score having number > 60);
删除学习“叶平”老师课的score表记录;
select cid from teacher inner join course on tid = teacher_id where tanme = "叶平"
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
查询每门课程被选修的学生数;
查询出只选修了一门课程的全部学生的学号和姓名;
查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
查询两门以上不及格课程的同学的学号及其平均成绩;