操作系统发展

穿孔卡片

  • 一个计算机机房, 一次只能被一个卡片使用

批处理

  • 将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行

  • 联机批处理系统: 在主机与输入机之间增加一个存储设备--磁带

  • 脱机批处理系统: 增加一台不与主机相连而专门用于与输入/输出设备打交道的卫星机

多道技术(单核)

  • 单道: 计算机内存中只运行一个程序
  • 多道: 计算机内存中穿插运行多个程序
    1. 当前执行程序遇到I/O操作, CPU会转而运行其他程序
    2. 当前程序占用CPU时间过长, CPU也会运行其他程序
    3. 优点: 提高CPU的利用率
    4. 缺点: 程序的执行效率降低

并发与并行

  • 并发: 在一个时间段内有多个程序在运行(分时交替)
  • 并行: 在一个时间点有多个程序在运行

进程

程序与进程

  • 程序: 有序的指令和数据的集合
  • 进程: 程序关于某个数据集合的一次运行活动, 是系统进行资源分配和调度的基本单位

进程调度

  • 先来先服务: 哪个进程先就绪就占用CPU, 进程阻塞或结束让出CPU
  • 短作业优先: 预计执行时间短的进程优先
  • 时间片轮转: 进程在就绪队列的等待时间与享受服务的时间成正比
  • 多级反馈队列: 设置多个就绪队列, 分布赋予不同的优先级

进程的三个状态

  • 就绪状态: 所有进程创建时都会进入就绪状态, 准备被调度
  • 运行状态: 进程被调度后就会获得CPU执行, 成为运行状态
  • 阻塞状态: 当进程遇到I/O操作时, 就会变为阻塞状态

同步和异步

  • 面向被调用者的消息通知机制

  • 同步: 被调用者得到结果再返回

  • 异步: 被调用方先返回, 再执行, 得到结果后再通知调用者

阻塞与非阻塞

  • 面向调用者的消息等待时的状态

  • 阻塞: 在调用结果返回前, 当前线程会被挂起等待, 知道拿到调用结果才会继续进行

  • 非阻塞: 在调用结果返回前, 可以继续进行其他操作

僵尸进程与孤儿进程

  • 僵尸进程: 指的是子进程已经结束, 但PID还在, 未被回收
  • 孤儿进程: 指的是子进程还在进行, 但父进程意外结束

守护进程

  • 指的是主进程结束后, 该主进程产生的所有子进程跟着结束并回收
from multiprocessing import Process
from multiprocessing import current_process
import time def task(name):
print(f'{name} started...', current_process().pid)
time.sleep(1)
print(f'{name} stopped...', current_process().pid) if __name__ == '__main__':
p = Process(target=task, args=('bigb',))
p.daemon = True
p.start()
print('主进程') # 主进程

Python中的进程操作

Process创建进程

from multiprocessing import Process
import time def task(name):
print(f'{name}的任务开始执行!')
time.sleep(1)
print(f'{name}的任务已经结束!') # 创建子进程时, 子进程会加载并执行父进程代码
if __name__ == '__main__':
# targent=执行函数的地址, args是该函数需要传入的参数
p = Process(target=task, args=('bigb',))
# 启动进程,并调用子进程中的p.run()
p.start()
print('主进程') '''
主进程
bigb的任务开始执行!
bigb的任务已经结束! '''
from multiprocessing import Process
import time class MyProcess(Process):
def run(self):
print('子进程任务开始执行!')
time.sleep(1)
print('子进程任务已经结束!') if __name__ == '__main__':
p = MyProcess()
# 启动进程,并调用子进程中的p.run()
p.start()
print('主进程') '''
主进程
子进程任务开始执行!
子进程任务已经结束!
'''
  • p.join()主进程等待子进程终止
from multiprocessing import Process
import time def task(name):
print(f'{name}的任务开始执行!')
time.sleep(1)
print(f'{name}的任务已经结束!') if __name__ == '__main__':
p = Process(target=task, args=('bigb',))
p.start()
p.join()
print('主进程') '''
bigb的任务开始执行!
bigb的任务已经结束!
主进程
'''
  • current_process().pid 获取子进程pid
  • os.getpid 获取主进程pid
  • tasklist | findstr pid cmd中查看pid属于哪个进程
  • p.is_alive() 判断p进程是否存活
  • p.terminate() 终止p进程

进程间数据相互隔离

from multiprocessing import Process

x = 1

def foo():
global x
x = 2 if __name__ == '__main__':
p = Process(target=foo)
p.start()
print(x) # 1

Python3 并发编程1的更多相关文章

  1. Python3 并发编程4

    目录 Event事件 线程池与进程池 基本概念 使用方法 和信号量的区别 协程(coroutine) 基本概念 实现方式 多线程爬取梨视频 Event事件 用来控制线程的执行 e.isSet()查看对 ...

  2. Python3 并发编程3

    目录 GIL全局解释器锁 基本概念 多线程的作用 死锁现象 递归锁 信号量 线程队列 GIL全局解释器锁 基本概念 global interpreter lock 全局解释器锁 GIL不是Python ...

  3. Python3 并发编程小练习

    实现基于TCP协议套接字,服务端实现接收客户端的连接并发 # server.py import socket from threading import Thread server = socket. ...

  4. Python3 并发编程2

    目录 进程互斥锁 基本概念 互斥锁的使用 IPC 基本概念 队列 生产者消费者模型 基本概念 代码实现 线程 基本概念 创建线程 线程互斥锁 进程互斥锁 基本概念 临界资源: 一次仅允许一个进程使用的 ...

  5. Python3 与 C# 并发编程之~ 进程篇

      上次说了很多Linux下进程相关知识,这边不再复述,下面来说说Python的并发编程,如有错误欢迎提出- 如果遇到听不懂的可以看上一次的文章:https://www.cnblogs.com/dot ...

  6. Python3 与 C# 并发编程之~ 协程篇

      3.协程篇¶ 去年微信公众号就陆陆续续发布了,我一直以为博客也汇总同步了,这几天有朋友说一直没找到,遂发现,的确是漏了,所以补上一篇 在线预览:https://github.lesschina.c ...

  7. Python3 与 C# 并发编程之~进程先导篇

      在线预览:http://github.lesschina.com/python/base/concurrency/1.并发编程-进程先导篇.html Python3 与 C# 并发编程之- 进程篇 ...

  8. Python3 与 C# 并发编程之~ 线程篇

      2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...

  9. asyncio:python3未来并发编程主流、充满野心的模块

    介绍 asyncio是Python在3.5中正式引入的标准库,这是Python未来的并发编程的主流,非常重要的一个模块.有一个web框架叫sanic,就是基于asyncio,语法和flask类似,使用 ...

随机推荐

  1. ThinkPHP 6.0 管道模式与中间件的实现分析

    设计模式六大原则 开放封闭原则:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象. 依赖倒置原则:高层模块不应该依赖低层模块,二者 ...

  2. [多态] java笔记之多态性

    1.多态,说的是对象,说的不是类. 2. 3.多态 = polymorphism 4. 调用如下: 5. 6.口诀: 7.对象的向上转型: 8.对象的向下转型: 9.下面这个异常叫做ClassCast ...

  3. PostGIS 使用Mysql_fdw同步ArcGIS填坑记录

    ##实现Mysql_fdw数据同步过程中,出现过很多坑,开此贴记录一下 1.触发器记录 这里insert的时候,采用过insert into f_pressureline select new.*,出 ...

  4. cognos服务器性能测试诊断分析优化过程记录

    前段时间客户方一个系统上线后出现性能问题,就是查询报表的时候出现宕机现象,应项目组要求过去帮忙测试优化问题.  该项目的架构相对比较复杂,登录后要先进行认证服务器认证用户然后登录到应用系统A,在跳转到 ...

  5. 【Luogu P2563】【集训Day 4 动态规划】质数和分解

    题目链接:Luogu P2563 质数和分解(prime) [问题描述] 任何大于 1 的自然数 N,都可以写成若干个大于等于2且小于等于 N 的质数之和表达式(包括只有一个数构成的和表达式的情况), ...

  6. python变量、输入输出-xdd

    1.注释 #输入身高,计算BMI 注释1,单行注释... 注释2,多行注释xiedong.. 2.中文编码声明,UTF-8编码声明 # coding=编码 # coding=utf-8 3.建议每行不 ...

  7. 如何运用DDD - 实体

    目录 如何运用DDD - 实体 概述 何为实体 似曾相识 你确定它真的需要ID吗 运用实体 结合值对象 为实体赋予它的行为 尝试转移一部分行为给值对象 愿景是美好的 现实是残酷的 总结 如何运用DDD ...

  8. java学习引言

    Java学习之路:不走弯路,就是捷径 0.引言 软件开发之路是充满荆棘与挑战之路,也是充满希望之路.Java学习也是如此,没有捷径可走.梦想像<天龙八部>中虚竹一样被无崖子醍醐灌顶而轻松获 ...

  9. java 获取当前年份 月份 日期

    import java.util.Calendar; public class Main {  public static void main(String[] args) {    Calendar ...

  10. c语言l博客作业09

    问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-2/homework/8655 我在 ...