假期面试题03(10道题)

1.写一个简单的python socket编程
服务端:
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
import socket
ip_port=('127.0.0.1',9000)  #电话卡
BUFSIZE=1024                #收发消息的尺寸
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机
s.bind(ip_port) #手机插卡
s.listen(5)     #手机待机


conn,addr=s.accept()            #手机接电话
# print(conn)
# print(addr)
print('接到来自%s的电话' %addr[0])

msg=conn.recv(BUFSIZE)             #听消息,听话
print(msg,type(msg))

conn.send(msg.upper())          #发消息,说话

conn.close()                    #挂电话

s.close()                       #手机关机

客户端
#_*_coding:utf-8_*_
__author__ = 'Linhaifeng'
import socket
ip_port=('127.0.0.1',9000)
BUFSIZE=1024
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect_ex(ip_port)           #拨电话

s.send('linhaifeng nb'.encode('utf-8'))         #发消息,说话(只能发送字节类型)

feedback=s.recv(BUFSIZE)                           #收消息,听话
print(feedback.decode('utf-8'))

s.close()                                       #挂电话
2.简述python上下文管理器原理,并用上下文管理器简单实现将“hello world”写入文件的功能
看代码是最好的学习方式,来看看我们通常是如何打开一个文件并写入”Hello World”?


filename = 'my_file.txt'
mode = 'w' # Mode that allows to write to the file
writer = open(filename, mode)
writer.write('Hello ')
writer.write('World')
writer.close()
1
2
3
4
5
6
filename = 'my_file.txt'
mode = 'w' # Mode that allows to write to the file
writer = open(filename, mode)
writer.write('Hello ')
writer.write('World')
writer.close()
1-2行,我们指明文件名以及打开方式(写入)。

第3行,打开文件,4-5行写入“Hello world”,第6行关闭文件。

这样不就行了,为什么还需要上下文管理器?但是我们忽略了一个很小但是很重要的细节:如果我们没有机会到达第6行关闭文件,那会怎样?

举个例子,磁盘已满,因此我们在第4行尝试写入文件时就会抛出异常,而第6行则根本没有机会执行。

当然,我们可以使用try-finally语句块来进行包装:


writer = open(filename, mode)
try:
    writer.write('Hello ')
    writer.write('World')
finally:
    writer.close()
1
2
3
4
5
6
writer = open(filename, mode)
try:
    writer.write('Hello ')
    writer.write('World')
finally:
    writer.close()
finally语句块中的代码无论try语句块中发生了什么都会执行。因此可以保证文件一定会关闭。这么做有什么问题么?当然没有,但当我们进行一些比写入“Hello world”更复杂的事情时,try-finally语句就会变得丑陋无比。例如我们要打开两个文件,一个读一个写,两个文件之间进行拷贝操作,那么通过with语句能够保证两者能够同时被关闭。

OK,让我们把事情分解一下:

首先,创建一个名为“writer”的文件变量。

然后,对writer执行一些操作。

最后,关闭writer。

这样是不是优雅多了?


with open(filename, mode) as writer:
    writer.write('Hello ') 
    writer.write('World')
1
2
3
with open(filename, mode) as writer:
    writer.write('Hello ') 
    writer.write('World')
让我们深入一点,“with”是一个新关键词,并且总是伴随着上下文管理器出现。“open(filename, mode)”曾经在之前的代码中出现。“as”是另一个关键词,它指代了从“open”函数返回的内容,并且把它赋值给了一个新的变量。“writer”是一个新的变量名。

2-3行,缩进开启一个新的代码块。在这个代码块中,我们能够对writer做任意操作。这样我们就使用了“open”上下文管理器,它保证我们的代码既优雅又安全。它出色的完成了try-finally的任务。

open函数既能够当做一个简单的函数使用,又能够作为上下文管理器。这是因为open函数返回了一个文件类型(file type)变量,而这个文件类型实现了我们之前用到的write方法,但是想要作为上下文管理器还必须实现一些特殊的方法,我会在接下来的小节中介绍。
3.简述MyLSAM和InnDB的特点
1.InnoDB存储引擎:InnoDB是事务性数据库的首选引擎
    InnoDB的特性有:
        1.InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的食物安全(ACID)存储引擎
        2.InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于其他磁盘的关系型数据库引擎所不能匹敌的。
        3.InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
        4.InnoDB支持外键的完整性约束,存储数据时,每张表都按主键的顺序存放
        5.InnoDB被用在众多需要高性能的大型数据库站点上
2.MyISAM存储引擎:MyISAM是基于ISAM存储引擎,并对其进行扩展。它在Web,数据仓库和其他应用环境下最常用的存储引擎之一。
    MyISAM的特性有:
        1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持
        2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成
        3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
        4、最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上
        5、BLOB和TEXT列可以被索引
        6、NULL被允许在索引的列中,这个值占每个键的0~1个字节
        7、所有数字键值以高字节优先被存储以允许一个更高的索引压缩
        8、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新,同时AUTO_INCREMENT列将被刷新。所以说,MyISAM类型表的AUTO_INCREMENT列更新比InnoDB类型的AUTO_INCREMENT更快
        9、可以把数据文件和索引文件放在不同目录
        10、每个字符列可以有不同的字符集
        11、有VARCHAR的表可以固定或动态记录长度
        12、VARCHAR和CHAR列可以多达64KB
        使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表名字开始,扩展名之处文件类型:frm文件存储表定义、数据文件的扩展名为.MYD(MYData)、索引文件的扩展名时.MYI(MYIndex)
4.
    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。 
    一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:
1、平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
2、单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。 
3、分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。 
4、负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
5.如何查看占用8080端口的是什么进程
    netstat –apn | grep 8080
6.DNS解析过程是怎么样的?有几种解析方法
    1) 浏览器缓存
  当用户通过浏览器访问某域名时,浏览器首先会在自己的缓存中查找是否有该域名对应的IP地址(若曾经访问过该域名且没有清空缓存便存在);
  2) 系统缓存
  当浏览器缓存中无域名对应IP则会自动检查用户计算机系统Hosts文件DNS缓存是否有该域名对应IP;
  3) 路由器缓存
  当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,以上三步均为客服端的DNS缓存;
  4) ISP(互联网服务提供商)DNS缓存
  当在用户客服端查找不到域名对应IP地址,则将进入ISP DNS缓存中进行查询。比如你用的是电信的网络,则会进入电信的DNS缓存服务器中进行查找;
  5) 根域名服务器
  当以上均未完成,则进入根服务器进行查询。全球仅有13台根域名服务器,1个主根域名服务器,其余12为辅根域名服务器。
    根域名收到请求后会查看区域文件记录,若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器;
  6) 顶级域名服务器
  顶级域名服务器收到请求后查看区域文件记录,若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器;
  7) 主域名服务器
  主域名服务器接受到请求后查询自己的缓存,如果没有则进入下一级域名服务器进行查找,并重复该步骤直至找到正确纪录;
  8)保存结果至缓存
  本地域名服务器把返回的结果保存到缓存,以备下一次使用,同时将该结果反馈给客户端,客户端通过这个IP地址与web服务器建立链接。
    1.递归查询: 
    一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结果后转交给客户机; 
    2.迭代查询(反复查询): 
    一般DNS服务器之间属迭代查询,如:若DNS2不能响应DNS1的请求,则它会将DNS3的IP给DNS2,以便其再向DNS3发出请求;
7.\tmp独立挂载在一个分区上,现发现其磁盘空间满了小文件过多,现在请用命令删除所有文件
  umount /temp
  fidsk /temp  -m -d 1 -w
8.TCP建立连接三次握手,断开连接四次挥手的过程是怎样的?
  三次握手:
   (1)主机A向主机B发送TCP连接请求数据包,其中包含主机A的初始序列号seq(A)=x。
     (其中报文中同步标志位SYN=1,ACK=0,表示这是一个TCP连接请求数据报文:序号seq=x,表明传输数据时的第一个数据字节的序号是x);
   (2)主机B收到请求后,会发回连接确认数据包。
    (其中确认报文段中,标识位SYN=1,ACK=1,表示这是一个TCP连接响应数据报文,并含主机B的初始序列号seq(B)=y,以及主机B对主机A初始序列号的确认号ack(B)=seq(A)+1=x+1)
   (3)第三次,主机A收到主机B的确认报文后,还需作出确认,即发送一个序列号seq(A)=x+1;确认号为ack(A)=y+1的报文;
   四次握手:
    假设主机A为客户端,主机B为服务器,其释放TCP连接的过程如下:
    (1)关闭客户端到服务器的连接:首先客户端A发送一个FIN,用来关闭客户到服务器的数据传送,然后等待服务器的确认.其中终止标志位FIN=1,序列号seq=u
   (2)服务器收到这个FIN,它发回一个ACK,确认号ack为收到的序号加1。
   (3)关闭服务器到客户端的连接:也是发送一个FIN给客户端。
   (4)客户段收到FIN后,并发回一个ACK报文确认,并将确认序号seq设置为收到序号加1.
     首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
9.写一个脚本,处理以下文本内容,将域名取出,并计数排序
https://www.baidu.com/1
https://www.baidu.com/2
https://www.baidu.com/3
https://www.qq.com/3
https://www.qq.com/1
https://www.bilibili.com/1
https://www.bilibili.com/2
https://www.bilibili.com/3
https://www.bilibili.com/4
s = '''
https://www.baidu.com/1
https://www.baidu.com/2
https://www.baidu.com/3
https://www.qq.com/3
https://www.qq.com/1
https://www.bilibili.com/1
https://www.bilibili.com/2
https://www.bilibili.com/3
https://www.bilibili.com/4
'''

import re

url_list = re.findall(r'https://(.*?)/.*?',s)
url_tuple = set(url_list)
# for url in url_tuple:
#     print(url_list.count(url),url)

from collections import Counter
dic = Counter(url_list)
li = sorted(dic.items(),key=lambda x:x[1],reverse=True)
for i in li:
    print(i[1],i[0])
    
10.Linux command:free,如下:
$free -m
     total used free shared buffers cached
 Mem: 3832 1188 2644 0 257 666
 -/+buffers/cache:264  3568
 Swap:    7999  0  7999
 请问swap,total,free,shared,buffers,cached各是什么意思?
     swap:表示硬盘上交换分区的使用情况
     total:表示系统可使用的物理内存的总量为3832
     free:表示为分配的物理内存为232
     shared:多个进程共享的内存总数
     buffers:已经被系统分配而未使用的buffer内存257
     cached:已经被分配而未使用的cache内存为666 

 

posted @ 2018-02-15 19:25  TAMAYURA  阅读(192)  评论(0编辑  收藏  举报