2020-10-02

一、线程和进程的区别和联系

1:线程定义
线程程序执行的最小单位。线程是进程的基本执行单元,一个进程的所有任务都在线程中执行
进程要想执行任务,必须得有线程,进程至少要有一条线程
程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程
2:进程定义
进程是系统进行资源分配和调度的基本单位。指在系统中正在运行的一个应用程序
每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存
3:进程与线程的区别
地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程是处理器调度的基本单位,但是进程不是。

二、I/O多路复用
你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。 这种就是IO复用模型,Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。
select poll
select和poll都需要在返回后遍历文件描述符来获取已经就绪的socket,描述符越多效率越低,两者异同为select有最大数量限制,poll没有,但是数量过大都会影响性能(遍历文件描述符)
select使用3个位图表示三种文件描述符,poll使用一个pollfd完成
epoll
epoll是select和poll的增强版,epoll通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知(不再需要遍历文件描述符,通过监听回调的机制,也是epoll的魅力)

epoll相比于select和poll的高效在于以下事实

同时连接的大量客户端在同一时刻可能只有很少处于就绪状态

如果同时处于就绪状态的客户端连接很多,那epoll相比select和poll也没什么优势了
三、Django和Flask的区别
Django走的是大而全的方向,开发效率高。它的MTV框架,自带ORM,admin后台管理,自带的sqlite数据库和开发测试用的服务器,给开发者提高了开发效率。重量级的web框架,功能齐全,提供一站式的解决思路,能让开发者不用在选择上花费大量的时间。
自带ORM和模板引擎,支持jinja等非官方模板引擎。自带ORM使Django和关系型数据库耦合度高,如果要使用非关系型数据库,需要使用第三方库。自带数据库管理app。成熟稳定,开发效率高,相对于Flask,Django的整体封闭性比较好,适合做企业级网站的开发。python web框架的先驱,第三方库丰富。
Flask是轻量级的框架,自由灵活,可扩展性,核心基于Werkzeug WSGI工具和jinja2模板引擎
适合做小网站以及web服务的API,开发大型网站无压力,但是架构需要自己设计。
与关系型数据库的结合不弱于Django,而与非关系型数据库的结合远远优于Django。
WSGI:web服务器网关接口,是一套协议。用于接收用户请求并将请求进行初次封装,然后将请求交给web框架。
实现wsgi协议的模块:wsgiref本质上就是编写——socket服务端,用于接受用户请求(django)
werkzeug,本质上就是编写一个sock服务端,用于接收用户请求(django)
uwsgi:与WSGI一样是一种通信协议,它是uWSGI服务器的独占协议,用于定义传输信息的类型。
**uWSGI:**是一个web服务器,实现了WSGI的协议,uWSGI协议,http协议。
四、CORS和CSRF的区别?
CORS是一个W3C标准,全称是“跨域资源共享”(Cross-origin resoure sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了Ajax只能同源使用的限制。
CSRF主流防御方式是在后端生产表单的时候生成一串随机tocken,内置到表单里成为一个字段,同时,将此串tocken置入session中。每次表单提交到后端时都会检查这两个值是否一致,以此来判断此次表单提交是否可信,提交过一次之后,如果这个页面没有生成CSRF tocken,那么tocken将会被清空。如果有新的需求,那么tocken会被更新。攻击者可以伪造POST表单提交,但是他没有后端生成的内置于表单的tocken,session中没有tocken都无济于事。
nginx 是一个开源的高性能的HTTP服务器和反向代理:
1.作为web服务器,它处理静态文件和索引文件效果非常高;
2.它的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间;
3.稳定性高,配置简洁;
4.强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用。
五、ORM模糊查询
column__exact =‘开发’ 相当于like”开发“
column__iexact =‘开发’ 忽略大小写
column__contains =‘开发’ 模糊匹配 相当于like”%开发%“
六、cookie和session的区别
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
七、浅拷贝和深拷贝
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。
浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。

深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
八、解决哈希冲突的方法一般有:开放寻址法、链地址法(拉链法)、再哈希法和建立公共溢出区等方法
九、ARP协议:地址解析协议
所属层:ARP是介于网络层和数据链路层中间的一种协议。
ARP作用:已知一台主机或者路由器的IP地址,如何知道它的硬件地址?這个时候就需要ARP完成一定的工作。
1.先在ARP高速缓存(在计算机里面)中有没有目的地的硬件地址,如果有就直接按地址发送。
2.如果查不到,ARP进程在本局域网广播(mac帧的目标地址是全F(12个F))一个ARP请求分组,主要内容是:“我的IP地址是209.0.0.5,我的硬件地址是00-00-C0-15-AD-18,我要找IP地址为209.0.0.7的主机硬件地址”。
3.局域网中的所有的主机都能收到这个ARP请求,如果一个主机发现ARP要查的硬件地址与本机一致,就接受然后把自己的硬件写入ARP分组然后给请求的主机发送回去,这叫响应分组,内容是“我的IP地址是209.0.0.7 ,我的硬件地址是08-00-2B-00-EE-0A”那么其他主机在收到这个消息之后都不予以理睬。
4.发送方收到回应之后,就在发送主机的ARP高速缓存中写入B主机的IP地址和硬件地址的一份映射。
RARP反向地址转换协议
1.发送主机发送一个本地的RARP广播,在此广播包中,声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址;
本地网段上的RARP服务器收到此请求后,检查其RARP列表,查找该MAC地址对应的IP地址;
2.如果存在,RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用;
3.如果不存在,RARP服务器对此不做任何的响应;
4.源主机收到从RARP服务器的响应信息,就利用得到的IP地址进行通讯;如果一直没有收到RARP服务器的响应信息,表示初始化失败。
重点:
ARP请求分组是在局域网中以广播形式发送的,ARP响应分组是在局域网中普通的单播回复(一对一)
为什么要有ARP高速缓存? AB主机之间在一次通信之后可能多次通信,這样每次通信之前可节省广播所耗费的资源,不然每次ARP一次都需要广播一次。
为什么ARP高速缓存中的映射是有生存时间的? AB通信一段时间之后,有可能B主机的网卡换了,那么A查表发送就有可能找不到那个地址了,所以需要定期的删除映射。
重点记住:ARP只能解决同一个局域网上的主机或者路由器的IP地址和硬件地址的映射问题。(路由器可以隔绝广播)
十、数组和链表的区别?

不同:链表是链式的存储结构;数组是顺序的存储结构。
链表通过指针来连接元素与元素,数组则是把所有元素按次序依次存储。
链表的插入删除元素相对数组较为简单,不需要移动元素,且较为容易实现长度扩充,但是寻找某个元素较为困难;
数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。
相同:两种结构均可实现数据的顺序存储,构造出来的模型呈线性结构。
查询的时间复杂度
数组:随机访问性强,查找速度快,时间复杂度为O(1)
链表:查找数据时效率低,时间复杂度为O(N)
插入的时间复杂度
链表:.给定位置,时间复杂度为O(1) ,否则为O(N)
数组:头插和头删的效率低,时间复杂度为O(N)
十一、OSI七层模型
应用层
网络服务与最终用户的一个接口。
协议有:HTTP FTP TFTP SMTP SNMP DNS TELNET HTTPS POP3 DHCP
表示层
数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
格式有,JPEG、ASCll、EBCDIC、加密格式等 [2]
会话层
建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
对应主机进程,指本地主机与远程主机正在进行的会话
传输层
定义传输数据的协议端口号,以及流控和差错校验。
协议有:TCP UDP,数据包一旦离开网卡即进入网络传输层
网络层
进行逻辑地址寻址,实现不同网络之间的路径选择。
协议有:ICMP IGMP IP(IPV4 IPV6)
数据链路层
建立逻辑连接、进行硬件地址寻址、差错校验 [3] 等功能。(由底层网络定义协议)
将比特组合成字节进而组合成帧,用MAC地址访问介质,错误发现但不能纠正。
物理层
建立、维护、断开物理连接。(由底层网络定义协议)
TCP/IP 层级模型结构,应用层之间的协议通过逐级调用传输层(Transport layer)、网络层(Network Layer)和物理数据链路层(Physical Data Link)而可以实现应用层的应用程序通信互联。
应用层需要关心应用程序的逻辑细节,而不是数据在网络中的传输活动。应用层其下三层则处理真正的通信细节。在 Internet 整个发展过程中的所有思想和着重点都以一种称为 RFC(Request For Comments)的文档格式存在。针对每一种特定的 TCP/IP 应用,有相应的 RFC [4] 文档。
一些典型的 TCP/IP 应用有 FTP、Telnet、SMTP、SNTP、REXEC、TFTP、LPD、SNMP、NFS、INETD 等。RFC 使一些基本相同的 TCP/IP 应用程序实现了标准化,从而使得不同厂家开发的应用程序可以互相通信。
十二、TCP/UDP/HTTP的区别和联系
1、TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。
TCP采用的最基本的可靠性技术是:确认与超时重传机制、流量控制机制;
TCP和UDP的不同

  1. 是否需要建立连接。
    UDP在传送数据之前不需要先建立连接;TCP则提供面向连接的服务;
  2. 是否需要给出确认
    对方的传输层在收到UDP报文后,不需要给出任何确认,而 TCP需要给出确认报文,要提供可靠的、面向连接的传输服务。虽然UDP不提供可靠交付,但在某些情况下UDP是一种最有效的工作方式;
    3.TCP面向字节流,UDP面向报文
    状态码表示响应类型
    1×× 保留
    2×× 表示请求成功地接收
    3×× 为完成请求客户需进一步细化请求
    4×× 客户错误
    5×× 服务器错误

十四、redis的五种数据结构
关于Redis
redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。它支持包括String、List、Set、Zset、hash五种数据结构。除此之外,通过复制、持久化和客户端分片等特性,用户可以很方便地将redis扩展成一个能够包含数百GB数据和每秒处理上百万次的请求的系统。目前支持多种语言的api,方便用户使用。

redis同时也内置了事务、LUA脚本、复制等功能,提供两种持久化选项,一种是每隔一段时间将数据导入到磁盘(快照模式)另一种是追加命令到日志中(AOF模式)。如果只是作为高效的内存数据库使用也可以关闭持久化功能。通过哨兵(sentinel)和自动分区(Cuuster)的方式可以提高redis服务器的高可用性。

与关系型数据库相比,redis的命令请求不需要经过查询分析器或查询优化器进行处理,也避免了更新数据时引起的随机读\写,这些慢操作。它直接读写内存中的数据,并且数据是按照一定的数据结构存储的。所以它的速度非常快。
Redis为什么这么快
1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);

2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;

3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

4、使用多路I/O复用模型,非阻塞IO;

5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值