poll
from select import poll
1.创建poll对象
p = poll()
2.添加关注的IO
poll IO事件分类
POLLIN POLLOUT POLLERR POLLHUP POLLPRI POLLVAL
rlist wlist xlist 断开连接 紧急处理 无效
p.register(s,POLLIN | POLLERR) 关注IO事件
p.unregister(s) 取消对IO的关注
3.进行监控
events = p.poll()
功能:监控关注的IO,阻塞等待IO发生
返回值:events是一个列表,列表中每个元素为一个元组,代表准备就绪的IO
events --> [(fileno, event),(),()]
就绪IO的fileno 哪个事件就绪
因为要获取IO对象调用函数---> 通过fileno得到对象
实施方法:建立比照字典{s.fileno():s}
4.处理IO
epoll
使用方法: 与poll基本相同
* 将生成对象的 poll() 函数 变为 epoll()
* 将register注册IO事件时 关注的事件类别改为epoll事件类型
select poll epoll 区别
1.select可以很好支持windows
2.epoll比select和poll效率高,select和poll差不多
3.epoll提供了更多的触发方式
本地套接字
linux 下文件类型
b(块设备文件) c(字符设备文件) d(目录)
-(普通文件) l(链接文件) s(套接字文件) p(管道文件)
作用:用于本地不同程序间进行通信
本地套接字创建流程:
1.创建套接字对象
sockfd = socket(AF_UNIX,SOCK_STREAM)
2.绑定本地套接字文件
sockfd.bind(path)
path : 一个文件
3.监听
4.接收发送消息
cookie
os.path.exists(path)
功能:判断一个文件夹下是否有某个文件
参数: 文件位置
返回值: 存在返回True 否则返回False
os.unlink() os.remove()
功能:删除一个文件
参数:要删除的文件
In [2]: os.path.exists("./re")
Out[2]: True
In [3]: os.unlink("./re")
多任务编程
意义:充分利用计算机的资源提高程序的运行效率
定义:通过应用程序利用计算机多个核心,达到同时执行多个任务的目的。
实施方案:多进程 多线程
并行:多个计算机核心在同时处理多个任务,多个任务之间是并行关系
并发:计算机同时处理多个任务,内核在多个任务间不断切换,达到好像在同时处理的运行效果。
此时多个任务实际为并发关系
进程:程序在计算机中运行一次的过程
进程是一个动态的过程描述,占有cpu内存等计算机的资源,有一定的生命周期
程序:是一个可执行文件,是静态的,占有磁盘,不占有计算机运行资源
* 同一个程序的不同执行过程是不同的进程,因为分配的计算机资源等均不同
进程的创建流程
1.用户空间运行一个程序,发起进程创建
2.操作系统接受用户请求,开启进程创建
3.操作系统分配系统资源,确定进程状态
4.将创建好的进程提供给应用层使用
cpu时间片
如果一个进程占有计算机核心,我们称为该进程在cpu时间片上。
多个任务实际对cpu会进行争夺,一般由操作系统分配cpu时间片
PCB (进程控制块)
在操作系统中,进程创建后会自动产生一个空间存放进程信息,称为进程控制块
进程信息:进程PID,进程占有的内存位置,创建时间,用户....
PID(process ID) : 进程在操作系统中的唯一编号,大于0的整数,由系统自动分配
进程信息查看命令: ps -aux
进程特征
* 进程是操作系统分配计算机资源的最小单位
* 每个进程都有自己单独的虚拟内存空间
* 进程间的执行相互独立,互不影响
进程的状态
三态
* 就绪态:进程具备执行条件,等待系统分配cpu
* 运行态:进程占有cpu处理器,处于运行状态
* 等待态:进程暂时不具备运行条件,需要阻塞等待
五态 (增加新建态和终止态)
* 新建态:创建一个新的进程,获取资源的过程
* 终止态:进程结束释放资源的过程
ps -aux ---> STAT 查看进程状态
D 等待态 (不可中断等待)
S 等待态 (可中断等待)
T 等待态 (暂停状态)
R 运行态 (就绪态 运行态)
Z 僵尸态
+ 前台进程
< 高优先级
N 低优先级
l 有进程链接
s 会话组组长
进程优先级
优先级决定了一个进程的执行权限和占有资源的优先程度
查看进程优先级:
top : 动态的查看进程优先级
取值范围: -20 ---19 -20优先级最高
nice : 指定优先级运行程序
e.g. nice -9 ./while.py
sudo nice --9 ./while.py -9的优先级运行
父子进程
在系统中除了初始化进程每个进程都有一个父进程,可能有0个或多个子进程。
由此形成父子进程关系,我们认为每个进程都是父进程发起请求创建的。
进程(process)
查看进程树: pstree
查看父进程PID: ps -ajx
要求: 什么是进程,进程和程序的区别
了解进程的特征
清楚进程的状态及状态间的转化关系
并行和并发的区别,操作系统功能
需求 : 编写一个程序能够同时执行多个任务,同时要在程序运行过程中,根据情况创建进程
import os
pid = os.fork()
功能: 创建一个新的行程
参数:无
返回值:失败返回一个负数 -1
成功 在原有进程中返回新的进程的PID
在新的进程中返回0
* 子进程 会复制父进程全部代码段,包括fork前的代码
* 子进程从fork的下一句开始执行
* 父子进程通常会根据fork返回值的差异选择执行不同的代码 (使用if结构)
* 父子进程在执行上互不干扰,执行顺序不确定
* 子进程虽然复制父进程内存空间,但是有自己的特性,
比如PID号,PCB等
* 父子进程空间独立,各自修改各自的内容,互不影响