(day28)操作系统发展史+进程
目录
一、操作系统发展史
(一)穿孔卡片(手工操作)
一个计算机机房只能被一个卡片使用
缺点:CPU利用最低
(二)批处理系统(磁带存储)
1. 联机批处理系统
- 支持多用户去使用一个计算机机房
2. 脱机批处理系统
- 高速磁盘:提高文件的读取速度
- 优点:提高CPU的利用率
(三)多道技术
单道:多个使用CPU时是串行
多道(基于单核情况下):
空间上的复用
一个CPU可以提供给多个用户使用
时间上的复用(读取记忆保存)
切换+保存状态
若CPU遇到IO操作,会立即将当前执行程序CPU使用权断开
优点:CPU的利用率高
若一个程序使用CPU的时间过长,也会立马将当前执行程序使用权断开
缺点:程序的执行降低
并发和并行
并发:看起来像同时在运行,多个程序不停切换+保存状态
并行:真正意义上的同时在运行,在多核(多个CPU)情况下,同时执行多个程序
二、进程
(一)程序和进程
- 程序:一堆代码
- 进程:一堆代码运行的过程
(二)进程调度
1. 先来先服务调度
根据先后顺序
2. 短作业优先调度
根据用时长短
3. 时间片轮转法
cpu执行的时间1s中,加载N个程序,将1秒等分成多个时间片
4. 分级反馈队列
将执行优先分为多层级别
(三)程序调度时的三个状态
就绪态
所有进程创建时都会进入就绪态,准备调度
运行态
调度后的进程进入运行态
阻塞态
凡是遇到IO操作的进程都会进入阻塞态
若IO结束,必须重新进入就绪态
(三)同步和异步
指的时提交任务的方式
同步
若有两个任务需要提交,在提交任务时,必须等待该任务执行结束后才能继续提交并执行第二个任务
异步
若有两个任务提交,在提交第一个任务时,不需要原地等待,立即可以提交并执行第二个任务
(四)阻塞与非阻塞
阻塞
阻塞态,遇到IO一定会阻塞
非阻塞
就绪态和运行态
(五)创建进程的两种方式
- 创建进程方式一
from multiprocessing import Process
import time
# 定义一个任务
def task(name):
print(f'{name}开始执行任务')
time.sleep(1)
print(f'{name}的任务已经结束')
# target = 执行函数的地址,json位元组,传值给target指向的函数
if __name__ == '__main__':
p = Process(target = task,args = ('json',))
# 像操作系统提交创建进程
p.start()
windows
在window系统下,创建子进程,windows会把父进程代码重新加载一次
linux/max
会将当前父进程代码重新拷贝一份,再去执行
- 创建方式2
class MyProcess(Process):
def run(self): # 必须是run
print(f'{name}开始执行任务')
time.sleep(1)
print(f'{name}的任务已经结束')
if if __name__ == '__main__':
p = MyProcess()
p.start()
(六)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 = ('json',))
p.start() # 告诉操作系统启动子进程
p.join() # 告诉操作系统先结束子进程,再结束父进程
print('主进程')
(七)进程间数据是相互隔离的
主进程和子进程回有各自的名称空间
from multiprocess import Process
x = 100
def func():
global x
x = 200
if __name__ == '__main__':
p = Process(target = func)
p.start()
print(x) # 100
print('主进程')
(八)进程对象的属性
current_process().pid:获取子进程号os.getpid():获取主进程号os.getppid():获取主主进程号p.is_alive():判断子进程是否存活p.terminate():终止子进程cmd中查看进程号:
tasklist|findstr 进程号进程号回收的两种条件
- join,可以回收子进程与主进程
- 主进程正常结束,子进程与主进程也会被回收
from multiprocessing import Process
from multiprocessing import current_process
import os
import time
def task(name):
# 获取子进程号
print(f'{name}开始执行任务',current_process().pid)
time.sleep(1)
print(f'{name}的任务已经结束',current_process().pid)
if __name__ == '__main__':
p = Process(target = task,args = ('json',))
p.start()
p.join()
# 直接告诉操作系统,终止子进程
p.terminate()
time.sleep(0.1) # 主进程进入阻塞态,子进程进入运行态
# 判断子进程是否存活
print(p.is_alive())
# 获取主进程号
print('主进程',os.getpid())
# 获取主主进程号
print('主主进程',os.getppid())
(九)僵尸进程与孤儿进程(了解)
僵尸进程
指的是,子进程已经结束,但是pid号还存在,没有销毁,会占用pid号,占用操作系统资源
孤儿进程
指的是,子进程还在执行,但父进程意外结束
操作系统优化机制:会回收孤儿进程
(十) 守护进程
指的是,主进程结束后,该主进程产生的所有子进程也会跟着结束,并结束
p1.daemon = True :代表是守护进程
面试题
同步和异步,阻塞和非阻塞是同一个概念吗?
答:不是同一个概念,不能混为一谈
最大化提高cpu的使用率:
尽可能减少不需要的IO操作
(day28)操作系统发展史+进程的更多相关文章
- 操作系统发展史 & 进程
今日内容 UDP协议 操作系统发展史 进程 单核情况下的进程调度 进程三状态图 同步异步 阻塞非阻塞 内容详细 一.UDP协议 1.什么是UDP协议 UDP是传输层的协议,功能即为在IP的数据报服务之 ...
- Python3学习之路~9.2 操作系统发展史介绍、进程与线程区别、线程语法、join、守护线程
一 操作系统发展史介绍 参考链接:http://www.cnblogs.com/alex3714/articles/5230609.html 二 进程与线程 进程: 对各种资源管理的集合 就可以称为进 ...
- UDP代码编写、操作系统发展史、多道技术、进程理论与代码层面创建、进程join方法与进程对象方法
昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...
- 3、网络并发编程--udp代码、操作系统发展史、多道技术、进程理论
昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...
- Python并发编程01 /操作系统发展史、多进程理论
Python并发编程01 /操作系统发展史.多进程理论 目录 Python并发编程01 /操作系统发展史.多进程理论 1. 操作系统 2. 进程理论 1. 操作系统 定义:管理控制协调计算机中硬件与软 ...
- 操作系统:进程管理和IO控制
一.进程管理 进程管理包括进程控制,进程调度,进程同步与通信,死锁控制四个内容. (一)进程控制 进程是操作系统中运行的基本单位,包括程序段,数据段和进程控制段.操作系统通过进程控制块(PCB)管理进 ...
- python 操作系统和进程
一. 操作系统介绍 多道程序系统 多道程序设计技术 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种 ...
- 【windows 操作系统】进程控制块(PCB)
转载地址:https://blog.csdn.net/qq_38499859/article/details/80057427一.目录文章目录 操作系统3 ----进程控制块(PCB)详解 ...
- 【windows 操作系统】进程
前言 Windows的内部实现也近似于"一切皆文件"的思想,当然,这一切都只在内核里才有,下载一个WinObj这软件就可以看到,Windows上各种设备.分区.虚拟对象都是挂载到根 ...
随机推荐
- python2.x和python3.x版本共存时选择启动的版本
在windows环境下装好python2.7和python3.6之后,我之前一直是用了很笨的办法去区分版本 那就是把各个版本python安装目录下的python.exe分别改为python2.exe和 ...
- 夯实Java基础系列7:一文读懂Java 代码块和执行顺序
目录 Java中的构造方法 构造方法简介 构造方法实例 例 1 例 2 Java中的几种构造方法详解 普通构造方法 默认构造方法 重载构造方法 java子类构造方法调用父类构造方法 Java中的代码块 ...
- 初识PE文件结构
前言 目前网络上有关PE文件结构说明的文章太多了,自己的这篇文章只是单纯的记录自己对PE文件结构的学习.理解和总结. 基础概念 PE(Portable Executable:可移植的执行体)是Win3 ...
- openssl req(生成证书请求和自建CA)(转)
openssl req(生成证书请求和自建CA) 伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA.由于openssl req命令选项较多,所以先各举几个例子,再集中 ...
- spring后台重定向方式
1.直接返回值中加重定向:"redirect:要访问的网址"; public String updateOrAddProject() { return "redirect ...
- 创建FTP访问的YUM源
创建FTP访问的YUM源 一.安装vsftpd(步骤详见“在linux中搭建vsftpd.docx”) 在主机A上安装FTP,安装后的ftp信息如下:ftp://192.168.43.300 账号密 ...
- Grafana 6.4 正式发布!
原文链接:Grafana 6.4 正式发布! 2019 年 10 月 2 日,也就是国内小伙伴们的放假期间,Grafana 实验室正式发布了 Grafana 6.4 版本.这个版本主要围绕数据模型和指 ...
- sbt 学习笔记(1)sbt安装和交互式界面使用
下载sbt: http://www.scala-sbt.org/download.html 解压zip文件F:\sbt-0.13.15 配置环境变量 如果需要可以修改F:\sbt-0.13.15\sb ...
- B/S 工业互联网 地铁行业
前言 近几年,互联网与交通运输的融合,改变了交易模式,影响着运输组织和经营方式,改变了运输主体的市场结构.模糊了运营与非营运的界限,也更好的实现了交通资源的集约共享,同时使得更多依靠外力和企业推动交通 ...
- webpack loader实现
正值前端组件化开发时代,那么必然离不开目前最火的构建工具--webpack(grunt,gulp等暂且不谈).说到这里,刚好有几个问题: 为什么运行打包命令之后,.vue 文件可以转成 .js 文件 ...