操作系统与进程基础知识

一、操作系统基础知识
(一)操作系统背景知识:1946年第一台计算机
1.手工操作 —— 穿孔卡片
 用户独占,不用等待,资源利用率低,cpu利用不充分
2.批处理:---串行
联机批处理,作业的输入/输出由CPU来处理,读磁带速度快,不足CPU利用率低
脱机批处理,输入/输出脱离主机控制,由卫星机控制,读磁带和cpu共同工作,节省了等待时间,不足是
遇到I/O时候,cpu等待时间浪费资源
3.多道程序系统:---并行***
是同一时间允许多个程序并行,当一个道的程序遇到 I/O操作等待的时候,
cpu立马转向另一道运行,节省了等待时间
实质上多道的转换也是需要时间的,所以多道程序其实是降低了CPU的效率,但是达到多个程序同时运行效果
#***标志着操作系统的渐趋成熟,出现了文件系统管理,作业调度管理,存储器管理,外部设备管理 #***出现空间隔离概念,内存互相隔离,让数据更安全 #***出现时空复用概念,遇到IO操作就切换程序,cpu效率提高
分时间片工作,按时间片轮流把处理机分配给各联机作业使用
但是其实并没有提高效率,因为自己的时间片没有走完,可能就被轮走了,时间片轮转也是耗费时间的
分时系统
实时系统,实时控制和信息处理,独享资源,一般用于飞机飞行、导弹发射;预定飞机票、查询有关航班、航线、票价等
实时系统
4.通用操作系统:
具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。
UNIX操作系统:通用的多用户分时交互型的操作系统
(二)操作系统的进一步发展
"""
1.个人计算机操作系统:专供个人使用
2.网络操作系统:增加了个人操作系统中按照网络协议增添了网络管理模块
3.分布式操作系统:统一的操作系统实现统一操作,分布式系统更强调分布式计算和处理,因此对于多机合作和系统重构、坚强性和容错能力有更高的要求,希望系统有:更短的响应时间、高吞吐量和高可靠性。
"""
(三)操作系统的功能
"""
操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序,
程序员直接跳过繁琐的硬件操作,通过应用软件直接使用操作系统提供的功能来间接使用硬件。
"""
# 二、进程---正在运行的一个程序的抽象
"""
必备的理论基础:首先是操作系统提供良好的借口,让竞争变的有序,其次是多道技术,时空的复用,空间的隔离。
强调:遇到I/O 切,遇到cpu占用过多的也切,核心能够把切走的进程保存,下次切到了继续从之前的位置运行
"""
(一)概念:
"""
进程是资源分配和调度的最小单元,进程是一个实体,动态产生和消亡,它是程序的容器,是执行中的程序,程序是永久的,进程是暂时。多道程序设计操作系统都建立在进程的基础上
"""
(二)特点:
"""
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
"""
(三)进程调度算法:
"""
先到先服务算法:
短作业优先算法:对短作业或短进程优先调度的算法
时间片轮转法:让每个进程在就绪队列中的等待时间与享受服务的时间成比例
多级反馈法:目前公认最好的算法:
(1) 应设置多个就绪队列,并为各个队列赋予不同的优先级
(2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度
(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行
"""
进程的状态:就绪,执行,阻塞(recv  sleep input 等    )
(四)、进程的并行与并发
"""
并行:多核且资源够用状态下,同时执行
并发 : 并发是指资源有限的情况下,两者交替轮流使用资源
区别:并行是不同的程序真正的同时运行;并发是看似同时执行,其实只是在一段时间内轮流执行,看似同时执行
"""
三、同步异步
"""
同步:两个任务相互依赖,状态可以保持一致。
异步:两个任务,不依赖任务完成,只是通知有这个任务,至于执行与否不关心
# 举例:
去银行排队办理业务
同步是一心一意排队等待
异步是领取一个号码,就不管了,到了会有柜员喊号办理业务
"""
四、阻塞与非阻塞:阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
(1)进程的创建与结束
"""
四种方式:
1.初始化进程
2,进程中开启另一个进程
3.用户的交互式请求,而创建一个新进程(如用户双击暴风影音)
4.一个批处理作业的初始化(只在大型机的批处理系统中应用)
"""

 简单进程的创建

multiprocess中process模块创建进程(综合的 处理进程 的包)
import os
from  multiprocessing import Process   #导入创建进程模块
def func():
    print('啦啦啦')
    print('子进程',os.getpid())    #打印当前程序的进程  子进程 3692

if __name__=='__main__':   #必须有这个
    p=Process(target=func)   #创建一个进程对象
    print('主进程', os.getpid())   #主进程 15416
    print('呼哈哈')
    p.start()            #开启这个进程,这个时候,进程才算真的创建起来了
    print('主进程',os.getpid())    #主进程 15416
#执行的打印顺序是:呼哈哈--主进程15664--啦啦啦--子进程5948
#说明我们确实创建了一个子进程
#异步非阻塞:因为既打印了’呼哈哈‘,又打印了’啦啦啦‘,也就是在创建子进程的时候,你影响主进程,
(2)join方法  进程对象.join()  ---->阻塞作用
def func():
    print('子进程',os.getpid())    #子进程 7872
    print('你好')


if __name__=='__main__':
    p=Process(target=func)
    p.start()
    p.join()  #加阻塞,结果是主进程会等待子进程运行完才会执行
    print('主进程',os.getpid())      #主进程 10572#   说明是异步
# 执行的打印顺序是:子进程 16276-->你好--->主进程 8732
# 说明主进程被阻塞了,加join后,让程序从原来的   异步非阻塞 变成了--->异步阻塞
(3)进程可以传参,但是必须传一个元祖,当括号里只有一个值的时候要加一个逗号
def func(msg):
    print('子进程',os.getpid())    #子进程 7872
    print('你好%s'%msg)


if __name__=='__main__':
    p=Process(target=func,args=('你好',))   #传参
    p.start()
    p.join()  #加阻塞,结果是主进程会等待子进程运行完才会执行
    print('主进程',os.getpid())
(4)开启多个子进程,用for 循环
def func(i):
    print('%d,子进程%d,主进程%d'%(i,os.getpid(),os.getppid()))
if __name__=='__main__':
    p_l = []
    for i in range(10):
        p=Process(target=func,args=(i,))
        p.start()
        p_l.append(p)
    for p in p_l:
        p.join()    #异步阻塞每个开启的子进程阻塞,就可以事项打印‘主进程’在子进程结束后再执行,变成异步阻塞 
print('主进程')
(5)用面向对象知识来创建进程:通过继承
import os
from multiprocessing import Process
class MyProcess(Process):
    def run(self):
        print('子进程:%d'%os.getpid())
        self.walk()  # --->在子进程中调用

    def walk(self): # 自定义的 可以不定义
        print('子进程:%d' % os.getpid())

if __name__ == '__main__':
    p = MyProcess()
    p.start()    # --->  run方法
    # p.walk()     # --->  也可以在主进程中调用walk
    print('主进程 :',os.getpid())

原文地址:https://www.cnblogs.com/zzy-9318/p/8414149.html