Linux常见命令

  • ls:查看当前路径下的所有文件及文件名;
  • clear:清空操作;
  • cd 跳转操作,可以跳转到任意路径位置;
  • cd-:跳转到上次所在的路径;
  • cd~:快速切换到当前用户的主目录(快速回家);
  • pwd:显示当前路径;
  • mkdir:创建文件夹,后面加上-p可以递归创建文件夹;
  • touch:创建一个新的文本文件;
  • rm:删除操作,删除文件或者文件夹,删除文件夹时后面要加上-r,-f为强制删除;
  • cp:拷贝操作,可以讲一个文件中的内容拷贝到另一个文件中去,如果目标文件还未创建,那么执行此操作时会创建这个文件并将原文件中的内容拷贝过去,如果需要拷贝文件夹需要加上-r;
  • mv:剪切操作,将当前文件剪切到另一个文件中去,如果目标文件不存在,视为修改原文件的文件名;
  • “>” : 输出重定向,将前面的操作的结果本应显示在终端上的内容保存在指定文件中,重定向的内容会覆盖文件的原有内容;
  • more:分屏显示,当显示内容过长无法在屏幕上显示完,需要滚动着查看,可以使用此操作;
  • cat:将过长的信息一次性显示完,具有查看文件内容和合并文件的作用;
  • | :管道,将前面的操作的输出作为后面的操作的输入;
  • In:创建链接文件;
  • ln -s 1.txt 1-s-link.txt :创建一个软链接文件;
  • 软链接文件的特点:当删除原文件名后,软链接文件此时无效,恢复原文件名后,软链接文件有效;
  • ln 1.txt 1-h-link.txt :创建一个硬链接文件
  • 硬链接文件的特点:创建一个硬链接文件,相当于给这个文件加了一个额外的引用,当删除原文件名后,硬链接文件依然有效;
  • grep:文本搜索;-v:显示所有;-n:显示行号;-i:忽略大小写;
  • find:文件搜索;
  • tar -zcvf xxx.tar.gz; *.txt:将目标文件归档并压缩;
  • tar -zxvf xxx.tar.gz:压缩包解压缩;
  • gzip:压缩;
  • gzip -d :解压缩;
  • which:查看命令所在位置;
  • who:查看当前所有登录系统的用户的信息;
  • chmod:修改权限,如果需要递归所有目录加上权限,需在命令后面加-R;
  • sudo -s:切换到管理员账号;

正则表达式

匹配单个字符

字符功能
.匹配任意一个字符,除了换行符
[ ]匹配[]内列举的字符
\d匹配任意一个0-9的数字
\D匹配非数字类型
\s匹配空白,即空格
\S匹配非空白
\w匹配单词字符(数字,字母.下划线)
\W匹配非单词字符

匹配多个字符

字符功能
+匹配前一个字符出现一次或多次
*匹配前一个字符出现0次或多次
?匹配前一个字符出现1次或0次
{m}匹配前一个字符出现m次

{m,n} 匹配前一个字符出现m次到n次

匹配开头到结尾

字符功能
^匹配开头
$匹配结尾r"[a-zA-Z0-9_][A-Za-z]*$

匹配分组

字符功能
“|”匹配左右两侧任意一个字符
()创建一个分组,可以使用ret.group(1)来指定接收分组内匹配到的结果.
\num引用分组num内的字符:r"([a-z])+\1"

re高级用法

方法功能
re.search()匹配指定的内容,区别于match,match是从头开始匹配,而search是从指定位置开始匹配.
re.findall()匹配多次,区别于search,search只能得到一个数据,而findall可以得到全部满足要求的数据.
re.sub()将匹配到的符合要求的字符进行替换
re.split按照正则表达式进行分割

贪婪与非贪婪

某些数量词总是在满足条件的情况下竟可能多的去匹配更多的字符,我们称这些数量词是贪婪的,如*,+,{m,n},使其变成非贪婪的只要在其后面加上?即可.

r

正则表达式中的r表示原生字符串,用来转义用的,可以少写一层转义字符.

UDP,TCP

UDP

USER DATAGRAM PROTOCOL:用户数据报协议

  • 如何创建一个简单的UDP程序?
  • 1.创建一个UDP套接字;
  • 2.发送/接收数据;
  • 3.关闭UDP套接字
  • UDP主要用途?
  • 用于广播程序,一对多

TCP

Transmission Control Protocol:传输控制协议

TCP客户端

  • TCP客户端如何构建?
  1. 创建一个TCP套接字
  2. 输入目的IP,PORT
  3. connect与服务器连接
  4. 向服务器发送数据,接收应答
  5. 关闭套接字
  • TCP服务器如何构建?
  1. 首先创建一个TCP套接字
  2. 绑定IP,PORT
  3. 设置套接字为监听状态listen()
  4. 监听套接字调用accept(),接收来自客户顿的请求
  5. 使用客户端套接字接收客户端发来的信息
  6. 使用客户端套接字向客户端发送应答
  7. 关闭客户端套接字
  8. 关闭监听套接字

TCP三次握手

  • 1.第一次握手:客户端向服务端主动发送一个SYN包,请求连接,并置序列号seq = x;
  • 2.第二次握手:服务端收到客户端发来的SYN包,使用ACK包进行确认,并置确认号为ack= x+1 ,同时向客户端发送一个SYN包,请求一个连接,置序列号为syn = y;
  • 3.第三次握手:客户单收到了服务端的确认信息以及连接请求,此时客户端建立连接,同时向服务端发送确认包,服务端收到确认包后,也会建立连接,此时三次握手完成,客户端与服务器可以进行正常的通信.

TCP四次挥手

以客户端先调用close()为例进行赘述

  • 1.第一次挥手:客户端调用close(),向服务端发送一个FIN包,请求释放一个连接,并置序列号seq = u;
  • 2.第二次挥手:服务端收到了客户端的请求,向客户端发送一个确认包ACK,并置确认号为ack = u+1;
  • 3.第三次挥手:服务端向客户端也发送一个FIN包,请求释放一个连接,并置序列号为seq = w;
  • 4.第四次挥手:客户端收到了服务端的确认信息以及请求释放连接的信息,向服务端发送确认包,并等待2MSL时间,确定确认包成功送达服务端,再释放连接,服务端收到确认包后,也释放连接.

为什么挥手是4次?

因为当服务端收到了客户端的请求后,只是表示客户端不再向服务端发送数据,并不会立即执行close()操作,所以确认信息和请求close()信息并不会一起发送,会有一个先后顺序

为什么要等待最后一次挥手要等待2MSL?

网络是不可靠的,所以最后一次挥手发送给服务端的信息可能会丢失,等待2MSL是以为了防止最后一次信息丢失而服务端重新发送请求客户端却收不到的情况.

TCP与UDP的不同点

UDP是无连接的,容易堵塞的,所以这种通讯方式不安全
相比与UDP,TCP是面向连接的,基于字节流的可靠的稳定的文件传输方式,为什么传输可靠?

  • 首先它是面向连接的
  • 采用发送应答机制
  • 采用超时重传机制
  • 错误校验,使用校验和函数检查数据是否有错误
  • 阻塞控制/流量控制
    TCP能够重发丢失的数据包,舍弃重复的数据包,保障数据的有序传输.

TCP长连接与短连接

  • tcp短连接:客户端每发送一次数据,都要进行三次挥手与四次握手,如果与服务端频繁进行数据交换,那么就需要频繁的创建连接,断开连接,大大的降低了数据传输的效率.
  • tcp长连接:客户端和服务器进行通信,首先三次握手建立连接,通信的过程中,多次收发数据,并不断开连接,使用同一个套接字,当完成了所要获取的内容之后,再进行四次挥手操作.

多任务

实现多任务的方式有:多进程,多线程,协程,阻塞
首先我们需要搞清楚并行与并发的概念

  • 并行:任务数小于CPU核数,多个任务实现了真正的一起执行
  • 并发:任务数大于CPU核数,通过操作系统的各种调度算法,实现多个任务一起执行的效果,实际上某一时刻只有一个任务在执行.

多任务-threading.

  • 每一个进程至少有一个线程
  • 线程的执行顺序是不确定的
  • 主线程会等待子线程执行完毕再结束
  • 多线程之间共享全局变量,所以会造成资源争夺问题.
  • 互斥锁:使用互斥锁可以解决多个线程共享同一个全局变量造成的资源争夺问题
  • 死锁:线程间共享资源的时候,如果一个线程向下执行需要对方线程的资源,而对方线程的向下执行也需要该线程的一个资源,都在等待对方的资源,就会造成死锁
  • 如何解决死锁问题?
  • 采用银行家算法;避免使用多把锁;设定超时时间

多任务-进程multiprocessing.

  • 进程是系统资源分配与调度的单位,而线程是CPU进行调度的基本单位;
  • 进程的三个状态:就绪态;执行态;等待态(sleep)
  • 进程与线程的区别:
  • 1.进程是系统进行资源分配与调度的单位;
  • 2.线程是CPU调度的基本单位
  • 3.一个程序至少有一个进程,一个进程至少有一个线程;
  • 4.进程消耗的系统资源大,执行效率低;而线程几乎不占用系统资源,运行效率高;
  • 5.进程在执行过程中拥有独立的内存,而线程共享内存,大大提高了程序的运行效率.
  • 6.进程利于资源的管理和保护

进程池

  • 如何创建一个进程池?
  • 1.进程池的创建必须在main函数下
  • 2.标准格式为:po = Pool()
  • 如何向进程池中添加任务?
  • 1.po.apply_async(目标函数,(要传递的参数,))
  • 2.po.close()关闭进程池,指的是进程池不再接收新的任务
  • 3.po.join() 进程池中的进程为守护进程,即主进程结束,守护进程立即结束,区别与一般的主进程与子进程.

消息队列Queue

  • 为什么需要消息队列
  • 1.进程之间不共享变量,所有的数据都是独立拥有的,互不干涉
  • 2.所有进程之间通信需要消息队列,它不归任何一个进程独有,被所有进程共享,进程之间通信,一个进程向消息列队中写入数据,另一个进程向消息列队中读入数据,实现数据的交互.
  • 3.注意!进程池之间的进程进行通信必须调用multiprocessing.Manager(),Queue()!

迭代器,生成器

-迭代器:具备__iter()和__next()方法的对象

  • 1.如何判断一个对象可迭代?
  • 1.1 使用isinstance(对象,Iterable) 返回值为True或者False
  • 2.可迭代对象的本质:
  • 2.1 向我们提供一个迭代器,可以记住遍历的位置,对集合中的元素进行遍历迭代;
  • 3.for…in…循环的本质?
  • 3.1 首先通过iter()调用可迭代对象的__iter__()方法,得到一个迭代器对象,通过迭代器对象不断的调用next()方法,间接调用__next__()方法,来生成下一条数据,并将返回值赋予…就完成了遍历迭代的过程
  • 4.迭代器的优势?
  • 4.1 使用迭代器,保存的并不是数据的集合,列表,元祖等,而是保存的生成数据的方法,每次只生成一个数据,大大的节省了内存空间的占用.
  • 生成器:具备yeild的函数称作一个生成器的模板;
  • 生成器是一类特殊的迭代器,记住当前的状态,并返回后面的值,配合next()函数进行使用;
  • 生成器的唤醒方式有?
  • 1.使用next(生成器对象)函数唤醒;
  • 2.使用生成器对象.send(“xxx”)将其唤醒,注意不能首次唤醒就直接使用send(“xxx”)

协程的三种实现方式?

1.使用yeild可以实现最为本质的协程方式
2.为了使得切换任务变得简单,引入greenlet(gr1 = greenlet(目标函数))(gr1.switch)
3.为了不再进行人工切换任务,使得遇到延时操作自动切换到其他的函数中去,引入gevent.

进程,线程,协程的区别?

  • 进程是系统资源分配与调度的独立单位.
  • 线程是CPU进行调度的基本单位.
  • 进程切换需要的资源很大,效率很低.
  • 线程切换需要的资源一般,效率一般.
  • 协程切换需要的资源很小,效率很高.
  • 进程与线程可以实现并行,但协程只能实现并发.
  • 给程序打补丁:
from gevent import monkey 
monkey.patch_all()
import request
# 注意顺序,必须在导入request之前给程序打上补丁,将会遇到的耗时操作转换为gevent型.如果request先导入那么其内部的耗时操作就无法再进行类型的转换.

HTTP协议

  • HTML:一种定义网页的文本文件
  • HTTP:用来在网络上传输HTML的协议,基于TCP进行传输
  • HTTP协议分为请求部分和响应部分

HTTP协议请求?

  • 1.请求行:GET /HTTP/1.1 包含请求方式,请求内容,和协议版本
  • 2.请求头(Request_header):Header:value
  • 3.请求体(Request_body):body data

HTTP协议响应?

  • 1.响应行:HTTP/1.1 200 OK
  • 2.响应头(response_header):Header:value
  • 3.响应体(response_body):body_data

HTTP协议通讯过程?

  • 1.浏览器向服务器发送HTTP请求;
  • 2.服务器向浏览器发送响应;
  • 3.重复1,2步骤.

如何模拟一个服务器,接收来自浏览器的请求并向浏览器发送响应?

  • 1.主函数中构造一个TCP服务器;
  • 2.定义一个函数,用于服务器向浏览器发送响应;
  • 2.1 接收来自浏览器的请求;
  • 2.2 对请求进行处理,提取出请求的内容的地址信息;
  • 2.3 通过地址找到对应的文件,读取到的内容作为响应体,再构造一个响应头,一起发送给浏览器
  • 3.主函数中不断调用响应函数.

使用多进程,多线程实现浏览器与服务器之间的通信

在主函数的while True中创建进程,线程并执行即可

非堵塞模式?

非堵塞的作用对象是socket套接字,socket套接字默认是堵塞的,使用socket.setblocking(False)可以使得套接字对象变为非堵塞的,遇到recv等操作,可不用再阻塞,收到数据即为正常运行,未收到将会报错,需要进行异常捕获处理.

非阻塞如何实现单线程多任务?

非阻塞是相对于阻塞而言的,一个程序的执行,如果遇到一些阻塞代码,会停滞,直到阻塞解除,这样也就使得程序的运行效率变低,根本无法实现多任务的一个效果;而非阻塞就是说当遇到这些本应该阻塞的操作,立即返回,能接收就接收,不能接收就报错,也就是说将阻塞时间带给程序的复件影响消灭,程序一直不停的在执行,运行的速度加快了,达到了同一时间多个任务一起执行的效果,即实现了多任务.

epoll

  • (文件标识符)标识的文件
  • 当对列表中的套接字进行遍历的时候,首先需要复制一份fd文件给操作系统,操作系统帮助程序进行判断该套接字是否有读状态,再返回给程序,这样的话,如果一个列表足够长,那么循环遍历的时间加上拷贝的时间,使得单进程,单线程,非阻塞来实现多任务的效率低下,所以EPOLL很好的解决了这一问题
  • EPOLL就是创建了一个独立的内存空间,既不属于程序,也不属于操作系统,而是被二者共享,这样就减少了复制拷贝的过程.这是EPOLL的一个好处.
  • 轮询 事件通知
  • 轮询即对一个容器进行遍历,效率比较低
  • 事件通知则是指操作系统监听共享内存中存储的套接字对应的fd,如果有数据到来,则表明该套接字进入读就绪状态,并通知对应的套接字执行数据的接收操作,大大提高了效率.
  • IO多路复用:指的是一个进程中可以运行多个SOCKET.

网络通信过程

浏览器访问服务器的过程.(面试必问)

  • 1.解析域名DNS服务器.
  • 2.向服务器发送TCP三次握手链接服务器
  • 3.发送HTTP的请求数据以及等待服务器的应答.(交互)
  • 4.发送TCP的四次挥手.

通信过程名字赘述

  • 集线器:集线器是以广播的方式进行发送数据,会导致网络拥堵.
  • 交换机:解决了集线器造成的网络拥堵问题,可以进行广播,也可以进行单播,根据自己的需求进行设置,目前已经代替了集线器,被企业广泛使用.
  • 路由器:连接多个不同的网段,使他们之间可以数据的交互.
  • mac地址:设备与设备之间进行数据通信时用来标记收发双方.(物理地址)
  • IP地址:在逻辑上标记电脑,用来指引数据包的收发方向.(逻辑地址)
  • 网络掩码(子网掩码):用来区分IP地址的网络号和主机号(使用位运算中的与运算)
  • 默认网关:当需要发送的数据包的目的IP不在本网段内,会发送个一个默认的电脑,成为网关.
  • DNS:用来解析出IP地址.
  • ARP,根据IP获取目标设备的物理地址.
  • 整个浏览器和服务器通信的过程中,IP不变MAC地址一直在变.
    letcode(1792688122204)

按位与运算的应用:

n = int(input)
count = 0
while n:
    count+=1
    n = n&(n-1) # 该操作巧妙的将整个二进制数最右边的1转换为0,相当于一次又一次的减掉1,数减了多少次1,就说明整个二进制中有多少1.
print(count)

按位异或运算的应用

*给定一个非空整数列表,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素

nums = [1,1,2,3,4,4,3]
ret = 0 
for i in nums:
    ret = ret^x
return ret

10进制转2进制:

def conver():
    n = int(input())
    list = []
    while n :
        list.append(n%2)
        n>>=1
    list.reverse()
    return "".join([str(x) for x in list])
    

2进制转10进制

def conver():
    temp = [int(x) for x in list(str1)] 
    temp.reverse()
    sum = 0
    for i in range(0,len(temp)):
        sum += (1 << i) * temp[i]  
    return sum

注意:

  • 右移一位,相当于整数//2
  • 左移一位,相当于整数*2

总结

从Linux命令到网络通信过程,Python高级的第一阶段的要点网罗呈上!!!

Logo

更多推荐