一、操作系统发展史

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

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

    缺点: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. select2 分组后的选项无法被选中

    在使用select2组件的过程中发现分组下的选项无法选中,与分组在同一级的选项可以被选中! 1.所用select2版本select2-4.0.32 2.HTML代码: <input id=&qu ...

  2. MySQL 相关规约(v1.0)

    0)前言 a. 基本规约 [强制]表存储引擎必须使用InnoDB(针对主库一般是强制要求的) [强制]表字符集默认使用utf8,必要时候使用utf8mb4(个人踩坑:emoji表情存储问题) 说明: ...

  3. Scrapy项目 - 数据简析 - 实现腾讯网站社会招聘信息爬取的爬虫设计

    一.数据分析截图 本例实验,使用Weka 3.7对腾讯招聘官网中网页上所罗列的招聘信息,如:其中的职位名称.链接.职位类别.人数.地点和发布时间等信息进行数据分析,详见如下图:   图1-1 Weka ...

  4. 调试 内存查看StringCchCopy的运行前后

    // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" int _tmain(int argc, _T ...

  5. 【ASP.NET 基础】WCF入门教程一(什么是WCF)?

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  6. JavaScript是如何工作的:事件循环和异步编程的崛起+ 5种使用 async/await 更好地编码方式!

    为什么单线程是一个限制? 在发布的第一篇文章中,思考了这样一个问题:当调用堆栈中有函数调用需要花费大量时间来处理时会发生什么? 例如,假设在浏览器中运行一个复杂的图像转换算法. 当调用堆栈有函数要执行 ...

  7. 从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    作者 | 至天 阿里巴巴高级研发工程师 一.Volumes 介绍 Pod Volumes 首先来看一下 Pod Volumes 的使用场景: 场景一:如果 pod 中的某一个容器在运行时异常退出,被 ...

  8. MongoDB 学习笔记之 入门安装和配置

    下载MongoDB: 下载解压即可使用. 为了启动方便和统一管理, 在Mongo根目录下建立/data, /logs, /conf文件夹. 在conf文件夹下建立mongodb.conf 文件,基本配 ...

  9. idea tomcat提示Unable to ping server at localhost:1099

    idea启动tomcat报错Unable to ping server at localhost:1099 是 IDEA配置的jdk版本 与 tomcat的jdk版本不配导致的

  10. 网页布局——table布局

    table 的特性决定了它非常适合用来做布局,并且表格中的内容可以自动居中,这是之前用的特别多的一种布局方式 而且也加入了 display:table;dispaly:table-cell 来支持 t ...