网编并发数据库面试练习(未完成)
注意:只有必答题部分计算分值,补充题不计算分值。
第一部分 必答题
-
简述 OSI 7层模型及其作用?(2分)
7.应用层:文件传输,文件管理,电子邮件的信息处理
6.表示层:确保一个系统的应用层发送的消息可以被另一个系统的应用层读取
5.会话层:负责在网络中的两节点建立,维持和终止通信
4.传输层:定义一些传输数据的协议和端口。传输协议同时进行流量控制
3.网络层:控制子网的运行
2.数据链路层:对物理层传输的数据包装,检测保证数据传输的可靠性
1.物理层:李永传输介质为数据链路层提供物理连接 -
简述 TCP三次握手、四次回收的流程。(3分)
三次握手:主机首先向服务器发送一个请求建立连接的请求,服务器收到后向主机发送一条确认的回复请求和一条对主机建立连接的请求,主机收到后向服务器回复一条确认的请求,开始传送数据
四次挥手:
1.客户端发送一个FIN,用来关闭客户到服务器的数据传送
2.服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1
3.服务器关闭与客户端的连接,发送一个FIN给客户端
4.客户端发回ACK报文确认,并将确认序号设置为收到序号加1 -
TCP和UDP的区别?(3分)
TCP:--可靠,信息在传递的过程中不会丢失(面向连接)
UDP:--不可靠(面向数据报) -
什么是黏包?(2分)
当多条消息发送时接受了一条或者出现接收不准确的情况
粘包现象的发生其本质还是数据与数据之间没有边界 -
什么 B/S 和 C/S 架构?(2分)
B/S 浏览器/服务器模式
C/S 客户端/服务器模式 -
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
server 端
import socket
sk=socket.socket
sk.bind(('127.0.0.1',9013))
sk.listen()
conn,addr=sk.accept()
msg=conn.recv(1024).decode('utf-8')#接收客户端发送的消息
print(msg)
conn.send('内容'.encode('utf-8'))#向客户端发送消息
conn.close()
sk.close()
client 端
import socket
sk=socket.socket
sk.connect(('127.0.0.1',9013))
dbg=input('请输入内容: ')
sk.send(dbg.encode('utf-8'))#向服务器发送消息
msg=sk.recv(1024)
print(msg)
sk.close() -
简述进程、线程、协程的区别?(3分)
进程,线程,协程都可以提高并发
进程是计算机中分配资源的最小单位,线程是计算机中cpu调度的最小单位,协程,又称为'微线程'。是基于代码人为创造出来的,而进程和线程是计算机中真实存在的
一个进程中可以有多个线程/一个线程中可以创建多个线程
计算密集型 多进程
IO密集型 多线程/协程+IO切换
单纯的协程没办法提高并发,只是代码之间的来回切换,加上IO自动切换才有意义,有IO操作用协程 -
什么是GIL锁?(2分)
全局解释器锁
由于全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码 -
进程之间如何进行通信?(2分)
通过队列和管道
-
Python如何使用线程池、进程池?(2分)
#创建线程池
pool=ThreadPoolExecutor(10)
for i in range(100):
pool.submit(task,i,1)
print('END')
#创建进程池
pool = ProcessPoolExecutor(10)
for i in range(20):
pool.submit(task,i,1)#(这里的submit相当于pool=Process(target=task,args=(i,1))---->
--->pool.start())
print('END') -
请通过yield关键字实现一个协程? (2分)
def consumer():
r = ''
while True:
n = yield r
if not n:
return
print('[消费者] 正在消费:{0}'.format(n))
r = '200 人民币'
def produce(c):
c.send(None)
n = 0
while n < 5:
n = n + 1
print('[生产者] 正在生产:{0}'.format(n))
r = c.send(n)
print('[生产者] 消费者返回:{0}'.format(r))
print('----------------')
c.close()
c = consumer()#构造一个生成器
produce(c) -
什么是异步非阻塞? (2分)
一个程序在执行中调用了另一个 但是不等待这个任务完毕就继续执行其他的,在此期间,cpu仍在工作
-
什么是死锁?如何避免?(2分)
死锁发生在当一个服务器和客户端同时试图往一个连接上写东西或同时从一个连接上读的时候
1、可以在客户端每次执行完send()后,进行一次recv()以接收服务器发来的数据
2、可以让客户端发送的数据较少,这样在buffer充满之前就可以从缓冲区读取服务器发回的数据。
3、采用多线程或其他一些方法,使客户端可以同时发送和接收。 -
程序从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
60s -
程序从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
0.0.1s -
程序从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
60s -
读程序,请确认执行到最后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()
为0 ,因为增删操作只有一条语句不会产生数据安全问题。 -
MySQL常见数据库引擎及区别?(3分)
InnoDB、MyISAM和MEMORY
InnoDB有64TB的存储限制,MyISAM和MEMORY要是具体情况而定
InnoDB和MEMORY对内存使用程度较高,MyISAM对内存使用程度较低
InnoDB插入数据的速度较低,MyISAM和MEMORY插入数据的速度较高。 -
简述事务及其特性? (3分)
是一个操作序列
原子性,一致性,隔离性,持久性 -
事务的隔离级别?(2分)
-
char和varchar的区别?(2分)
char的长度是不可变的,而varchar的长度是可变的
char的存取数度还是要比varchar要快得多 -
mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
char是一种固定长度的类型,varchar则是一种可变长度的类型
varchar(50)中50的涵义最多存放50个字符 -
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分)
insert,curdate,curtime,now,locate
field,concat -
MySQL数据库 导入、导出命令有哪些? (2分)
1.导出数据和表结构:
mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql
mysqldump -uroot -p dbname > dbname .sql
敲回车后会提示输入密码
2、只导出表结构
mysqldump -u用户名 -p密码 -d 数据库名 > 数据库名.sql
mysqldump -uroot -p -d dbname > dbname .sql -
什么是SQL注入?(2分)
SQL注入是一种注入攻击,可以执行恶意SQL语句。
-
简述left join和inner join的区别?(2分)
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行 -
SQL语句中having的作用?(2分)
对由sum和其它集合函数运算结果的输出进行限制
-
MySQL数据库中varchar和text最多能存储多少个字符?(2分)
-
MySQL的索引方式有几种?(3分)
主键索引,唯一索引,普通索引
-
什么时候索引会失效?(有索引但无法命中索引)(3分)
-
数据库优化方案?(3分)
-
什么是MySQL慢日志?(2分)
mysql的慢查询日志是msyql提供的一种日志记录,它用来记录在msyql中响应时间超过阀值的语句
-
设计表,关系如下: 教师, 班级, 学生, 科室。(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 -