一、操作系统发展史

(一)穿孔卡片(手工操作)

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

    缺点:CPU利用最低

(二)批处理系统(磁带存储)

1. 联机批处理系统

  • 支持多用户去使用一个计算机机房

2. 脱机批处理系统

  • 高速磁盘:提高文件的读取速度
  • 优点:提高CPU的利用率

(三)多道技术

  • 单道:多个使用CPU时是串行

  • 多道(基于单核情况下):

    1. 空间上的复用

      一个CPU可以提供给多个用户使用

    2. 时间上的复用(读取记忆保存)

      切换+保存状态

      • 若CPU遇到IO操作,会立即将当前执行程序CPU使用权断开

        优点:CPU的利用率高

      • 若一个程序使用CPU的时间过长,也会立马将当前执行程序使用权断开

        缺点:程序的执行降低

    3. 并发和并行

      并发:看起来像同时在运行,多个程序不停切换+保存状态

      并行:真正意义上的同时在运行,在多核(多个CPU)情况下,同时执行多个程序

二、进程

(一)程序和进程

  • 程序:一堆代码
  • 进程:一堆代码运行的过程

(二)进程调度

1. 先来先服务调度

根据先后顺序

2. 短作业优先调度

根据用时长短

3. 时间片轮转法

cpu执行的时间1s中,加载N个程序,将1秒等分成多个时间片

4. 分级反馈队列

将执行优先分为多层级别

(三)程序调度时的三个状态

就绪态

所有进程创建时都会进入就绪态,准备调度

运行态

调度后的进程进入运行态

阻塞态

凡是遇到IO操作的进程都会进入阻塞态

若IO结束,必须重新进入就绪态

(三)同步和异步

指的时提交任务的方式

  • 同步

    若有两个任务需要提交,在提交任务时,必须等待该任务执行结束后才能继续提交并执行第二个任务

  • 异步

    若有两个任务提交,在提交第一个任务时,不需要原地等待,立即可以提交并执行第二个任务

(四)阻塞与非阻塞

  • 阻塞

    阻塞态,遇到IO一定会阻塞

  • 非阻塞

    就绪态和运行态

(五)创建进程的两种方式

  1. 创建进程方式一
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

    会将当前父进程代码重新拷贝一份,再去执行

  1. 创建方式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 进程号

  • 进程号回收的两种条件

    1. join,可以回收子进程与主进程
    2. 主进程正常结束,子进程与主进程也会被回收
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 :代表是守护进程

面试题

  1. 同步和异步,阻塞和非阻塞是同一个概念吗?

    答:不是同一个概念,不能混为一谈

  2. 最大化提高cpu的使用率:

    尽可能减少不需要的IO操作

(day28)操作系统发展史+进程的更多相关文章

  1. 操作系统发展史 & 进程

    今日内容 UDP协议 操作系统发展史 进程 单核情况下的进程调度 进程三状态图 同步异步 阻塞非阻塞 内容详细 一.UDP协议 1.什么是UDP协议 UDP是传输层的协议,功能即为在IP的数据报服务之 ...

  2. Python3学习之路~9.2 操作系统发展史介绍、进程与线程区别、线程语法、join、守护线程

    一 操作系统发展史介绍 参考链接:http://www.cnblogs.com/alex3714/articles/5230609.html 二 进程与线程 进程: 对各种资源管理的集合 就可以称为进 ...

  3. UDP代码编写、操作系统发展史、多道技术、进程理论与代码层面创建、进程join方法与进程对象方法

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...

  4. 3、网络并发编程--udp代码、操作系统发展史、多道技术、进程理论

    昨日内容回顾 socket基本使用 # 内置的模块 import socket s = socket.socket() # 默认是TCP协议 也可以切换为UDP协议 s.bind((ip,port)) ...

  5. Python并发编程01 /操作系统发展史、多进程理论

    Python并发编程01 /操作系统发展史.多进程理论 目录 Python并发编程01 /操作系统发展史.多进程理论 1. 操作系统 2. 进程理论 1. 操作系统 定义:管理控制协调计算机中硬件与软 ...

  6. 操作系统:进程管理和IO控制

    一.进程管理 进程管理包括进程控制,进程调度,进程同步与通信,死锁控制四个内容. (一)进程控制 进程是操作系统中运行的基本单位,包括程序段,数据段和进程控制段.操作系统通过进程控制块(PCB)管理进 ...

  7. python 操作系统和进程

    一. 操作系统介绍 多道程序系统 多道程序设计技术       所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种 ...

  8. 【windows 操作系统】进程控制块(PCB)

    转载地址:https://blog.csdn.net/qq_38499859/article/details/80057427一.目录文章目录    操作系统3 ----进程控制块(PCB)详解    ...

  9. 【windows 操作系统】进程

    前言 Windows的内部实现也近似于"一切皆文件"的思想,当然,这一切都只在内核里才有,下载一个WinObj这软件就可以看到,Windows上各种设备.分区.虚拟对象都是挂载到根 ...

随机推荐

  1. Django模板语言, 过滤器整理

    Django模板语言,过滤器整理 1. add {{ value|add:"2" }} 把add后的参数加给value: 处理时,过滤器首先会强制把两个值转换成Int类型. 如果强 ...

  2. MybatisPlus报错Invalid bound statement (not found)的解决方案

    今天使用MybatisPlus,测试时报错Invalid bound statement (not found) 使用自定义的mapper接口中的方法可以执行,而调用MybatisPlus中baseM ...

  3. SpringBootSecurity学习(03)网页版登录添加自定义登录页面

    自定义登录页面 前面无论是使用默认配置,还是自定义配置类,都是使用的springboot-security自带的登录页面,自带的登录页面在这个版本虽然设计的非常不错,但是在实际开发中,我们通常还是使用 ...

  4. .Net Reactor混淆导致匿名类处理出现的问题处理分析

    .Net Reactor 是一款比较不错的混淆工具,比VS自带的那个好用很多,一直以来也陪伴着我们的成长,虽然没有完美的混淆工具,不过也算还是不错的,至少能在一定程度上对DLL进行一定的保护处理. 不 ...

  5. jedis指定数据库

    正常情况下,我们通过get或者set方法是从db0中取数据. 1.redis提供了 select命令,可以通过select index 这个指令,将数据库切换到index所在的那个数据库上 2.jed ...

  6. android系统中对ffmpeg封装最好的免费SDK

    android系统中对ffmpeg封装最好的免费SDK; 无论个人还是公司,都免费商用, 欢迎下载. https://github.com/LanSoSdk/LanSoEditor_common 可能 ...

  7. Terminal MultipleXer---终端复用器tmux基本使用

    Terminal MultipleXer---终端复用器tmux 使用场景:1.scp大文件 2:编译大文件 3:多窗口对比文件 1.安装tmux [root@localhost ~]# yum in ...

  8. Jetpack系列:应用内导航的正确使用方法

    今天小编要分享的还是Android Jetpack库的基本使用方法,本篇介绍的内容是Jetpack Navigation组件,让我们一起学习,为完成年初制定的计划而努力吧! *** 组件介绍 导航,是 ...

  9. 创建新镜像-从已创建的容器中更新镜像并提交镜像(以Nginx为例)

    目标:现在我们主要是修改nginx的index.html,然后做一个新镜像 1.基于nginx:1.12运行一个容器 docker run -d -p 8080:80 --name nginx ngi ...

  10. android 6.0导航栏 NavigationBar影响视图解决办法

    在开发app的时候会遇到有些测试手机没有物理按钮,比如最近在做的一个app在小米手机上运行显示效果很好,但是在华为P7手机上显示就乱了,底部的NavigationBar直接覆盖在主视图上,导致按钮无法 ...