OJBK
接着昨天的说 select模块内的epoll函数还没说 说完epoll和本地套接字套接字基本就没了 今天主要是多进程 理论性东西比较多 主要是理解
epoll
- 使用方法:代码与poll基本一致(Python语言中)
- 将生产的对象改为 epoll = epoll()
- 将关注事件类别名改为epoll的关注事件类别
创建方法改为 epoll()就可以了 这种情况只在Python中才会这么简单 epoll在别的语言实现比python要复杂的多 区别: epoll 效率要高于select 和 poll epoll 的触发机制更多 EPOLLET(边缘触发) 边缘触发是什么? 这就是epoll和poll的区别所在了 为什么说epoll效率会高呢 因为epoll的触发机制是在内核中直接完成整个功能 那个事件准备就绪我就直接返回这个IO事件 而poll的触发方式是什么呢 是我什么时候有IO准备就绪了我就把整所有的事件都返回 返回到应用层后再次做筛选处理 即使你的计算很快 也是会浪费很多事件去处理
Linux下文件类型: bcd -lsp b(快 设备文件) c(字符设备文件) d(目录) -(普通文件) l(链接文件) s(套接字文件) p(管道文件) 本地套接字: 作用: 用于本地文件不同程序间进行数据传输 本地套接字传输流程: 1.创建本地套接字对象 sockfd = socket(AF_UNIX, SOCK_STREAM) 2.绑定套接字文件,如果文件不存在则自动创建 存在则报错 sockfd.bind(file) 3.监听 listen 4.消息收发 recv send
os.path.exists(file) 功能:判断一个文件是否存在 参数:文件名 返回值:bool
os.remove() os.unlink() 功能:删除文件 阐述:要删除的文件
网络基础总结: 理论: 1.OSI七成模型 tcp/ip模型 2. tcp 和 UDP的区别和特性 3.三次握手和四次挥手的过程和每一次的作用 4.什么是IO多路复用 5.套接字的种类,套接字类型的区别 程序实践; 1.tcp套接字传输的基本模型 2.udp套接字传输的基本模型 3.IO多路复用select、poll 4.HTTP协议基本原理的时间
多任务编程: 意义: 充分利用计算机资源,同时运行多个任务, 提高程序整体的运行效率 定义: 通过程序利用计算机的多个核心达到同时执行多个任务的目的 因此达到提升程序运行效率的目的 实施方案: 多进程编程 多线程编程 并行: 多个计算机核心在同时处理多个任务, 这时多个任务之间是并行关系 并发: 同时运行多个任务,内核在多个任务之间的不断切换, 达到多个任务都会执行的处理效果 此时多个任务之间是并发关系
进程: 程序在计算机中的一次执行过程
程序: 是一个可执行文件,是静态的,只占有磁盘 不占用计算机运行资源 进程: 是一个动态过程,占有一定的计算机资源 有一定的生命周期 注: 同一个程序不同的运行过程是不同的进程, 因为分配的资源和生命周期都不同
进程的创建过程: 1.用户启动一个程序,或是调用接口发起进程创建 2.操作系统接收用户请求分配计算机资源创建进程 3.操作系统将一定状态的进程提供给用户使用 4.用户利用操作提供的进程完成任务 CPU时间片: 如果有个进程占有CPU此时我们称为该进程占有CPU的时间片 多个进程任务或轮流占有CPU时间片并形成并发效果 进程信息(process) PCB(进程控制块): 进程创建后 会自动在内存中产生一个空间存放进程信息 进程信息: 进程ID 进程占有内存的位置 创建时间、创建位置 查看系统进程信息:ps -aux PID(process ID): 在操作系统中每个进程都有唯一的PID值是由系统分配的 进程特征: 进程是操作系统分配资源的最小单元 每个进程拥有自己独立的运行空间(4个G的虚拟内存空间) 进程之间相互独立各不影响 进程的状态: 三态: 就绪状态: 进程具备执行条件,等待系统分配处理器资源进入运行态 运行态: 进程占有CPU处于运行状态 等待态: 进程暂时不具备运行条件,需要阻塞等待
五态: 在三态的基础上增加新建和终止态 新建: 创建一个新的程序,获取系统资源的过程 终止: 进程执行结束,释放资源的过程
ps -aux 查询结果的 STAT表示进程状态: D 等待态 阻塞 不可中断等待态 S 等待态 睡眠 可中断等待态 T 等待态 暂停 暂停执行 R 运行态(就绪态) Z 僵尸 + 前台进程(在终端运行) < 有较高优先级的进程 N 较低优先级的进程 s 回话组 l 有子进程链接 进程的优先级: top 查看进程运行态优先级 取值范围:-20~19 -20最高 nice: 以指定的优先级运行一个程序 nice -9 ./hello.py 以9的优先级运行 sudo nice --9 ./hello.py 以-9优先级运行
首行添加 #! /usr/bin/python3 指定执行器 执行:./hello.py 修改程序权限添加可执行权限 chmod 775 hello.py
父子进程: 在系统中除了初始化进程外每个进程都有一个父进程,可能有0个或多个子进程 由此行成进程间的父子关系 便于进程管理,父进程发起创建进程请求 查看进程树:pstree 查看父子进程ID:ps -ajx
os.fork 创建进程 pid = os.fork() 功能:创建进程 返回值: 失败:返回一个负数 成功: 在原有进程中返回新有进程PID号 在新进程中返回0 子进程会复制父进程内部全部内存空间包括代码段 子进程会从fork的下一句开始执行 父进程中fork返回值即为新创创建子进程的PID号 使用if语句结构使父子进程进行不同代码段的运行 在子进程中对变量等其他内容的修改, 不会影响父进程中的内容 子进程虽然复制父进程内容,但是也有自己的特有属性特征 如:PID号 PCB 内存区间
获取进程的PID os.getpid() 功能:获取进程的PID号 返回值:返回进程的PID号 os.getppid() 功能:获取父进程的PID 返回值:返回父进程的ID号 进程退出: os.exit(status) 功能:退出一个进程 参数:进程的退出状态 整数 sys.exit([status]) 功能:退出一个进程 参数:默认为0 如果传入一个整数如同_exit() 传入一个字符串,则在退出时打印该字符串 sys.exit() 可以通过捕获 SystemExit异常退出
什么是进程 进程和程序的区别? 进程是一种动态描述 是程序运行的一次过程 进程是程序在运行过程中的形态 它占有一定的独立内存空间 进程占用CPU及系统资源 而程序不会 程序是静态的 它只会占用磁盘空间
进程的特征和基本概念? 进程是计算机内存资源分配的最小资源 每个进程在内存中都有各自各自独立的运行空间 并且每个进程之间互不影响
并发并行的区别? 并行是不同系统核心同时进行进程的运行 两个进程之间的关系叫做并行 并发是同一个系统核心进行轮流切换进程的过程叫做并发 并行是有多个进程同时运行 而并发只能同时运行一个进程
进程 fork理解?
- 进程fork是一个创建子进程的os模块函数
- 他能够在只运行一个程序的情况下 创建多个进程并运行
- 创建出来的进程叫做该进程的子进程 并且子进程与父进程是并发运行
- 谁先占有资源谁先运行 没有顺序之分
- 创建子进程有三个结果创建失败返回负数、成功返回0、正数(代表原有进程ID)
- 如果创建子进程成功 返回值为该子进程的ID 并且在该子进程中返回0
- 其实就是创建成功时返回原进程ID 当子进程独立运行时在子进程内返回0
- 子进程创建成功后悔会在内存中开辟以个新的空间 此空间内的所有代码和参数
- 都会复制父进程的 但是有自己的进程属性 是独立进程 子进程的所有操作不会影响父进程
- 在创建子进程后运行位置是从fork函数return后开始执行的
- 利用if结构就能达到多进程同时运行同程序内的不同代码段
- 这样就能大大提高程序的执行效率
import os
import time
pid = os.fork()
if pid < 0:
print("失败")
elif pid == 0:
print("成功")
print(pid)
time.sleep(2)
print(pid)
else:
time.sleep(5)
print("原进程")
print(pid)