epoll
使用方法: 代码与poll基本一致
- 将生产的对象 改为 p = epoll()
- 将关注事件类别名称改为epoll的关注事件类别
区别 :
epoll 效率要高于select 和 poll
epoll 的触发机制更多–> EPOLLET(边缘触发)
本地套接字
bcd-lsp
cookie
linux下文件类型
b(块设备文件) c(字符设备文件)
d(目录) -(普通文件) l(链接文件)
s(套接字文件) p(管道文件)
作用 : 用于本地不同程序间进行数据传输
本地套接字传输流程
- 创建套接字对象 创建本地套接字
sockfd = socket(AF_UNIX,SOCK_STREAM) - 绑定套接字文件,如果文件不存在则自动创建
sockfd.bind(file) sockfd.bind(path) - 监听 listen()
- 消息收发 recv send
cookie
os.path.exists(file)
功能 : 判断一个文件是否存在
参数 : 文件
返回值 : 存在 True 不存在 False
os.remove()
os.unlink()
功能 : 删除一个文件
参数 : 要删除的文件
网络基础总结
理论 : 1. OSI七层模型 tcp/ip模型
2. TCP 和 UDP的区别和特征
3. 三次握手和四次挥手的过程和每一次作用
4. 什么是IO多路复用,IO的基本形态
5. 套接字的种类,套接字类型的区别
程序实践 : 1. TCP套接字传输的基本模型
2. UDP套接字传输基本模型
3. IO多路复用select poll的使用
4. HTTP协议基本原理的实现
多任务编程
意义: 充分利用计算机资源,同时运行多个任务,提高程序整体的运行效率
定义 : 通过程序利用计算机的多个核心达到同时执行多个任务的目的。以此达到提升程序运行效率的目的
实施方案 : 多进程编程 多线程编程
并行:多个计算机核心在同时处理多个任务,这时多个任务之间是并行关系
并发:同时运行多个任务,内核在多个任务间不断切换,达到多个任务都会被执行的处理效果。此时多个任务间是并发关系
进程:程序在计算机中的一次执行过程
程序 : 是一个可执行文件,是静态的,占有磁盘,不占计算机的运行资源
进程 : 进程是一个动态的过程,占有计算机资源,有一定的生命周期
- 同一个程序不同的运行过程是不同的进程。因为分配的资源和生命周期都不相同
进程的创建流程
- 用户启动一个程序或者调用接口发起进程创建
- 操作系统接收用户请求分配计算机资源创建进程
- 操作系统将一定状态的进程提供给用户使用
- 用户利用操作系统提供的进程完成任务
进程相关概念
cpu时间片
如果一个进程占有cpu此时我们称为该进程占有cpu时间片。多个进程任务会轮流占有cpu时间片形成并发效果。
进程信息 (process)
PCB(进程控制块):进程创建后会自动在内存生产一个空间存放进程信息。
进程信息 : 进程的ID 进程占有内存的位置,创建时间,创建用户。。。
查看系统该进程信息 : ps -aux
PID(process ID) : 在操作系统中每个进程都有唯一的PID值是由系统分配的。是一个大于0的整数
父子进程:在系统中除了初始化进程,每一个进程都有一个父进程,可能有0个或者多个子进程,由此形成父子进程关系
查看进程树 pstree
查看父进程ID ps -ajx
进程特征
-
进程是操作系统分配资源的最小单元
-
每个进程拥有自己独立的运行空间(虚拟内存空间)
-
进程之间运行相互独立互不影响
进程的状态
三态 -
就绪态 : 进程具备执行条件,等待系统分配资源
-
运行态 : 进程占有cpu处于运行状态
-
等待态 : 进程暂时不具备运行条件,需要阻塞等待
五态 (三态基础上增加新建和终止)- 新建 : 创建一个新的进程,获取系统资源的过程
- 终止 : 进程执行结束,释放资源的过程
ps -aux —> STAT表示进程状态
D 等待态 阻塞 不可中断等待态
S 等待态 睡眠 可中断等待态
T 等待态 暂停 暂停执行
R 运行态(就绪态)
Z 僵尸
前台进程 (在终端运行)
< 有较高优先级的进程
N 较低优先级的进程
s 会话组
l 有进程连接
进程的优先级
top 动态查看进程优先级
< > 进行翻页 q退出
优先级的取值范围 : -20 — 19 -20最高
nice : 以指定的优先级运行一个程序
nice -9 ./while.py 以9的优先级运行
sudo nice --9 ./while.py 以-9优先级运行
cookie
首行添加
#!/usr/bin/python3
修改程序权限添加可执行权限
chmod 775 while.py
可以直接指明路径执行
./while.py
父子进程
在系统中除了初始化进程每个进程都有一个父进程,可能有0个或多个子进程。由此形成进程间的父子关系。
便于进程管理,父进程发起创建子进程请求
查看进程树: pstree
查看父子进程PID : ps -ajx
os.fork 创建进程
pid = os.fork()
功能 : 创建进程
参数: 无
返回值:pid
失败返回一个负数
成功 :在原有进程中返回新进程的PID号
在新进程中返回0
- 子进程会复制父进程全部内存空间包括代码段
- 子进程会从fork的下一句开始执行
- 父进程中fork返回值即为新创建子进程的PID号
- 父子进程不一定谁先执行,执行上互不干扰抢占时间片
- 使用if 语句结构使父子进程执行不同的代码几乎是fork创建进程的固定结构
- 在子进程中对变量等其他内容的修改,不会影响父进程中 的内容
- 子进程虽然复制父进程内容,但是也有自己的特有属性特征。比如: PID号 PCB 内存区间等
获取进程PID
os.getpid()
功能:获取进程的PID号
返回值 : 返回进程的PID号
os.getppid()
功能:获取父进程的PID号
返回值 : 返回父进程的PID号
进程退出
os._exit(status)
功能 : 退出一个进程
参数 : 进程的退出状态 整数
sys.exit([status])
功能 : 退出一个进程
参数 : 默认为0
如果传入一个整数则同 _exit()
传入一个字符串。则在退出出时打印该字符串
- sys.exit() 可以通过捕获 SystemExit异常阻止退出
孤儿进程;父进程先于子进程退出,此时子进程就称为孤儿进程。
孤儿进程会被操作系统指定的进程收养,系统进程就成为孤儿进程的新的父进程。
僵尸进程:子进程先于父进程退出,但是父进程没有处理子进程的退出状态,此时子进程就会成为僵尸进程。