注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题
-
简述 OSI 7层模型及其作用?(2分)
应用层
表示层
会话层
传输层
网络层
数据链层
物理层 -
简述 TCP三次握手、四次回收的流程。(3分)
三次握手:客户端发出一个syn请求,服务端收到并回复(syn,ack),客户端收到ack和syn后在回复一个ack
四次挥手:客户端发出一个fin请求,服务端返回ack,fin客户端 -
TCP和UDP的区别?(3分)
TCP:可靠,面向连接,速度慢,能传递的数据长度不限
UDP:即时通信,不可靠,速度快,能传递的数据长度有线 -
什么是黏包?(2分)
多条消息发送到缓存端,但没有被及时接受,或者接收的长度不足一次发送的长度
本质:发送的每一条数据之间没有边界 -
什么 B/S 和 C/S 架构?(2分)
B/S:
B:browser 浏览器
S:server 服务端
C/S:
C:client 客户端
S:server 服务端 -
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
client端(客户端)
import socket
sk = socket.socket()
sk.connect((‘127.0.0.1‘,9001))
while True:
a = input(‘输入内容,q退出‘)
if a.upper() == ‘Q‘:
sk.send(a.encode(‘utf-8‘))
break
else:
i = sk.recv(1024).decode(‘utf-8‘)
if i.upper() == ‘Q‘:
break
print(i)
sk.send(a.encode(‘utf-8‘))
sk.close()
?
?
?
severs端(服务端)
import socket
sk = socket.socket()
sk.bind((‘127.0.0.1‘,9001))
sk.listen()
conn,addr = sk.accept()
while True:
a = input(‘请输入内容,q退出‘)
if a.upper() == ‘Q‘:
conn.send(a.encode(‘utf-8‘))
break
else:
conn.send(a.encode(‘utf-8‘))
i = conn.recv(1024).decode(‘utf-8‘)
if i.upper() == ‘Q‘:
break
print(i)
?
conn.close()
sk.close() -
简述进程、线程、协程的区别?(3分)
进程是计算中资源分配最小的单位,线程是计算机中能被cpu调度的最小单位,协程又叫‘微线程’
是人为创造的,进程和线程是计算机中自带的
一个进程至少有一个线程,也可以有多个,线程可以共享此进程的资源
计算机密集型 多进程
IO密集型 多线程/协程+IO
单独的协程是没办法实现并发,只能代码之间互相切换,加上IO自动切换才有意义 -
什么是GIL锁?(2分)
全局解释锁:同一时刻保证一个进程中只有一个线程可以被cpu调度,
-
进程之间如何进行通信?(2分)
IPC
from multiprocessing import Queue,Process
?
def son(q):
print(q.get())
if __name__==‘__main__‘
q=Queue()
p=Process(target=son,args=(q,))
p.start()
q.put(123) -
Python如何使用线程池、进程池?(2分)
线程池:
import time
from concurrent.futures import ThreadPoolExecutor
def task(n1,n2):
?
time.sleep(2)
print(‘任务‘)
return n1+n2
#创建线程池
pool = threadPoolExecutor(10)
future_list = []
for i in range(20):
fu = pool.submit(task,i,1)
future_list.append(fu)
?
pool.shutdown(True)
for fu in future_list:
print(fu,result())
?
?
进程池:
import time
from concurrent.futures impor ProcessPoolExecutor
def task(n1,n2):
time.sleep(2)
print(‘小妹‘)
?
if __name__ == ‘__main__‘
?
#创建线程池
pool = ProcessPoolExecutor(10)
for i in range(20):
pool.submit(task,i,1)
print(‘xiaomei‘) -
请通过yield关键字实现一个协程? (2分)
?
-
什么是异步非阻塞? (2分)
同步:一个程序执行完了再调另一个,需要等待这个程序执行完毕再去执行另一个
非阻塞:cpu工作 -
什么是死锁?如何避免?(2分)
锁中锁 交叉锁
使用rlock 递归锁 -
程序从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
# 零点几秒 -
程序从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
#60多秒 -
程序从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 -
读程序,请确认执行到最后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() -
读程序,请确认执行到最后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:frm表结构、MYD表数据、MYI表索引、数据的持久化存储,具有表级锁
memory:只能做缓存,特点:表结构、数据断电消失 -
-
事务的隔离级别?(2分)
-
char和varchar的区别?(2分)
char 表示定长,长度固定,varchar表示变长,即长度可变
char 来说,最多能存放的字符个数 255,和编码无关。
varchar 呢,最多能存放 65532 个字符。 -
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
-
MySQL中delete和truncate的区别?(2分)
-
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
(a)
(b)
(c)
(a,b)
(b,c)
(a,c)
(a,b,c) -
组合索引遵循什么原则才能命中索引?(2分)
-
列举MySQL常见的函数? (3分)
-
MySQL数据库 导入、导出命令有哪些? (2分)
-
什么是SQL注入?(2分)
-
简述left join和inner join的区别?(2分)
-
SQL语句中having的作用?(2分)
-
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
-
MySQL的索引方式有几种?(3分)
-
什么时候索引会失效?(有索引但无法命中索引)(3分)
-
数据库优化方案?(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多路复用?
-
async/await关键字的作用?
-
MySQL的执行计划的作用?
-
简述MySQL触发器、函数、视图、存储过程?
-
数据库中有表:t_tade_date
id tade_date
1 2018-1-2
2 2018-1-26
3 2018-2-8
4 2018-5-6
...
输出每个月最后一天的ID -
原文:https://www.cnblogs.com/0503m/p/12371274.html
如果您也喜欢它,动动您的小指点个赞吧