操作系统发展

穿孔卡片

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

批处理

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

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

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

多道技术(单核)

  • 单道: 计算机内存中只运行一个程序
  • 多道: 计算机内存中穿插运行多个程序
    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. SpringBoot基本配置详解

    SpringBoot项目有一些基本的配置,比如启动图案(banner),比如默认配置文件application.properties,以及相关的默认配置项. 示例项目代码在:https://githu ...

  2. ESP8266 使用AT指令

    ESP8266 使用AT指令 问题:串口调试工具输入AT指令没返回结果 分析板子有两种模式 下载模式(默认) 运行模式 解决办法: 方法一:按下板子上的 RST 键位 方法二:使用 [安信可串口调试工 ...

  3. nyoj 260-数数小木块 (打表)

    260-数数小木块 内存限制:64MB 时间限制:3000ms 特判: No 通过数:17 提交数:24 难度:1 题目描述: 在墙角堆放着一堆完全相同的正方体小木块,如下图所示: 因为木块堆得实在是 ...

  4. 从cocos2dx源代码看android和iOS跨平台那些事

    cocos2dx一个跨移动(平板)平台的游戏引擎,支持2d和3d,基于c/c++,网上介绍多在此不详叙.我们本篇关心的是跨平台那些事,自然而然就找到platform目录.好家伙,支持的操作平台还真不少 ...

  5. Redux第一节

    安装脚手架 npm i -g create-react-app 创建一个Dom create-react-app demo01 安装 Ant Design npm i antd --save 安装re ...

  6. node中mysql和短信使用方法(3)

    一.mysql的使用 使用mysql首先得有数据库并且表里面有数据,我创建了数据库newsql,里面Tables有表company等等. company有id,name,other等字段 1.导入my ...

  7. python3快速入门教程错误和异常

    Python 中(至少)有两种错误:语法错误(syntax errors)和异常(exceptions). 语法错误 语法错误又称作解析错误: >>> while True prin ...

  8. linux终端操作

    ------------恢复内容开始------------ tab键自动补全 ls列出当前文件目录: 默认是当前目录 “.”代表当前目录 “..”代表父目录 -a显示所有,而隐藏文件的第一字符为点“ ...

  9. 【译】为什么永远都不要使用MongoDB Why You Should Never Use MongoDB

    背景 最近在学习DDIA(Designing Data-Intensive Applications)这本分布式领域非常急经典的入门书籍,里面第二章<数据模型与查询语言>,强调了对一对多. ...

  10. 转帖:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决

    地址:http://www.ihref.com/read-16422.html