网编部分

第一部分 必答题

1.简述 OSI 7层模型及其作用?(2分)
为了实现计算机系统的互连,OSI参考模型把整个网络的通信功能划分为7个层次,同时也定义了层次之间的相互关系以及各层所包括的服务及每层的功能。OSI的七层由低到高依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层,下三层(物理层、数据链路层、网络层)面向数据通信,而上三层(会话层、表示层、应用层)则面向资源子网,而传输层则是七层中最为重要的一层。它位于上层和下层中间,起承上启下的作用。

2.简述 TCP三次握手、四次回收的流程。(3分)
三次握手
第一次握手:客户端的应用进程主动打开,并向客户端发出请求报文段。其首部中:SYN=1,seq=x。
第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。
第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。
四次挥手
第一次挥手:数据传输结束以后,客户端的应用进程发出连接释放报文段,并停止发送数据,其首部:FIN=1,seq=u。
服务器端收到连接释放报文段之后,发出确认报文,其首部:ack=u+1,seq=v。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。
第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。
第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。

3.TCP和UDP的区别?(3分)
TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP对系统资源要求较多,UDP对系统资源要求较少。

4.什么是黏包?(2分)
多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

5.什么 B/S 和 C/S 架构?(2分)
C/S 架构是一种典型的两层架构,其全称是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据库服务器端,客户端通过数据库连接访问服务器端的数据;另一种是Socket服务器端,服务器端的程序通过Socket与客户端的程序通信。
B/S架构的全称为Browser/Server,即浏览器/服务器结构。Browser指的是Web浏览器,极少数事务逻辑在前端实现,但主要事务逻辑在服务器端实现,Browser客户端,WebApp服务器端和DB端构成所谓的三层架构。B/S架构的系统无须特别安装,只有Web浏览器即可。

6.请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)

import socket
sk = socket.socket()
sk.bind((‘127.0.0.1’, 9000))
sk.listen()
conn,addr=sk.accept()
dic = recv(conn)
ret = get_url(dic[‘url’])
send(conn, ret)
print(ret)

sk = socket.socket()
sk.connect((‘127.0.0.1’, 9000))
url = input('url : ')
dic = {‘url’: url}
send(sk, dic)
msg = recv(sk)
print(msg)

7.简述进程、线程、协程的区别?(3分)
进程是CPU的最小分配资源
线程是资源调度最小的单位
协程不是真实存在的,按他们任务资源切换消耗小,效率高
当程序中存在大量不需要cpu的操作时,适用协程;计算密集型,用进程;IO密集型,用线程。

8.什么是GIL锁?(2分)
即全局解释器锁,一个时间点只有一个线程处于执行状态。

9.进程之间如何进行通信?(2分)

10.Python如何使用线程池、进程池?(2分)
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,time,random
from multiprocessing import Pool

def task(n):
print(’%s is runing’ %os.getpid())
time.sleep(random.randint(1,3))
return n**2

if name == ‘main’:
# 多进程方式一
pool2=Pool()
pool2.map(task,range(10))
11.请通过yield关键字实现一个协程? (2分)
def consumer():
r = ‘’
while True:
n = yield r
if n is None:
return
print(’[CONSUMER] Consuming %s…’ % n)
r = ‘200 OK’

def produce©:
c.send(None)
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()

c = consumer()
produce©

12.什么是异步非阻塞? (2分)

13.什么是死锁?如何避免?(2分)
死锁:死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
加锁顺序:线程按照一定的顺序加锁
加锁时限:线程尝试获取锁的时候加上一定的时限,超过时限,则放弃对该锁的请求,并释放自己占有的锁。
死锁检测

14.程序从flag a执行到falg b的时间大致是多少秒?(2分)

```python
import threading
import time
def _wait():
	time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(False)
t.start()
# flag b
```

60s
15.程序从flag a执行到falg b的时间大致是多少秒?(2分)

```python
import threading
import time
def _wait():
	time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(True)
t.start()
# flag b
```

1s
16.程序从flag a执行到falg b的时间大致是多少秒?(2分)

```python
import threading
import time
def _wait():
	time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.start()
t.join()
# flag b
```

1s
17.读程序,请确认执行到最后number是否一定为0(2分)

```python
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
18.读程序,请确认执行到最后number是否一定为0(2分)

```python
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()
```

不一定 ,数据共享
19.MySQL常见数据库引擎及区别?(3分)
InnoDB:用于事务处理应用程序,具有众多特性,包括ACID事务支持。(提供行级锁)
MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改STORAGE_ENGINE配置变量,能够方便地更改MySQL服务器的默认存储引擎。
Memory:将所有数据保存再RAM中

20.简述事务及其特性? (3分)
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Readuncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

21.事务的隔离级别?(2分)
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

REPEATABLE-READ(可重读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作

SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

22.char和varchar的区别?(2分)
保存方式不一样
char有固定的长度,而varchar属于可变长的字符类型
char的效率比varchar高

23.mysql中varchar与char的区别以及varchar(50)中的50代表的含义。(2分)
50个字节

24.MySQL中delete和truncate的区别?(2分)

25.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

26.组合索引遵循什么原则才能命中索引?(2分)
语句查询条件例带有第一个索引条件才会命中,也就是最左原理。

27.列举MySQL常见的函数? (3分)
ABS(x):返回x的绝对值
COUNT():返回值的个数
AVG():返回平均值
SUM():求和
MIN(): 最小值
MAX(): 最大值
时间函数 :date

28.MySQL数据库 导入、导出命令有哪些? (2分)
导出数据和表结构
mysqldump -uroot -p dbname > dbname .sql
只导出表结构
mysqldump -uroot -p -d dbname > dbname .sql
导入
mysql -u用户名 -p密码 数据库名 < 数据库名.sql

29.什么是SQL注入?(2分)
在SQL语句的拼接中,一些含特殊字符的变量在拼接时破坏了SQL语句的结构,导致"用户输入数据"意外变成了代码被执行。

30.简述left join和inner join的区别?(2分)
左连接和右连接很相似,只是左右表位置的不同罢了。
left join(左连接) 返回包括左表中的所有记录和右表中连接字段相等的记录
right join(右连接) 返回包括右表中的所有记录和左表中连接字段相等的记录

31.SQL语句中having的作用?(2分)

32.MySQL数据库中varchar和text最多能存储多少个字符?(2分)

33.MySQL的索引方式有几种?(3分)
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索

34.什么时候索引会失效?(有索引但无法命中索引)(3分)
如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
对于多列索引,不是使用的第一部分(第一个),则不会使用索引
like查询是以%开头
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
如果mysql估计使用全表扫描要比使用索引快,则不使用索引

35.数据库优化方案?(3分)
减少数据访问-创建并正确使用索引
返回更少的数据
数据分页处理
只返回需要的字段
减少交互次数
使用存储过程
优化业务逻辑
减少服务器的cpu运算
使用绑定变量
合理使用排序
减少比较操作
大量复杂运算在客户端处理
利用更多资源
客户端多进程访问
数据库并行处理

36.什么是MySQL慢日志?(2分)
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。

37.设计表,关系如下: 教师, 班级, 学生, 科室。(4分)
科室与教师为一对多关系, 教师与班级为多对多关系, 班级与学生为一对多关系, 科室中需体现层级关系。

```
1.  写出各张表的逻辑字段
2.  根据上述关系表
    a.查询教师id=1的学生数
    b.查询科室id=3的下级部门数
    c.查询所带学生最多的教师的id
```

38.有staff表,字段为主键Sid,姓名Sname,性别Sex(值为"男"或"女"),课程表Course,字段为主键Cid,课程名称Cname,关系表SC_Relation,字段为Student表主键Sid和Course表主键Cid,组成联合主键,请用SQL查询语句写出查询所有选"计算机"课程的男士的姓名。(3分)

39.根据表关系写SQL语句(10分)

<img src="day02.assets/image-20191104220302950.png" alt="image-20191104220302950" style="zoom:50%;" />

- 查询所有同学的学号、姓名、选课数、总成绩;
- 查询姓“李”的老师的个数;
- 查询平均成绩大于60分的同学的学号和平均成绩; 
- 查询有课程成绩小于60分的同学的学号、姓名
- 删除学习“叶平”老师课的score表记录;
- 查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
- 查询每门课程被选修的学生数;
- 查询出只选修了一门课程的全部学生的学号和姓名;
- 查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
- 查询两门以上不及格课程的同学的学号及其平均成绩;

第二部分 补充题

1.什么是IO多路复用?

2.async/await关键字的作用?

3.MySQL的执行计划的作用?
作用:用来进行查询分析,比如整个查询涉及多少防,使用哪些索引,运行时间等
使用方法:使用explain关键字,如explain select xxx from xxx;

4.简述MySQL触发器、函数、视图、存储过程?
触发器:触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块
函数:MySQL中提供了许多内置函数,还可以自定义函数(实现程序员需要sql逻辑处理)
视图:视图是由查询结果形成的一张虚拟表,是表通过某种运算得到的一个投影
存储过程:把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现(经过第一次编译后再次调用不需要再次编译,比一个个执行sql语句效率高)

5.数据库中有表:t_tade_date

id		tade_date
1		2018-1-2
2		2018-1-26
3		2018-2-8
4		2018-5-6
...
输出每个月最后一天的ID
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值