(四)poll,epoll,本地套接字,多任务编程,父子进程

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等
* 父子进程空间独立,各自修改各自的内容,互不影响

猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/81080602