并发编程(理论)

并发编程

并发与串行

为何要并发(以前程序所存在的问题)

  • 程序默认执行方式是串行(即程序自上而下,一行一行顺序执行,必须把当前任务执行完毕,才能开始执行下一个任务,不管当前任务须要多长时间)
  • 问题举例:
    • 如:TCP的服务器中,若是正在进行通信循环,则没法处理其余的客户端请求
    • 如:执行了input语句,用户不输入,则一直卡在原理
  • 学习并发的目的就是要编写能够同时执行多个任务的程序,来提升效率

串行和并发都是程序处理任务的方式linux

实现并发的方式

  1. 多进程
  2. 多线程
  3. 协程

进程是什么

进程指的是正在运行中的程序,是操做系统调度以及进行资源分配的基础单位编程

是一个资源单位windows

当把一个程序从硬盘读入到内存,进程就产生了浏览器

  • 多进程
    • 指的是同一时间有多个程序被装入内存并执行

进程来自于操做系统,由操做系统进行调度以及资源分配安全

多进程的实现原理其实就是操做系统调度进程的原理服务器

多道技术

实现原理:多线程

1.空间复用 并发

​ 同一时间,加载多个任务到内存中,多个进程之间内存区域须要相互隔离(这种隔离是物理隔离),其目的是为了保证数据安全socket

2.时间复用

​ 操做系统会在多个进程之间作切换执行

切换任务的两种状况

  1. 当一个进程遇到了IO操做时会自动切换

  2. 当一个任务执行时间超过阈值会强制切换(时间不会太长,切换的够快用户就感觉不到是串行的)

    注意:在切换前必须保存状态,以便后续恢复执行。而且频繁的切换也须要消耗资源

    其实当全部任务都没有IO操做时,切换执行(上下文切换)效率反而更低,可是为了保证并发执行,必须牺牲效率

简单的总结就是切换加保存

有了多道技术,计算机就能够同时并发的处理多个任务

并发编程中的重要概念

串行:自上而下顺序执行

并发:多个任务同时执行,可是本质是在多个进程之间切换执行,因为速度很是快因此感受是同时运行

并行:是真正的同时运行,必须具有多核CPU,有几个核心就能并行几个任务,可是任务数量超过核心数时仍是并发执行

以上三个概念都是用于描述处理任务的方式

阻塞:指的是程序遇到了IO操做,没法继续执行代码时的一种状态

非阻塞:指的是程序没有遇到IO操做的一个状态

​ input() 默认是一个阻塞的操做

​ 咱们能够用一些手段将阻塞的操做变成非阻塞的操做,例如非阻塞的socket

一个进程的三种状态

  • 阻塞

  • 运行

  • 就绪

野指针,僵尸指针,内存泄漏

野指针:变量名没有删除

僵尸指针:变量值没有被使用可是引用计数却不为0

进程的建立和销毁(了解)

对于计算机而言,必须具有建立和销毁进程的能力

建立:

  1. 用户的交互式请求,鼠标双击

  2. 由一个正在运行的程序,调用了开启进程的接口,例如subprocess
  3. 一个批处理做业开始
  4. 系统初始化

销毁:

  1. 任务完成, 自愿退出
  2. 强制结束 taskkill(windows),kill(linux)非自愿退出
  3. 程序遇到了异常
  4. 严重错误,访问了不应访问的内存

进程和程序(了解)

程序是一堆代码放在一个文件中,一般后缀是exe,本来是储存在硬盘上的

进程是将代码从硬盘读取到内存而后执行,产生的

进程是由程序产生的

一个程序能够产生多个进程,例如qq多开,每个进程都具有一个PID,且是惟一的

进程的层级关系(了解)

在linux中,进程具有父子关系,是一个树状结构,能够相互查找,但不能使用

当一个程序开启了另外一个不属于本身管理的资源,手里握着对方的地址信息,也就是句柄

在windows中,没有层级关系,父进程能够将子进程的句柄转让

父进程 子进程?

例如qq开启了浏览器,那么qq是父进程,浏览器是子进程

PID和PPID(了解)

PID 当前进程的编号

PPID 父进程的编号

在pycharm中访问PID与PPID

import os

os.getpid()
os.getppid()

在cmd中查找程序的pid

tasklist | findstr python

注意:当咱们运行Py文件时,其实运行的是python解释器进程

相关文章
相关标签/搜索