一、操作系统发展史

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

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

    缺点: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. 配置文件my.cnf---配置信息注释大全

    在进行MySQL与CM+CHD之间的应用配置时,发现此前对于MySQL的配置含义过于模糊,所以将CM+CHD集群所涉及MySQL方面的配置含义进行抽取并加以注释,方便此后的配置和使用. 一.客户端设置 ...

  2. Scrapy项目 - 数据简析 - 实现豆瓣 Top250 电影信息爬取的爬虫设计

    一.数据分析截图(weka数据分析截图 ) 本例实验,使用Weka 3.7对豆瓣电影网页上所罗列的上映电影信息,如:标题.主要信息(年份.国家.类型)和评分等的信息进行数据分析,Weka 3.7数据分 ...

  3. JsonConfig的jsonConfig.setExcludes的用法

    1.问题描述 在项目中经常会有两个类存在一对多或者多对一的关联关系,这样在查询多的一方时,会深入查询关联的一方,而我们可能并不需要去深入查询那些数据,此时使用JsonConfig的jsonConfig ...

  4. Linux mint 启动文本模式(不启动图形界面)

    Linux Mint 系统用了很久,很顺手,赞一个! 有一天想同时运行多个虚拟机linux系统做实验,想着只启动文本模式可以省点内存资源,结果试了多种方法都不成功,网上现有针对Ubuntu原版和Cen ...

  5. linux mint 17编译android 2.3.1错误记录

    有转载这里的也有添加的. ################# Fix 1 ########################## Error: frameworks/base/include/utils ...

  6. ZK集群如何保证数据一致性源码阅读

    什么是数据一致性? 只有当服务端的ZK存在多台时,才会出现数据一致性的问题, 服务端存在多台服务器,他们被划分成了不同的角色,只有一台Leader,多台Follower和多台Observer, 他们中 ...

  7. SUSE Linux Enterprise 15 SP1 系统安装

    从 SUSE Linux Enterprise Server 15 开始,安装媒体仅包含安装程序 - 一个用于安装.更新和注册 SUSE Linux Enterprise Server 的基于命令行的 ...

  8. linux脚本入门之终端显示输出

    主要基本命令为 echo 与 printf. 关于echo: 其语法结构为:echo -选项参数 字符串: 例如:echo hello,world   echo 'hello,world'  echo ...

  9. openpyxl中遇到TypeError: 'generator' object is not subscriptable的问题和解决方案

    今天在搭建驱动数据框架用到了一个叫 openpyxl的包用来解析excel数据 随后就出现了TypeError: 'generator' object is not subscriptable的bug ...

  10. Spring Cloud Feign 总结问题,注意点,性能调优,切换okhttp3

    ### Feign常见问题总结 **FeignClient接口如使用`@PathVariable` ,必须指定value属性** ```java //在一些早期版本中, @PathVariable(& ...