(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上各种设备.分区.虚拟对象都是挂载到根 ...
随机推荐
- 第八届蓝桥杯java b组第一题
1,标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购 ...
- Git初始化项目 和 Gitignore
初始化init: git init git status git add . git commit -am "init projrct" 添加远程仓库: git remote ad ...
- 从壹开始 [Admin] 之五 ║ 实现『按钮』级别权限配置
一.前情回顾 哈喽大家好,在这个欢庆的日子里,老张祝大家工作都能蒸蒸日上!今天正好也是社团成立的第一天,我也是希望今天能是个纪念日,沾沾这个大喜庆! 放假这两天,倒是学到了很多东西,我这个也是承认的, ...
- 站内搜索(ELK)之数据目录
在使用elasticsearch建设站内搜索时,随着数据不断丰富,为了数据管理更加精细化,必须建立并实时维护“数据目录”(在程序设计中对应的叫法“数据字典”). 数据目录需要包含以下几个维度:数据名称 ...
- Fork/Join 框架框架使用
1.介绍 Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.在多核计算机中正确使用可以很好的 ...
- JS/JQuery 禁用超链接a
JS // 禁用超链接元素elem ; document.getElementById(elemID).setAttribute('disabled', 'disabled'); // 启用超链接元素 ...
- JS实现数组排序的方法
前言 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列,当然排序也是算法中的一种,javascript内置的sort函数是多种排序算法的集合,数组在原数组上进 ...
- python 虚拟环境配置
刚学习 python 的同学经常会遇到一个问题: 已经安装了特定的包或者第三库,但是 pycharm 总是提示没有找到.
- Java内存模型总结
Java内存模型 内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象,不同架构下的物理机拥有不一样的内存模型,Java虚拟机也有自己的内存模型,即Java内存模型(J ...
- Java学习笔记之基础语法(数组)
数组 数组概述:是具有相同数据类型的数据的集合 数组的定义:数据类型 数组名 [] 数组特点: 1,数组是引用数据类型. 2,数组值用大括号,元素之间用逗号隔开,元素的个数是0-N个 3,数组长度是固 ...