回忆
1.HTTPSERVER(HTTP协议+tcp套接字)
2.接收浏览器发来的请求
3.查看请求内容
阻塞IO
非阻塞IO
f.flush()
IO多路复用
目的:在程序中有多个IO事件的时候,同时监控,那个能执行就执行那个,提高效率
----------------------------------------
8.09笔记
epoll
使用方法:代码与poll基本一致
将生成的对象改为p=epoll()
将关注事件类别名称改为epoll的关注事件类别
区别:epoll相对poll更新,效率高于select 和poll(epoll直接选出哪个io事件要执行)
epoll的触发机制更多 (多一个epollet,边缘触发)
本地套接字
linux下文件类型
b(块设备文件) c(字符设备文件)
d(目录) -(普通文件) 1(链接文件)
s(套接字文件) p(管道文件)
本地套接字作用:用于本地不同程序间进行数据传输(以内存为介质)
本地套接字传输流程
1.创建套接字对象
sockfd = socket(AF_UNIX,SOCK_STREAM)
2.绑定套接字文件,如果文件不存在则自动保存
sockfd.bind(file)
3.监听listen
4.收发消息recv send
补充:
os.path.exists(file)
功能:判断一个文件是否存在
参数:文件
返回值:存在 true 不存在false
os.remove()
os.unlink()
功能:删除一个文件
参数:要删除的文件
网络基础总结
理论:1.osi七层模型 tcp/udp模型
2.tcp和udp的区别和特征
3.三次握手和四次挥手的过程和每一次作用
4.什么是io多路复用,io的基本形态
5.套接字的种类,套接字类型的区别
程序实践:1.tcp套接字传输的基本模型
2.udp套接字传输基本模型
3.IO多路复写select poll的使用
4.http协议基本原理的实现
多任务编程
意义:充分利用计算机资源,同时运行多个任务,提高程序的运行效率
定义:通过程序利用计算机的多个核心达到同时执行多个任务的目的,以此达到提升程序运行效率的目的
实施方案:多进程编程 多线程编程 (利用计算机的多个核心)
并行:多个计算机核心在同时处理多个任务,这时多个任务之间是并行关系 2+2
占有更多的资源
并发:同时运行多个任务,内核在多个任务间不断切换,达到多个任务都会被执行的处理效果,此时多个任务间是并发关系 5+1
1个内核处理一个任务
进程:程序在计算中的一次执行过程 (一次)
程序:是一个可执行文件,是静态的,占有磁盘,不占计算机资源
进程:是一个动态的过程,占有计算机资源,有一定的生命周期
解释:同一个程序不同的运行过程是不同的进程,因为分配的资源和生命周期各不相同
进程的创建流程
1.用户启动一个程序或者调用借口发起进程创建
2.操作系统接收用户分配计算机资源创建进程
3.操作系统将一定状态的进程提供给用户使用
4.用户利用操作系统提供的进程完成任务
`
cpu时间片
如果一个进程占有cpu此时我们称为该进程占有cpu时间片(时间片是毫秒级的)
多个进程任务会轮流占cpu时间片形成并发效果
进程信息(process)
pcb(进程控制块):进程创建后会自动在内存生产一个空间存放进程信息
进程信息:进程的id
查看你系统该进程信息
ps -aux
pid(process id):在操作系统中每个进程都有唯一的pid值 由系统分配
进程特征:1.进程是操作系统分配资源的最小单元
2.每个进程有自己独立的运行空间(空间指的是虚拟内存空间,不是物理内存为了扩展地址)
3.进程之间运行相互独立互不影响
进程的状态:
1.三态
就绪态:进程具备执行条件,等待系统分配处理器资源进入状态
运行态:进程占有cpu处于运行状态
等待态:进程暂时不具备运行条件,需要阻塞等待
2.五态
新建:创建一个新的进程,获取系统资源的过程
终止:进程执行结束,释放资源的过程
ps -aux stat
D:等待态 阻塞 不可中断等待态
S:等待态 睡眠 可中断等待态
T:等待态 暂停 暂停执行
R:运行态(就绪态)
Z:僵尸态
+ 前台进程(在终端运行,能显示出现象的进程)
< 有较高优先级的进程
N 有较低优先级的进程
s 会话组
l 有进程链接
进程的优先级
top 进态查看
优先级的取值范围 -20到19
nice:以指定优先级运行一个程序
nice -9 ./while.py
导入解释器 #!/usr/bin/python3 必须在第一行
修改程序可执行权限
chmod 775 whlie.py
可以直接指明路径执行
父子进程
在系统中除了初始化进程,每个进程都有一个父进程,可能有0个或多个子进程 由此形成进程间的父子关系
每个进程都是有父进程发起请求
便于进程管理,父进程发起创建子进程的请求
查看进程树 pstree
查看父进程 ps -ajx
要求:
1.什么是进程,进程和程序的区别
2.了解进程的特征和基本概念
3.理解并发并行的区别
4.清楚进程的状态及转换
os.fork 创建进程 很多编程语言都支持
pid = os.fork()
功能:创建进程
返回值:失败返回一个负数 通常不会创建失败,当内存满的时候
成功:在原有进程中返回新进程的pid号,在新进程中返回0
全部内存空间,包括变量
fork不会无穷无尽
总结:
1.子进程会复制父进程全部内存空间包括代码段
2.子进程会从fork下一句开始执行
3.父进程中fork返回值即为新创建子进程的pid号
4.父子进程不一定谁先执行,执行上互不干扰,抢占时间片
5.使用if语句结构使父子进程执行不同的代码几乎是fork创建进程的固定结构
6.在子进程中对变量等其他内容的修改,不会影响父进程中的内容
7.子进程虽然复制父进程内容,但是也有自己的特有属性特征 比如 pid pcb
获取进程pid
os.getpid()
功能:获取进程的pid号
返回值:返回进程的pid号
获取父进程的pid号
os.getppid()
功能:获取父进程的pid号
返回值:返回父进程的pid号
进程退出
os._exit(status) 不可逆
功能:退出一个进程
参数:进程的退出状态 整数
sys.exit([status])
功能:退出一个进程
参数:默认为0
如果传入一个整数则同_exit()传入一个字符串,则在退出时打印该字符串
sys.exit()可以通过捕获 systemexit异常阻止退出