zoukankan      html  css  js  c++  java
  • 进程

    一丶 计算机发展史
    1946年第一台计算机诞生,20世纪50年代中期---穿孔卡片
    1,没有操作系统概念,手工的(穿孔卡片)
    1.用户独占全机2.cpu等纯手工操作,cpu运用不充分
    为了摆脱人工操作,让作业自动过渡,出现了批处理


    20世纪50年代后期------批处理
    批处理是加载在计算机中的一个系统软件,能够自动的成批处理作业
    主机与输入机之间增加了一个储存设备--磁带


    20世纪60年代随后又出现了脱批处理
    在批处理的基础上增加了卫星机
    1.卫星机从输入机上读取用户作业到磁带上
    2.从输出磁带上读取执行结果并传给输出机


    多道程序系统

    多道程序技术指:允许多个程序进入内存并运行.并它们交替在cpu中运行,它们共享硬件软件资源
    1.多道:计算机内存中同时存放几道相互独立的程序
    2.宏观并运行:同时进入系统的几道程序都处于运行中
    3.微观串行:实际上程序轮流使用cpu,并且交替运行

    多道程序的意义:
    多道程序系统的出现,标志着操作系统渐趋成熟的阶段,先后出现了作业调度管理、处理机管理、存储器管理、外部设备管理、文件系统管理等功能。
    由于多个程序同时在计算机中运行,开始有了空间隔离的概念,只有内存空间的隔离,才能让数据更加安全、稳定。
    除了空间隔离之外,多道技术还第一次体现了时空复用的特点,遇到IO操作就切换程序,使得cpu的利用率提高了,计算机的工作效率也随之提高。

    多道批处理系统---20世纪60年代
    (1)多道:内存容纳多个作业
    (2)成批:运行中不允许用户作业交互,机器操作作业

    分时系统
    (1)把处理器的运行时间分成很短的时间片,按照时间片来分配作业
    1多路性:若干用户同时使用计算机:微串,宏并
    2交互性:用户可以与系统交互
    3独立性:用户之间独立操作
    4及时性:对用户输入进行及时响应


    实时系统
    分时——现在流行的PC,服务器都是采用这种运行模式,即把CPU的运行分成若干时间片分别处理不同的运算请求 linux系统
    实时——一般用于单片机上、PLC等,比如电梯的上下控制中,对于按键等动作要求进行实时处理


    通用操作系统
    具有多种类型的操作系统,多道批处理,分时,实时.
    至此,操作系统基本趋于完善


    操作系统的进一步发展------20世纪80年代
    1.个人计算机系统:个人有自己的操作系统了
    2.网络操作系统:能上网了
    3.分布式操作系统:
    (1)分布式系统要求一个统一的操作系统,实现系统操作的统一性。
    (2)分布式操作系统管理分布式系统中的所有资源,它负责全系统的资源分配和调度、任务划分、信息传输和控制协调工作,并为用户提供一个统一的界面。
    (3)用户通过这一界面,实现所需要的操作和使用系统资源,至于操作定在哪一台计算机上执行,或使用哪台计算机的资源,则是操作系统完成的,用户不必知道,此谓:系统的透明性。
    (4)分布式系统更强调分布式计算和处理,因此对于多机合作和系统重构、坚强性和容错能力有更高的要求,希望系统有:更短的响应时间、高吞吐量和高可靠性

    操作系统的作用
    系统将硬件与用户相连,用户不用关心底层操作,是一个协调硬件资源与软件资源的控制程序
    (1)隐藏了硬件调用的接口,不用再考虑操作硬件细节
    (2)将应用程序对硬件资源的消耗进行合理分配丶有序.

    什么是程序
    程序是什么:程序是指令丶数据及其组织形式的描述

    什么是进程
    进程是计算机中程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位
    进程是线程的容器.进程是程序的实体
    狭义上:进程是正在运行的程序的实例
    广义上:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.

    操作系统为什么引入进程这个概念
    理论:对正在运行的程序进行抽象
    实际上:是一种数据结构,在于有效的管理


    进程的特性
    动态性:进程是动态产生消亡的
    并发性:任何进程都可以同其他进程一起并发执行
    独立性:进程是独立运行的基本单位,
    异步性:进程相互制约,所以具有间断性,不可预知的向前行进

    结构特征:进程由程序丶数据和进程控制块三部分组成


    程序和进程的关系
    程序是静态的,进程是动态的
    程序可以作为软件资料长期存在,进程有生命期
    程序永久,进程暂时
    就像是管道和水,管道里面的水会流干,而管道依旧在

    进程的调度算法
    1.先来先调度算法:先来的先算,后来的后算
    2.短作业优先调度算法:谁短谁先来
    3.时间片轮流算法:以一段时间为单位,如果超过一个时间段则运行下一个时间段,上一个时间段进入队列后端等待下次轮流
    4.多级反馈队列:
    前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。
    而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度算法的系统中,调度算法的实施过程如下所述。
    (1) 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。
    (2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。

    (3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程。

    进程的并行与并发
    并行是一起行走,并排走
    并发是一起出发但不并排走


    进程的同步异步阻塞非阻塞
    同步:一个程序完成依赖另外一个程序
    异步:不依赖相互独立
    阻塞:系统等待
    非阻塞:系统持续执行
    注意:异步非阻塞效率最高

    进程的创建
    1. 系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印)
    2. 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)
    3. 用户的交互式请求,而创建一个新进程(如用户双击暴风影音)
    4. 一个批处理作业的初始化(只在大型机的批处理系统中应用)
    无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建的。

    进程的结束
    1. 正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)

    2. 出错退出(自愿,python a.py中a.py不存在)

    3. 严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常,try...except...)

    4. 被其他进程杀死(非自愿,如kill -9)

    # 多个进程可以同时执行  并发
    # 我们现在写的一个py文件就自己一个进程  同步执行代码
    # 并发效果:
        # 在我们自己的一个py文件里 启动多个进程
        # 多个进程之间 - 操作系统
    # 如何在自己的py文件里 启动一个进程
    import os
    import time
    from multiprocessing import Process
    def func():
        print('heiheihei')
        time.sleep(1)
        print(os.getpid())
        print('hahaha')
    
    if __name__ == '__main__':
        print('**',os.getpid())
        p = Process(target=func)
        p.start()    #启动一个进程
        print('**',os.getpid())
    python创建一个进程
  • 相关阅读:
    Spring RestTemplate详解(转载)
    单点登录之CAS原理和实现(转载)
    Redis集群的原理和搭建(转载)
    50道Kafka面试题和解析(转载)
    阿里P8架构师谈:Restful、SOAP、RPC、SOA、微服务之间的区别(转载)
    定期喝鸡汤
    Cassandra的架构
    Cassandra的数据模型
    Summary of OAuth 2.0
    林森
  • 原文地址:https://www.cnblogs.com/cangshuchirou/p/8631239.html
Copyright © 2011-2022 走看看