(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上各种设备.分区.虚拟对象都是挂载到根 ...
随机推荐
- Django模板语言, 过滤器整理
Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...
- MybatisPlus报错Invalid bound statement (not found)的解决方案
今天使用MybatisPlus,测试时报错Invalid bound statement (not found) 使用自定义的mapper接口中的方法可以执行,而调用MybatisPlus中baseM ...
- SpringBootSecurity学习(03)网页版登录添加自定义登录页面
自定义登录页面 前面无论是使用默认配置,还是自定义配置类,都是使用的springboot-security自带的登录页面,自带的登录页面在这个版本虽然设计的非常不错,但是在实际开发中,我们通常还是使用 ...
- .Net Reactor混淆导致匿名类处理出现的问题处理分析
.Net Reactor 是一款比较不错的混淆工具,比VS自带的那个好用很多,一直以来也陪伴着我们的成长,虽然没有完美的混淆工具,不过也算还是不错的,至少能在一定程度上对DLL进行一定的保护处理. 不 ...
- jedis指定数据库
正常情况下,我们通过get或者set方法是从db0中取数据. 1.redis提供了 select命令,可以通过select index 这个指令,将数据库切换到index所在的那个数据库上 2.jed ...
- android系统中对ffmpeg封装最好的免费SDK
android系统中对ffmpeg封装最好的免费SDK; 无论个人还是公司,都免费商用, 欢迎下载. https://github.com/LanSoSdk/LanSoEditor_common 可能 ...
- Terminal MultipleXer---终端复用器tmux基本使用
Terminal MultipleXer---终端复用器tmux 使用场景:1.scp大文件 2:编译大文件 3:多窗口对比文件 1.安装tmux [root@localhost ~]# yum in ...
- Jetpack系列:应用内导航的正确使用方法
今天小编要分享的还是Android Jetpack库的基本使用方法,本篇介绍的内容是Jetpack Navigation组件,让我们一起学习,为完成年初制定的计划而努力吧! *** 组件介绍 导航,是 ...
- 创建新镜像-从已创建的容器中更新镜像并提交镜像(以Nginx为例)
目标:现在我们主要是修改nginx的index.html,然后做一个新镜像 1.基于nginx:1.12运行一个容器 docker run -d -p 8080:80 --name nginx ngi ...
- android 6.0导航栏 NavigationBar影响视图解决办法
在开发app的时候会遇到有些测试手机没有物理按钮,比如最近在做的一个app在小米手机上运行显示效果很好,但是在华为P7手机上显示就乱了,底部的NavigationBar直接覆盖在主视图上,导致按钮无法 ...