-
简述 OSI 7层模型及其作用?(2分)
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层 -
简述 TCP三次握手、四次回收的流程。(3分)
三次握手是建立tcp连接的过程,客户端先发送SYN包到服务器,等待服务器确认,服务器收到SYN包,确认后返回客户端一个SYN包,客户端收到服务端的SYN包后向服务端返回ACK包,连接成功
四次挥手是tcp断开连接的过程,客户端发送断开连接报文,服务端收到断开连接报文后发出确认报文,客户端收到服务端的确认请求后,返回服务端确认报文,断开连接 -
TCP和UDP的区别?(3分)
tcp 上传下载发邮件,可靠 面向连接 速度慢,传输的数据长度不限
udp 即时通讯工具 不可靠 面向数据报 传输的数据长度有限 -
什么是黏包?(2分)
黏包现象在发送端时,当两条消息发送时消息间隔时间短,长度短,两条消息就会拼在一起
黏包现象在接收端时,多条消息被一次接收,数据与数据之间没有边界 -
什么 B/S 和 C/S 架构?(2分)
B/S架构 浏览器和服务端 节省资源不依赖环境
C/S架构 客户端和服务端 安全性强 程序比较庞大 -
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
#fuwuduan
import socket
sk = socket.socket()
sk.bind((‘127.0.0.1’,9000))
sk.listen()
while True:
conn,addr = sk.accept()
msg = ‘hello’.encode(‘utf-8’)
conn.send(msg)
while True:
recv_msg = conn.recv(1024).decode(‘utf-8’)
if recv_msg.upper() == ‘Q’:
break
print(recv_msg)
inp = input(’>>’)
conn.send(inp.encode(‘utf-8’))
if inp.upper()==‘Q’:
break
conn.close()
#kehuduan
import socket
sk = socket.socket()sk.connect(('127.0.0.1',9000)) while True: msg = sk.recv(1024).decode('utf-8') if msg.upper() == 'Q': break print(msg) mssg = input('>>') msssg = mssg.encode('utf-8') sk.send(msssg) if mssg.upper() == 'Q': break sk.close()
-
简述进程、线程、协程的区别?(3分)
进程是计算机资源分配的最小单位。
线程是计算机中可以被cpu调度的最小单位
一个进程中可以有多个线程,同一个进程中线程可以共享此进程中的资源,一个进程至少有一个线程。
协程切换任务资源很小,效率高(协程本身并不存在,是程序员通过控制IO操作完成) . -
什么是GIL锁?(2分)
gil是全局解释器锁,同一时刻保证一个进程中只有一个线程可以被CPU调度 -
进程之间如何进行通信?(2分)
使用队列 -
Python如何使用线程池、进程池?(2分)
import time
from concurrent.futures import ThreadPoolExecutordef task(arg): time.sleep(2) print('任务') return 666 # 创建线程池 pool = ThreadPoolExecutor(10) ret = pool.map(task,range(1,20)) print('END',ret) pool.shutdown(True) for item in ret: print(item) #------------- import time from concurrent.futures import 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('END')
-
请通过yield关键字实现一个协程? (2分)
import timedef consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) time.sleep(1) r = '200 OK' def produce(c): c.next() n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n) # 通知迭代器返回下一个 print('[PRODUCER] Consumer return: %s' % r) c.close() if __name__=='__main__': c = consumer() produce(c)
-
什么是异步非阻塞? (2分)
-
什么是死锁?如何避免?(2分)
程序处于阻塞状态无法向下运行
不要使用交叉锁,递归锁 -
程序从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 -
程序从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分)
MySQL常见的三种存储引擎为InnoDB、MyISAM和MEMORY。其区别体现在事务安全、存储限制、空间使用、内存使用、插入数据的速度和对外键的支持 -
简述事务及其特性? (3分)
事务,一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元。事务应该具有4个属性:原子性、一致性、隔离性、持久性。
1、原子性。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
2、一致性。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
3、隔离性。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4、持久性。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 -
事务的隔离级别?(2分)
读未提交
不可重复读
可重复读
串行化 -
char和varchar的区别?(2分)
char长度是固定的,varchar的长度是可变的 -
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
char长度是固定的,varchar的长度是可变的
varchar(50)中的50代表最多放50个字符 -
MySQL中delete和truncate的区别?(2分)
DELETE是可以带WHERE的,所以支持条件删除,可以回滚;而TRUNCATE只能删除整个表,不能回滚。 -
where子句中有a,b,c三个查询条件, 创建一个组合索引abc(a,b,c),以下哪种会命中索引(3分)
(a)
(b)
©
(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