多道技术

多道技术
【1】什么是多道技术
● 多道技术(Multiprogramming)指在计算机内同时运行多个程序
○ 由操作系统负责控制和管理这些程序的调度。
● 每个程序都有独立的内存空间和CPU时间片
○ 在不同的程序间切换
○ 以最大化地利用CPU资源
○ 提高计算机系统的效率。
【2】多道技术主要分为两种模式:批处理和交互式。
(1)批处理模式
● 批处理是指将多个用户提交的相同或类似的任务进行批量处理。
○ 批处理系统先将作业序列按照优先级、文件大小等因素排序
■ 然后挑选出最高优先级的作业进入内存执行
○ 当该作业I/O等待时
■ 操作系统将控制权切换到其他作业执行。
○ 再次轮到该作业时
■ 操作系统从中断点继续执行。
(2)交互式模式
● 交互式模式是一种用户与计算机交互的方式
○ 用户可以通过计算机屏幕或终端输入命令并得到实时反馈。
● 在这种模式下
○ CPU时间片被切分成较小的时间段
○ 多个用户分时共享CPU。
○ 用户的输入和输出同时进行
○ 而操作系统必须及时响应用户的请求
○ 及时切换进程。
多道技术有效提高了计算机的利用率,减少了资源浪费,提高了计算机的处理效率和可靠性。
而且,多道技术也对后来的计算机操作系统的设计产生了很大的影响,是操作系统从单任务到多任务发展的必要条件之一。
【三】进程理论
【1】什么是进程
● 进程是指在操作系统中正在运行的程序实体
○ 它代表了一个正在执行中的程序以及与该程序相关联的所有状态信息。
○ 在进程理论中,进程被视为计算机资源的基本分配单位。
【2】进程的机制
● 进程理论最重要的概念之一就是上下文切换(Context Switch)
○ 也就是在并发执行多个进程时
○ 操作系统必须及时将处理器从一个进程切换到另一个进程。
● 在进行上下文切换时
○ 操作系统需要保存当前进程的上下文信息(如寄存器状态、虚拟内存等)以便之后可以恢复该进程的执行状态
○ 同时加载下一个进程的上下文信息。
● 上下文切换是操作系统保证多进程协同工作的重要机制之一。
【3】进程理论中几个重要概念
(1)进程的状态:
进程可以处于就绪、运行或阻塞三种状态之一。
● 就绪状态表示进程已经准备好运行
○ 但是处理器暂时没有空闲时间;
● 运行状态表示进程正在执行;
● 阻塞状态表示进程被暂停执行
○ 直到某些事件(比如等待I/O操作)完成后再继续执行。
(2)进程控制块:
● 进程控制块(Process Control Block, PCB)是操作系统为每个进程所创建的数据结构
○ 用于保存进程本身的状态信息(比如进程ID、进程优先级、进程状态、进程上下文等)。
● PCB可以看作是程序和操作系统之间交互的纽带
○ 在进程需要进行状态切换时
○ 操作系统使用该数据结构记录并管理进程状态。
(3)进程同步和进程通信:
● 当多个进程同时访问共享资源时,需要进行进程同步和协调。
○ 进程同步机制包括信号量、互斥量、条件变量等方式,以保证多个进程按照特定的顺序访问共享资源。
○ 而进程通信机制则包括管道、消息队列、共享内存等方式,让多个进程之间可以相互传递信息、协调工作,完成复杂的任务。
【四】开启进程的两种方式
【1】基于process方法创建对象
● 在Python中,可以使用multiprocessing模块来创建进程。
○ 其中,可以通过Process方法来创建一个进程对象。
● 下面是一个简单的示例代码
○ 演示如何基于Process方法创建一个进程对象:
import multiprocessing

def foo():
print("This is child process")

if name == 'main':
p = multiprocessing.Process(target=foo)
p.start()
p.join()
● 在这个示例中,首先定义了一个函数foo用于作为子进程要执行的任务。
○ 然后,在主程序中,通过Process方法创建了一个进程对象p
○ 指定了其要执行的任务为foo。
○ 调用p.start()启动进程,并通过调用p.join()等待该进程结束。
需要注意的是,如果不加if name == 'main':判断语句
在Windows系统下会导致程序执行出现异常。
这是因为在Windows系统中,每个Python脚本文件都被看作一个新的进程
如果不加判断语句,一旦在子进程中创建了新的进程对象,会无限递归导致无法正常结束程序
而加上判断语句便可避免这种情况的发生。
【2】基于继承process的类创建进程对象
● 利用multiprocessing模块也可以基于继承Process的类来创建进程对象。
○ 下面是一个示例代码
○ 演示如何基于继承Process的类来创建一个进程对象:
import multiprocessing

class MyProcess(multiprocessing.Process):

def run(self):
    print("This is child process")

if name == 'main':
p = MyProcess()
p.start()
p.join()
● 在这个示例中
○ 首先定义了一个继承自Process的类MyProcess
■ 该类包含了一个run()方法,表示进程要执行的任务。
○ 在主程序中,通过实例化该类来创建一个进程对象p
■ 并调用p.start()方法启动进程
■ 再调用p.join()方法等待该进程结束。
需要注意的是
在继承Process的类中必须包含一个run()方法
该方法就是进程要执行的任务
所有具体的子类需要重写这个方法
否则会抛出 NotImplementedError 异常。

posted @ 2024-05-17 13:04  zenopan  阅读(92)  评论(0编辑  收藏  举报