zoukankan      html  css  js  c++  java
  • 网络编程(四)

    IO 阻塞 非阻塞 多路复用 超时监测
    ***********************************************
    本地套接字
    b(块设备文件) c(字符设备文件)
    d(文件夹) - (普通文件)
    l(链接文件) link
    s 套接字文件
    p 管道文件
    意义 : 在linux/unix操作系统下,提供本地进程间通信的一种方式

    本地套接字创建流程
    1.创建套接字文件
    sockfd = socket(AF_UNIX,SOCK_STREAM)
    2.绑定套接字文件
    3.监听
    4.接收连接
    5.消息收发

    cookie
    os.unlink() or os.remove()
    功能:删除某个文件
    参数 : 一个路径文件
    os.path.exists()
    功能 : 判断一个文件是否存在
    参数 : 一个路径文件

    多任务编程

    通过应用程序利用多个计算机核心达到多任务同时执行的目的,以此来提升程序执行效率

    多进程,多线程

    进程 : 程序在计算机中一次执行的过程

    程序 : 是一个静态的描述,不占有计算机资源
    进程 : 是一个动态的过程,占有cpu内存的计算机资源,有一定的生命周期。

    * 同一个程序,每次执行都是不同的进程。因为分配的计算机资源不同

    1. 进程的创建流程
    用户空间运行程序发起进程创建申请---》调用操作系统内核接口创建进程 ----》 分配计算机资源,确定进程状态---》 将新的进程提供给用户使用

    2. 多个进程,如何占用cpu
    * 一个内核统一时刻只能运行一个任务
    * 多个进程对内核资源进行争夺,操作系统决定哪个进程占有计算机核心
    * 占有计算机核心的进程我们称为该进程占有cpu的时间片

    3. 进程有哪些信息,如何保存
    PCB (进程控制块): 在*nix系统中进程创建后,会在内存开辟一块空间存放进程的相关信息,称为PCB

    查看进程信息 ps -aux

    信息 : 用户 PID 占有内存 优先级 等
    PID : 在操作系统中进程的唯一标志,是大于0的整数,由系统自动分配

    4.进程特征
    * 进程是操作系统资源分配的最小单位
    * 每个进程单独占有4G虚拟内存
    * 进程之间相互独立,运行不受影响

    进程的状态

    三态

    就绪态 : 进程具备运行条件,等待系统分配处理器运行
    运行态 : 进程占有cpu处于运行的状态
    等待态 : 又称为阻塞态,睡眠态,指进程暂时不具备运 行的条件,需要阻塞等待
    (sleep accept。。。)

    五态

    新建态 : 创建一个进程,获取资源,直接表现为运行一个程序,或者在程序中创建新的进程

    终止态 : 进程执行结束,资源回收过程

    ps -aux ---> STAT 表示进程状态

    D 等待态 (不可中断等待)
    S 等待态 (可中断等待)
    T 等待态 (暂停)
    R 运行态
    Z 僵尸态

    + 前台进程 (不带+即为后台进程)
    < 高优先级
    N 低优先级
    l 有进程链接
    s 会话组

    进程优先级

    优先级决定了一个进程的执行权限和占有资源的优先程度

    top : 动态查看当前运行的进程的状态 q退出
    < > 可以翻页

    linux 中优先级范围 -20 ---- 19 -20最高
    用户程序默认优先级为0

    nice : 以指定的优先级运行进程

    e.g.
    nice -9 ./while.py 以9的优先级运行此程序
    sudo nice --9 ./while.py 以-9的优先级运行此程序

    renice : 改变某个进程的优先级

    e.g. renice 2 PID


    父子进程:在系统出除了初始化进程其他进程都有一个父进程,可能有多个子进程。

    (process)
    进程树 pstree

    要求 :
    1. 什么是进程,进程的特征
    2. 进程状态,每种状态怎么回事,转换
    3. 进程和线程的区别

    需求 : 编写一个程序可以同时做多件事情

    方案 : 使用两个进程分别完成预定事件

    import os

    os.fork()
    功能 : 创建一个新的进程
    参数 : 无
    返回值 : 失败返回一个负数 -1

    成功 0 在子进程中fork的返回值

    >0的正整数(新的进程的PID)在父进程中的返回值

    * 父进程中fork之前的内容子进程同样会复制,但父子进程空间独立,fork之后的修改不会影响到对方
    * 父子进程在执行上互不影响,谁先执行,谁先执行完不确定
    * 子进程虽然复制父进程的空间,但是有自己的特性,比如自己的PID,进程PCB,进程栈空间等。

    进程相关函数

    获取PID号
    os.getpid()
    功能:获取当前进程的PID号
    返回值 : 当前进程PID

    os.getppid()
    功能 : 获取当前进程父进程的PID号
    返回值 : 父进程PID

    进程的退出
    os._exit(status)
    功能 : 结束一个进程
    参数 : 表示进程的结束状态 是一个整数

    sys.exit([status])
    功能 : 结束一个进程,抛出异常
    参数 : 传入一个正整数表示结束状态
    传入字符串表示结束打印


    孤儿进程 :父进程先于子进程退出,此时子进程变为孤儿进程

    * 孤儿进程会被系统指定的进程所“收养”,即该进程成为孤儿进程新的父进程。在孤儿进程退出时,“继父”会进行处理不会使其成为僵尸


    僵尸进程 : 子进程先于父进程退出,但是父进程没有处理子进程的退出状况,子进程就会成为僵尸进程。

    * 僵尸进程会滞留PCB的部分信息在内存中,大量的僵尸进程会消耗系统资源,所以应该尽量避免僵尸进程的产生

    如何避免僵尸进程的产生
    1.让父进程先退出 (不好控制)
    2.让父进程处理子进程的退出
    *使用wait 或者 waitpid 函数

    os.wait()
    功能 : 等待子进程的退出进行处理
    参数 : 无
    返回值 : 一个二元元组,第一个值为退出的子进程PID
    第二个值为子进程退出状态


    *使用信号处理

    3.创建二级子进程


    作业 :
    1.学习os.waitpid()的使用
    2.写一个群聊聊天室

    *选择使用什么样的套接字
    *功能描述

    类似于qq群聊 ,用户在加入聊天室时有一个简单的登录
    输入用户名即可
    需要个数据结构保存用户
    当一个人发送消息 其他人可以接受消息
    张三 : xxxxxx
    当一个人登录 退出时给其他人一些提示
    xxx login
    xxx logout
    管理员发送消息 全部在线成员均可收到

    下面是python程序
    *************************************************************
    import os
    from test import *
    from time import sleep

    print("准备创建进程")
    a = 1

    pid = os.fork()

    if pid < 0:
    print("创建进程失败")
    elif pid == 0:

    print("创建了一个新的进程 a = ",a)
    a = 10000
    else:
    # sleep(0.1)
    print("这是原有的进程")
    # fun2()
    print("a = ",a)

    print("进程执行完毕")
    *************************************************************
    import os
    from time import sleep

    pid = os.fork()

    if pid < 0:
    print("Create process failed")
    elif pid == 0:
    print("Child process")
    print("getpid() :",os.getpid()) #子进程自己获取自己的PID
    print("getppid() :",os.getppid()) #子进程获取它父进程的PID
    print("========================")
    else:
    sleep(1)
    print("Parent process")
    print("pid =",pid) #父进程fork返回值就是子进程PID
    print("getpid():",os.getpid())#父进程获取自己的PID
    *************************************************************
    import os
    from time import sleep

    pid = os.fork()

    if pid < 0:
    print("Create process failed")
    elif pid == 0:
    #父进程已经退出,打印的将是新的父进程的PID
    # sleep(1)
    # print("My parent PID:",os.getppid())
    print("child PID",os.getpid())
    else:
    #子进程退出,父进程不退出
    sleep(1)
    while True:
    pass

    # print("Parent PID:",os.getpid())
    **************************************************************
    import time

    def fun1():
    time.sleep(6)
    print("做完第一件事")

    def fun2():
    time.sleep(4)
    print("做完第二件事")

    if __name__ == "__main__":
    fun1()
    fun2()
    **************************************************************
    from socket import *
    import sys,os

    #确定用哪个文件进行通信
    server_address = './test'

    #判断文件存在性,如果已经存在需要处理
    if os.path.exists(server_address):
    os.unlink(server_address)

    #创建本地套接字
    sockfd = socket(AF_UNIX,SOCK_STREAM)

    #绑定本地套接字文件
    sockfd.bind(server_address)
    #监听
    sockfd.listen(5)

    #收发消息
    while True:
    c,addr = sockfd.accept()
    while True:
    data = c.recv(1024)
    if data:
    print(data.decode())
    c.sendall("收到消息".encode())
    else:
    break
    c.close()
    s.close()
    *********************************************************
    from socket import *
    import sys,os

    #确定用哪个文件进行通信
    server_address = './test'

    #判断文件存在性,如果已经存在需要处理
    if os.path.exists(server_address):
    os.unlink(server_address)

    #创建本地套接字
    sockfd = socket(AF_UNIX,SOCK_STREAM)

    #绑定本地套接字文件
    sockfd.bind(server_address)
    #监听
    sockfd.listen(5)

    #收发消息
    while True:
    c,addr = sockfd.accept()
    while True:
    data = c.recv(1024)
    if data:
    print(data.decode())
    c.sendall("收到消息".encode())
    else:
    break
    c.close()
    s.close()
    ***********************************************************
    import os,sys
    from time import sleep

    pid = os.fork()

    if pid < 0:
    print("Create process failed")
    elif pid == 0:
    print("Child process...",os.getpid())
    sleep(2)
    sys.exit(5)
    else:
    p,status = os.wait()
    print(p,status)
    print(os.WEXITSTATUS(status))
    while True:
    pass
    ************************************************************
    #!/usr/bin/env python3

    from time import sleep

    while True:
    sleep(3)
    print("进程正在运行")
  • 相关阅读:
    POJ 3744:Scout YYF I 概率DP+特征方程+快速幂
    浏览器实现颜色渐变效果(兼容)
    css透明(支持各浏览器)
    sql server密钥
    DDL(Oracle)
    DML(Oralce)
    SQL(Oracle)
    Reflect
    Exception
    XML语法
  • 原文地址:https://www.cnblogs.com/wcin/p/9114204.html
Copyright © 2011-2022 走看看