〇、前言
最近学到13.进程和线程.md,重拾了操作系统的一些知识,再来回顾一下,顺便把当时这块的复习例题放上来。
一、进程控制和线程
进程和程序的区别
- 进程是动态的,程序是静态的
- 进程是暂时的,程序是永久的
- 进程和程序的组成不同
- 进程和程序密切相关
进程三个基本状态的转换及原因
(1)就绪状态(Ready)
(2)执行状态(Running)
(3)阻塞状态(Blocked)
进程实体,进程的唯一标识:PCB
进程是进程实体的运行过程,是系统进行资源分配和调度的独立单位。 进程的结构描述:程序、数据、PCB(进程控制块:进程存在的唯一标识)、栈。
PCB 是进程实体的一部分,是操作系统中最重要的记录型数据结构。作用是使一个在多道 程序环境下不能独立运行的程序,成为一个能独立运行的基本单位,成为能与其它进程并 发执行的进程。OS 是根据 PCB 对并发执行的进程进行控制和管理的。
- 进程控制块的结构:进程标识符、cpu 现场保护区、进程调度信息、进程控制信息
- 进程控制块的组织方式:
(1)链接方式:将同状态进程的 PCB 链接成一个队列
(2)索引方式:将同状态进程的 PCB 放入索引表
三对原语:原子性
原语:由若干条机器指令构成的一段程序,用以完成特定功能,这段程序在执行期间不可 分割。即原语的执行不能被中断,原语操作具有原子性。
- 进程的创建和终止原语:创建原语create() ;终止原语
- 进程的阻塞和唤醒原语:阻塞原语block();唤醒原语wakeup()
- 进程的挂起与激活:进程挂起原语suspend();进程激活原语active()
线程和进程的区别
- 拥有资源:进程拥有资源
- 调度:线程是调度单位
- 并发性:线程可并发执行
- 系统开:引入线程后,系统开小
二、Python中的多进程
Unix和Linux操作系统上提供了
fork()
系统调用来创建进程,调用fork()
函数的是父进程,创建出的是子进程,子进程是父进程的一个拷贝,但是子进程拥有自己的PID。fork()
函数非常特殊它会返回两次,父进程中可以通过fork()
函数的返回值得到子进程的PID,而子进程中的返回值永远都是0。Python的os模块提供了fork()
函数。由于Windows系统没有fork()
调用,因此要实现跨平台的多进程编程,可以使用multiprocessing模块的Process
类来创建子进程,而且该模块还提供了更高级的封装,例如批量启动进程的进程池(Pool
)、用于进程间通信的队列(Queue
)和管道(Pipe
)等。
模拟两个任务同时启动
from multiprocessing import Process
from os import getpid
from random import randint
from time import time, sleep
def download_task(filename):
print('启动下载进程,进程号[%d].' % getpid())
print('开始下载%s...' % filename)
time_to_download = randint(5, 10)
sleep(time_to_download)
print('%s下载完成! 耗费了%d秒' % (filename, time_to_download))
def main():
start = time()
p1 =