操作系统发展

穿孔卡片

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

批处理

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

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

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

多道技术(单核)

  • 单道: 计算机内存中只运行一个程序
  • 多道: 计算机内存中穿插运行多个程序
    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. 阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

    为什么要做这个工具? 由于阿里云上的容器服务 ACK 在使用成本.运维成本.方便性.长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes ...

  2. 一.web服务机制

    web服务机制 我们先跟着**(Web服务器工作原理总体描述01)这张图,将一次Web服务的工作流程过一遍,我们假设以浏览器作为客户端(1) 用户做出了一个操作,可以是填写网址敲回车,可以是点击链接, ...

  3. poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35999   Accepted: 13145 ...

  4. 领扣(LeetCode)合并两个有序数组 个人题解

    给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n. ...

  5. expect 自动填充密码

    它的脚本以#!/usr/bin/expect开头,执行时用expoct,而不是bash.我的一个给samba自动创建用户并且自动填写默认密码的脚本如下: vim smb_passwd.exp #!/u ...

  6. Pytorch文本分类(imdb数据集),含DataLoader数据加载,最优模型保存

    用pytorch进行文本分类,数据集为keras内置的imdb影评数据(二分类),代码包含六个部分(详见代码) 使用环境: pytorch:1.1.0 cuda:10.0 gpu:RTX2070 (1 ...

  7. Alibaba Nacos 学习(二):Spring Cloud Nacos Config

    Alibaba Nacos 学习(一):Nacos介绍与安装 Alibaba Nacos 学习(二):Spring Cloud Nacos Config Alibaba Nacos 学习(三):Spr ...

  8. mybatis源码学习(一) 原生mybatis源码学习

    最近这一周,主要在学习mybatis相关的源码,所以记录一下吧,算是一点学习心得 个人觉得,mybatis的源码,大致可以分为两部分,一是原生的mybatis,二是和spring整合之后的mybati ...

  9. 使用laravel快速构建vuepress管理器

    使用laravel快速构建vuepress管理器 介绍 刚刚学了下laravel感觉很方便,最近也在用vuepress做个人博客,但是感觉每次写文章管理文章不是特别方便,就使用laravel写了这个v ...

  10. 2019牛客暑期多校训练营(第九场) E All men are brothers

    传送门 知识点:并查集+组合数学 并查集合并操作可以理解为使得两个集合的人互相成为朋友,也就是两个集合并在了一起,答案是要求从所有人中挑出四个互相不是朋友的四个人,比较基础的组合数学知识,但因为每个集 ...