操作系统的发展与进程初识

Posted cpsyche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统的发展与进程初识相关的知识,希望对你有一定的参考价值。

一.操作系统

1.os组成

os组成包括硬件和软件

硬件:主机(CPU + 存储器),I/O设备

软件:系统软件,应用软件

2.os发展史

脱机批处理系统:单道批处理系统与多道批处理系统。

单道批处理系统:

优点:缩短了手工操作的时间,提高了CPU的利用率

缺点:

半自动化,不提供人机交互能力,需要人参与,给用户使用带来了不便

计算过程是串行,限制了即使系统的使用效率

必须等所有文件处理完,才返回结果,降低了程序的开发效率

 

多道批处理系统:运用了多道技术的批处理系统

特点:遇到IO操作就切换程序,使得cpu的利用率提高了。解决CPU的速度与I/O速度不匹配的矛盾

时空复用:

空间复用:把内存分成多个独立的小内存空间,一个空间执行一个程序

时间复用:不同的程序或用户轮流使用它

技术的实现:

中断:使正在运行的程序让出CPU

状态保存:用PSW保存系统被中断时的状态,放入PCB池中

优点:提高了CPU的运行效率

 

分时操作系统:使用分时技术的操作系统。

时间片:操作系统将CPU的时间划分成若干个片段

分时技术:按时间片轮流把CPU分给多个程序使用

 

特点:

多路性:若干个用户同时使用一台计算机。

交互性:实现人机交互

独立性:用户之间可以相互独立操作,互不干扰

及时性:能做出及时响应

 

优点:提高多个程序的共同效率

 

缺点:降低了单个程序的处理效率

 

实时操作系统:

定义:在确定性的时间内,执行完程序,并返回相应的结果。

           一般多用在与军事相关的操作系统上

 

二.进程

进程:程序关于某数据集合的一次运行活动,是OS进行资源分配和调度的基本单位

进程实体结构:

数据结构P

内存代码C

内存数据D

通用寄存器R

程序状态字信息PSW

 

进程三态:

就绪态:当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

运行态:当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

阻塞态:正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态

 

挂起态:

使用前提:使用前提:计算机系统在运行过程中出现资源不足时候

资源不足表现为:性能低和死锁

 

定义:剥夺进程占有内存及其他资源,不参与进程调度,被os或程序主动结束挂起态后,再从硬盘调入内存并恢复其他资源,参与调度

挂机态与阻塞态的区别:

阻塞态:在内存中处于等待

挂起态:不占据内存,所有数据储存在硬盘中

 

同步与异步

同步:任务提交之后 原地等待的任务的执行并拿到返回结果才走 期间不做任何事

异步:任务提交之后 不再原地等待 而是继续执行下一行代码

 

阻塞与非阻塞

阻塞:阻塞态

非阻塞:就绪态 运行态

 

进程同步

互斥锁 :

使用前提:当多个进程操作同一份数据的时候 会造成数据的错乱

使用限制:锁必须在主进程中产生 交给子进程去使用

加锁处理把程序的并发运行变成了串行,虽然降低了效率但是提高了数据的安全

锁的使用会增加程序的复杂度,也容易造成死锁现象

技术图片
from multiprocessing import Process,Lock
import time
import json

# 查票
def search(i):
    with open(data,r,encoding=utf-8) as f:
        data = f.read()
    t_d = json.loads(data)
    print(用户%s查询余票为:%s%(i,t_d.get(ticket)))

# 买票
def buy(i):
    with open(data,r,encoding=utf-8) as f:
        data = f.read()
    t_d = json.loads(data)
    time.sleep(1)
    if t_d.get(ticket) > 0:
        # 票数减一
        t_d[ticket] -= 1
        # 更新票数
        with open(data,w,encoding=utf-8) as f:
            json.dump(t_d,f)
        print(用户%s抢票成功%i)
    else:
        print(没票了)


def run(i,mutex):
    search(i)
    mutex.acquire()  # 抢锁  只要有人抢到了锁 其他人必须等待该人释放锁
    buy(i)
    mutex.release()  # 释放锁


if __name__ == __main__:
    mutex = Lock()  # 生成了一把锁
    for i in range(10):
        p = Process(target=run,args=(i,mutex))
        p.start()
View Code

 

三.multiprocessing模块

Process类的介绍

方法介绍

技术图片
 1 p.start():启动进程,并调用该子进程中的p.run() 
 2 p.run():进程启动时运行的方法我们自定义类的类中一定要实现该方法  
 
 3 p.terminate():强行终止进程p,不会先解锁再清除,容易造成死锁,及子进程成为僵尸进程。

 4 p.is_alive():判断进程是否存活

 5 p.join([timeout]):主线程等待p终止
View Code

属性介绍

技术图片
1 p.daemon:默认值为False。如果设为True,代表p为守护进程,父程序终止时,P程序也会被终止。守护进程不能创建自己的进程,并且必须在start方法之前设置

2 p.name:进程的名称
 
3 p.pid:进程的id

4 p.exitcode:进程运行时为值None、为–N时,表示被信号N结束
View Code

 创建进程

技术图片
 from multiprocessing import Process
 import time


 def test(name):
     print(%s is running%name)
     time.sleep(3)
     print(%s is over%name)


# windows创建进程会将代码以模块的方式 从上往下执行一遍
# linux会直接将代码完完整整的拷贝一份
#

 if __name__ == __main__:
     p = Process(target=test,args=(egon,))  # 创建一个进程对象
    p.start()  # 告诉操作系统帮你创建一个进程
     print()
View Code

 

技术图片
from multiprocessing import Process
import time


class MyProcess(Process):
    def __init__(self,name):
        super().__init__()
        self.name = name

    def run(self):
        print(%s is running % self.name)
        time.sleep(3)
        print(%s is over % self.name)


if __name__ == __main__:
    p = MyProcess(egon)
    p.start()
    print()
View Code

 

以上是关于操作系统的发展与进程初识的主要内容,如果未能解决你的问题,请参考以下文章

初识操作系统

初识容器技术

初识容器技术

Linux基础进程的概念及fork初识

操作系统之进程初识

计算机发展史与进程