一、操作系统发展史

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

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

    缺点: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. Python学习-列表深浅拷贝

    一.先看一个简单的赋值语句 lst1 = ['France', 'Belgium', 'England'] lst2 = lst1 # lst1.append('Uruguay') lst2.appe ...

  2. ubuntu linux重置密码

    (和网上的有点不一样,记录一下) 1)重启系统,同时长时间按住shift键进入grub菜单:GNU GRUB version 1.99-12ubuntu5(如图一) 2)选择Ubuntu, with ...

  3. java异常类的妙用

    异常类的妙用   以往在使用异常时,只是知道通过异常类的构造方法设置一些出错信息,此外最多就是把引起该异常的原因通过Throwable类的子类一同设置进去.今天在分析springSecurity3.0 ...

  4. SharePoint 2013 Sandbox Solution

    昨天在写SharePoint EventReceiver的时候遇到一个问题,创建了一个local farm SharePoint solution,添加了一个ItemAdded(SPItemEvent ...

  5. idea 设置jvm参数

    使用IDEA进行JVM参数设置: Run->Edit Configurations... 进入之后: 之后就可以运行代码测试,可以看到控制台打印的信息: 说明: -Xms:20M 初始化堆内存大 ...

  6. centos 下安装 Let’s Encrypt 永久免费 SSL 证书

    功能 https证书,免费版,每三个月续签一次,可以用过脚本自动续签 安装 ssh登录到域名配置所在的主机(nginx,apache等) 安装git yum -y install git 输入 git ...

  7. Shell之变量

    目录 Shell之变量 参考 变量命名规则 变量语法规范 四种变量类型 系统变量 特殊变量 变量的使用 变量内容的删除和替换 Shell之变量

  8. ng的显示与隐藏

    显示与隐藏有很多中方法,但是在ng中有自己的显示与隐藏的方法 ng-if 或者[hidden] 在此主要介绍的是[hidden] 在ng中需要摒弃dom操作的方法,使用[hidden] 使用方法: e ...

  9. mysql中间件分享(Mysql-prxoy,Atlas,DBProxy,Amoeba,cobar,TDDL)

    hello 各位小伙伴大家好,我是小栈君,这期我们分享关于mysql中间件的研究,也就是数据层的读写分离和负载均衡,希望能够在实际的应用中能够帮助到各位小伙伴. 下期我们将继续分享go语言的系列讲解, ...

  10. opencv之膨胀与腐蚀

    腐蚀和膨胀 Erosion/Dilation erosion/dilation,用白话说,就是让图像亮的区域收缩和扩张. 原理 我们定义一个卷积核矩阵.这个矩阵可以是任何形状的,但通常而言,是矩形或者 ...