数据结构基本概念html
- 数据:数据即信息的载体,是可以输入到计算机中而且能被计算机识别,存储和处理的符号总称
- 数据元素:数据元素是数据的基本单位,又称之为记录。通常,数据元素由若干基本项(字段,域,属性)组成。
- 数据结构:数据结构指的是数据元素及数据元素之间的相互关系,或组织数据的形式
数据之间的结构关系java
- 逻辑结构
- 表示数据之间的抽象关系(邻接关系,从属关系),按每一个元素可能具备的直接前驱数和直接后继数将逻辑结构分为‘线性结构’和‘非线性结构’两大类
- 特色:
- 只是描述数据结构中数据元素直接的练习规律
- 是从具体问题中抽象出来的数学模型,是独立于计算机存储器的(与机器无关)
- 分类
- 线性结构:线性结构是N个数据元素的有序集合
- 树形结构:数据元素之间存在着”一对多“的树形关系的数据结构
- 图状结构:一种多对多的关系
- 其余结构
- 存储结构
- 逻辑结构再计算机中的具体实现方式,分为顺序存储方法,连接存储方法,索引存储方法,散列存储方法
- 特色
- 是数据的逻辑结构在计算机存储器中的映象
- 存储结构是经过计算机程序来实现的,于是是依赖于具体的计算机语言的
- 分类
- 顺序存储:将数据结构中各元素按照其逻辑顺序存放于存储器一片连续的存储空间中
- 链式存储:将数据结构中各元素分布到存储器的不一样点,用记录下一个结点位置的方式创建他们之间的联系,由此获得的存储结构为链式存储结构
- 索引存储:在存储数据的同时,创建一个附加的索引表,即索引存储结构=数据文件+索引表
- 散列存储:根据数据元素的特殊字段(称为关键字key),计算数据元素的存放地址,而后数据元素按地段存放,所获得的存储结构为散列存储结构
线性表python
- 线性表的顺序存储
- 定义:若将线性表中的各元素一次存储于计算机一片连续的存储空间,这种进制表示为线性的顺序存储结构
- 特色
- 逻辑上相邻的元素ai,ai+1,其存储位置也是相邻的
- 存储密度高,方便对数据的遍历查找
- 对表的插入和删除等运算的效率较差
- 线性表的链式存储
- 定义:将线性表中各元素分布再存储器的不一样存储块,称为结点,每一个结点(尾结点除外)中都持有一个指向下一个节点的引用,这样所获得的存储结构为链表结构
- 特色:
- 逻辑上相邻的元素,其存储位置也不必定相邻
- 存储稀疏,没必要开辟整块存储空间
- 对表的插入和删除等运算的效率较高
- 逻辑结构复杂,不利于遍历
栈和队列编程
- 栈
- 定义:栈是限制再一段进行插入操做和删除操做的线性表,容许进行操做的一端称为栈顶,另外固定一段为栈底,当栈中没有元素时成为空栈
- 特色
- 栈只能在一端进行数据操做
- 栈模型具备后进先出的规律
- 队列
- 定义:队列是如今再两端进行插操做和删除操做的线性表,容许进行存入操做的一段称为队尾,容许进行删除操做的一段称为队头
- 特色
- 队列只能在队头和队尾进行数据操做
- 线模型具备先进先出的规律
树形结构浏览器
基础概念:有且只有一个根,其他结点分为互不相交的有限集合,并称为其根的子树服务器
二叉树的遍历:沿着条搜索路径周游二叉树,再树中的每个节点访问一次且仅访问一次网络
-
- 先序遍历:先访问树根,再访问左子树,最后访问右子树(根,左,右)
- 中序遍历:先访问左子树,再访问根,最后右子树(左,根,右)
- 后序遍历:先访问左子树,再访问右子树,最后访问根(左,右,根)
- 层次遍历:从根节点开始,组层从左向右进行遍历
递归思想和实践数据结构
递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数多线程
递归函数调用的执行过程的两个阶段并发
-
- 递推阶段:从原问题出发,按递归公式递推从未知到已知,最终大刀递归终止条件
- 回归阶段:按递归终止条件求出结果,逆向逐步带入递归公式,回归到原问题求解
优缺点
-
- 优势:递归能够吧问题简单化,让思路更为清晰,代码更简洁
- 缺点:递归因系统环境影响大,当递归深度太大时,可能会获得不可预知的结果
排序和查找
排序:将无序的记录序列调整成有序的序列
常见的排序方法:
查找:是在给定信息集上寻找特色信息元素的过程
二分查找:当数据量很大适宜采用该方法,采用二分法查找时,数据须要是排好序的
网络编程基础
计算机网络功能主要是包括实现资源共享,实现数据信息的快速传递
OSI七层模型
做用:使网络通讯工做流程标准化
优势:
- 创建了统一的工做流程
- 分部清晰,各司其职,每一个步骤分工明确
- 下降了各个模块直接的耦合度,便于开发
- 应用层:提供用户服务,具体功能有应用程序实现
- 表示层:数据的压缩优化加密
- 会话层:创建用户级的链接,选择适当的传输服务
- 传输层:提供传输服务
- 网络层:路由选择,网络互联
- 链路层:进行数据交换,控制具体数据的发送
- 物理层:提供数据传输的硬件保证,网卡接口,传输介质
四层模型(TCP/IP模型)
背景:实际工做中工程师没法彻底按照七层模型要求操做,逐渐演化为更符合实际状况的四层
- 应用层对应协议:TFTP,FTP,NPS,WAIS | Telnet ,Rlogin,SNMP,Gopher | SMTP,DNS
- 传输层对应协议:TCP,UDP
- 网际层对应协议:IP ,ICMP,RARP,AKP,UUCP
- 网络接口对应协议:PDDI,PDN.......
数据传输过程
- 发送端由应用层程序发送消息,逐层添加首部信息,最终在物理层发送消息包
- 发送的消息通过对个节点(交换机,路由器)传输,最终到达目标主机
- 目标主机由物理层逐层解析首部消息包,最终到应用程序呈现消息
网路协议
在网路数据传输中,都遵循的规定,包括创建声明样的数据结构,什么样的特殊标志等
网路基础概念
- 网路主机(host):标识一台主机再网络中的位置
- IP地址:肯定一台主机的网络路由位置
- 域名:给网络服务器地址起的名字,方便记忆,表达必定含义
- 端口号(port):端口是网络地址的一部分,用于区分主机上不一样的网络应用程序
传输层服务
- 面向链接的传输服务(基于tcp协议)
- 传输特征:提供了可靠的数据传输,可靠性指数据传输过程当中无丢失,无失序,无差错,无重复
- 实现手段:在通信前须要创建数据链接,通信结束要正常断开链接
- 三次握手(创建链接)
- 客户端向服务器发送消息报文请求链接
- 服务器收到请求后,回复报文肯定能够链接
- 客户端收到回复,发送最终报文链接创建
- 四次挥手(断开链接)
- 主动方发送报文请求断开链接
- 被动方收到请求后,当即回复,表示准备断开
- 被动方准备就绪,再次发送报文表示能够断开
- 主动方收到肯定,发送最终报文完成断开
- 面向无链接的传输服务(基于UDP协议)
- 传输特色:不保证传输的可靠性,传输过程没有链接和断开,数据收发自由随意
- 适用状况:网络较差,对传输可靠性要求不高
socket套接字编程
套接字:实现网络编程进行数据传输的一种技术手段
套接字分类:
-
- 流式套接字:以字节流方式传输数据,实现tcp网络传输方案(面向链接--tcp协议--可靠的--流式套接字)
- tcp套接字服务端流程
- 建立套接字:sockfd=socket.socket(socket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)
- 绑定地址:sockfd.bind(addr)
- 设置监听:sockfd.listen(n)
- 等待处理客户端链接请求:connfd,addr = sockfd.accept()
- 消息收发:data = connfd.recv(buffersize),n = connfd.send(data)
- 关闭套接字:sockfd.close()
- 客户端流程
- 建立套接字:注意:只有相同类型的套接字才能进行通讯
- 请求链接:sockfd.connect(server_addr)
- 收发消息:注意: 防止两端都阻塞,recv send要配合
- 关闭套接字
- tcp套接字数据传输特色
- tcp链接中当一端退出,另外一端若是阻塞在recv,此时recv会当即返回一个空字串。
- tcp链接中若是一端已经不存在,让然试图经过send发送则会产生BrokenPipeError
- 一个监听套接字能够同时链接多个客户端,也可以重复被链接
- 网络收发缓冲区
- 网络缓冲区有效的协调了消息的收发速度
- send和recv实际是向缓冲区发送接收消息,当缓冲区不为空recv就不会阻塞。
- tcp粘包
- 缘由:tcp以字节流方式传输,没有消息边界。屡次发送的消息被一次接收,此时就会造成粘包。
- 影响:若是每次发送内容是一个独立的含义,须要接收端独立解析此时粘包会有影响。
- 处理方法:1.人为的添加消息边界 2.控制发送速度
- 数据报套接字:以数据报方式传输数据,实现UDP网络传输方案
- UDP套接字服务端流程:
- 建立数据报套接字:sockfd = socket(AF_INET,SOCK_DGRAM)
- 绑定地址:sockfd.bind(addr)
- 消息收发:data,addr = sockfd.recvfrom(buffersize),n = sockfd.sendto(data,addr)
- 关闭套接字:sockfd.close()
- 客户端流程:
- 建立套接字
- 收发消息
- 关闭套接字
- tcp套接字和udp套接字编程区别
-
- 流式套接字是以字节流方式传输数据,数据报套接字以数据报形式传输
- tcp套接字会有粘包,udp套接字有消息边界不会粘包
- tcp套接字保证消息的完整性,udp套接字则不能
- tcp套接字依赖listen accept创建链接才能收发消息,udp套接字则不须要
- tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom
TCP套接字之HTTP传输
HTTP协议(超文本传输协议)
- 用途:网页获取,数据传输
- 特色:
- 应用层协议,传输层使用tcp传输
- 简单,灵活,不少语言都有HTTP专门接口
- 无状态,协议不记录传输内容
- http1.1支持持久链接,丰富了请求类型网页请求过程
- 网页请求过程
- 客户端(浏览器)经过tcp传输,发送http请求给服务端
- 服务端接收到http请求后进行解析
- 服务端处理请求内容,组织响应内容
- 服务端将响应内容以http响应格式发送给浏览器
- 浏览器接收到响应内容,解析展现
HTTP请求
请求行:具体的请求类别和请求内容 GET (请求类别) /(请求内容) HTTP/1.1(协议版本)
请求类别:每一个请求内别表示要作不一样的事情
-
- GET:获取网络资源
- POST:提交必定的信息,获得反馈
- HEAD:只获取网络资源的响应头
- PUT:更新服务器资源
- DELETE:删除服务器资源
- CONNECT
- TRACE:测试
- OPTIONS:获取服务器性能信息
请求头:对请求的进一步解释和描述
空行
请求体:请求参数或者提交内容
HTTP响应
响应格式:响应行,响应头,空行,响应体
响应行:反馈基本响应状况 HTTP/1.1(版本信息) 200(响应码) OK(附加信息)
响应码:
-
- 1xx:提示信息,表示请求被接收
- 2xx:响应成功
- 3xx:响应须要进一步操做,重定向
- 4xx:客户端错误
- 5xx:服务器错误
响应头:对响应内容的描述 Content-Type:text/html
响应体:响应的主体内容信息
多任务编程
意义:充分利用计算机多核资源,提升程序的容许效率
实现方案:多线程,多进程
并行与并发
- 并发:同时处理多个任务,内核再任务间不断的切换达到好像多个任务被同事执行的效果,实际每一个时刻只有一个任务占有内核
- 并行:多个任务利用计算机多核资源在同时执行,此时多个任务间为并行关系
进程
定义:程序在计算机中的一次运行
-
- 程序是一个可执行的文件,是静态的占有磁盘
- 进程是一个动态的过程描述,占有计算机运行资源,有必定的生命周期
进程的基本概念:
-
- CPU时间片:若是一个进程占有cpu内核则称这个进程在cpu时间片上
- PCB(进程控制块):在内存中开辟的一块空间,用于存放进程的基本信息,也用于系统查找识别进程
- 进程ID(PID):系统为每一个进程分配的一个大于0的整数,做为进程ID,每一个进程ID不重复。Linux查看进程ID:ps-aux
- 父子进程:系统中每个进程(除了系统初始化进程)都有惟一的父进程,能够有0个或多个子进程,父子进程关系便于进程管理
- 进程状态(三态)
- 就绪态:进程具有执行条件,等待分配cpu资源
- 运行态:进程占有cpu时间片正在运行
- 等待态:进程暂时中止运行,让出cpu
- 五态(在三态基础上增长新建和终止)
- 新建:建立一个进程,获取资源的过程
- 终止:进程接收,释放资源的过程
- 进程的运行特征:
- 进程可使用计算机多核资源
- 进程是计算机分配资源的最小单位
- 进程之间的容许状态互不影响,各自独立
- 每一个进程拥有独立的空间,各自使用本身空间资源
- 基于fork的多进程编程
- 孤儿和僵尸
- 孤儿进程:父进程先于子进程退出,此时子进程成为孤儿进程
- 特色:孤儿进程会被系统进程收养,此时系统进程就会成为孤儿进程新的父进程,孤儿进程退出该进程会自动处理
- 僵尸进程:子进程先于父进程退出,父进程又没有处理子进程的退出状态,此时子进程就会成为僵尸进程
- 特色:僵尸进程虽然结束,可是会存留部分PCB再内存中,大量的僵尸进程会浪费系统的内存资源
- 如何避免僵尸进程产生
- 使用wait函数处理子进程退出
- 建立二级子进程处理僵尸
- 经过信号处理子进程退出
- multiprocessing模块建立进程
- 将须要子进程执行的事件封装为函数
- 经过模块的Process类建立进程对象,关联函数
- 能够经过进程对象设置进程信息及属性
- 经过进程对象调用start启动进程
- 经过进程对象调用join回收进程
- 进程池实现
- 进程的建立和销毁过程消耗的资源较多
- 当任务量众多,每一个任务在很短期内完成时,须要频繁的建立和销毁进程。此时对计算机压力较大
- 进程池技术很好的解决了以上问题
- 原理:
- 建立一个数量的进程来处理事件,事件处理完进程不退出而是继续处理其余事件,直到全部事件全都处理完毕统一销毁,增长进程的重复利用,下降资源消耗
- 建立进程池的步骤
- 建立进程池对象,放入适当的进程
- 将事件加入进程池队列执行
- 关闭进程池
- 回收进程池中进程
- 进程间通信(IPC)
- 必要性:进程间空间独立,资源不共享,此时在须要进程间数据传输时就须要特定的手段进行数据通讯
- 常见进程键通讯方法
- 管道(Pipe):在内存中开辟管道空间,生成管道操做对象,多个进程使用同一个管道对象进行读写便可实现通讯
- 消息队列:在内存中创建队列模型,进程经过队列将消息存入,或者从队列取出完成进程间通讯
- 共享内存:在内存中开辟一块空间,进程能够写入内容和读取内容完成通讯,单是每次写入内容会覆盖以前内容
- 本地套接字:用于本地两个程序之间进行数据的收发
- 套接字文件:用于本地套接字之间通讯时,进行数据传输的介质
- 建立流程
- 建立本地套接字:sockfd = socket(AF_UNIX,SOCK_STREAM)
- 绑定本地套接字文件:sockfd.bind(file)
- 监听,接收客户端链接,消息收发:isten()-->accept()-->recv(),send()
- 信号量:给定一个数量对多个进程可见,多个进程均可以操做该数量增减,并根据数量值决定本身的行为
线程(Thread)
线程基本概念
-
- 线程被成为轻量级的进程
- 线程也可使用计算机多核资源,是多任务编程方式
- 线程是系统分配内核的最小单元
- 线程能够理解为进程的分钟任务
- 一个进程中能够包含多个线程
- 线程也是一个运行行为,消耗计算级内存
- 一个进程中的全部线程共享这个进程的资源
- 多个线程之间的运行互不影响各自运行
- 线程的建立和销毁消耗资源小于进程
- 各个线程也有本身的ID特征
- 建立线程对象:t = Thread()
- 启动线程:t.start()
- 回收线程:t.join([timeout])
同步互斥
-
- 线程间通讯方法:线程间使用全局变量进行通讯
- 共享资源争夺
- 共享资源:多个进程或者线程均可以操做的资源成为共享资源,对贡献资源的操做代码段成为临界区
- 影响:对共享资源的无序操做可能会带来数据的混乱,或者操做错误,此时每每须要同步互斥机制协调操做顺序
- 同步互斥机制
- 同步:同步是一种协做关系,为完成操做,多进程或者线程间造成一种协调,按照必要的步骤有序执行操做
- 互斥:互斥是一组制约关系,当一个进程或者线程占有资源时会进行加锁处理,此时其余进程线程就没法操做该资源,直到解锁后才能操做
- 线程同步互斥方法
- 死锁
- 定义:死锁是指两个或两个以上的线程在执行过程当中,因为竞争资源或者因为彼此通讯而形成的一组阻塞的现象,若无外力做用,它们都将没法推动下去。此时称系统处于死锁状态或系统产生了死锁
- 死锁产生的缘由
- 当前线程拥有其余线程须要的资源
- 当前线程等待其余线程已拥有的资源
- 都不放弃本身拥有的资源
- 如何避免死锁
- 使用定时锁
- 使用重入锁RLock(),用法同Lock,RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源能够被屡次require。直到一个线程全部的acquire都被release,其它的线程才能得到资源
- python线程GIL
- python线程的GIL问题(全局解释器锁)
- 什么是GIL:因为python解释器设计中加入了解释器锁,致使python解释器同一时刻只能解释执行一个线程,大大下降了线程的执行效率
- 致使后果:由于遇到阻塞时线程会主动让出解释器,去接收其余线程,因此python多线程在执行多阻塞高延迟IO时能够提高程序效率,其余状况并不能对效率有所提高
- GIL问题建议
- 尽可能使用进程完成无阻塞的并发行为
- 不适用c做为解释器(java C#)
- 结论:在无阻塞状态下,多线程程序和单线程程序执行效率几乎差很少,甚至还不如单线程效率。可是多进程运行相同内容却能够有明显的效率提高
进程和线程的区别联系
- 二者都是多任务编程方式,都能使用计算机多核资源
- 进程的建立删除消耗的计算机资源比线程多
- 进程空间单独,数据互不干扰,有专门通讯方法,线程使用全局变量通讯
- 一个进程能够有多个分支线程,二者有包含关系
- 多个线程共享进程资源,在共享资源操做时每每须要同步互斥处理
- 进程线程再系统中都有本身的特有属性标志,如ID,代码段,命令集
协程技术
- 定义:纤程,微线程。是为非抢占式多任务产生子程序的计算机组件,协程容许不一样入口点再不一样位置暂停或开始,简单来讲,协程就是能够暂停执行的函数
- 协程原理:记录一个函数的上下文栈帧,协程调度切换时会将记录的上下文保存,再切换回来时进行调取,恢复原有的执行内容,以便从上一次执行位置继续执行
- 协程优缺点
- 协程完成多任务占用计算资源不多
- 因为协程的多任务切换再应用层完成,所以切换开销少
- 协程为单线程程序,无需进行共享资源同步互斥处理
- 缺点:协程的本质是一个单线程,没法利用计算机多核资源