笔记---进程与线程

概述

操作系统中最核心的概念就是进程:这是对正在运行的程序的一个抽象。它的存在使得即使只有一个CPU也能提供并发的能力,它们将一个单独的CPU虚拟成多个逻辑CPU。

进程

多道程序设计使得CPU的利用率大幅度提升,但是也让编程的难度增加,同时也很难对并行活动进行跟踪,因此操作系统的设计者开发了用于描述并行的一种概念模型(顺序进程,简称进程),使得并行容易被处理。
进程模型:在进程模型中,计算机上所有的可运行的软件,包括操作系统,被组织成若干顺序进程。一个进程就是一个正在执行程序的实例。从这句话可以得到的结论是:进程必须是动态的,进程可以被以下状态所标识:
1.进程在执行什么程序
2.程序在处理什么数据(输入)
3.进程执行完毕会有什么样的输出
4.进程的状态
同样的程序执行两遍也是两个进程。
在这里插入图片描述
在上图中可以看到,四个进程都有自己的控制流程(程序计数器),但某一时刻只有一个进程在CPU上执行。

进程的创建

进程的终止

进程的层次结构

进程的状态

进程的实现

为了实现进程模型,操作系统维护着一张表格,即进程表。每个进程占用一个表项(进程控制块PCB),该表项保存了进程状态的重要信息。操作系统中PCB就等于进程,PCB伴随了进程的由生到死,先创建PCB再创建进程,进程终止后才撤销PCB。
在这里插入图片描述
有了PCB表之后,就可以解释为何进程的出现简化了多道程序设计。这里需要引入中断的概念。

中断

中断,是实现多道程序设计的基础。中断出现的前提是通道(I/O)足够的智能,可以独立于CPU执行(虽然DMA经常被设计成CPU的一个模块,在数据传输结束后,传输完成标志(TCIF) 被置1 ,当设置了允许传输完成中断位(TCIE) 时,将产生一个中断请求通知CPU)。
异常,CPU中断当前执行的流程,转到相应的错误处理程序。包括除零、算术溢出,访存越界,虚拟内存缺页。
中断与异常的区别:中断与当前执行的指令无关,每条指令执行的最后时刻由硬件监测中断,又被称为外中断。异常与当前执行的指令有关。中断是异步事件,异常是同步事件。由上可以得出结论中断可以屏蔽,但异常不可以被屏蔽。

中断响应

每一类I/O都会关联一个被称为中断向量的位置。它包括了中断服务程序的入口地址。当中断发生时,硬件首先将当前的程序计数器(PC),程序状态字(PSW)和其他寄存器压入堆栈,随即跳转到中断向量所指示的地址(硬件从中断向量中装入新的程序计数器)。然后软件开始接管,保存现场,汇编语言保存寄存器的值,通常保存到PCB中;汇编语言程序设置新的堆栈;C语言程序运行中断服务程序;调度程序决定下一个将运行的进程(时钟中断触发的情景,时间片用完了);C语言转置汇编程序,为当前要运行的进程装入寄存器的值以及内存映射并启动该进程运行。
在这里插入图片描述
一个进程在执行过程中可能被中断数千次,但关键是每次中断后,被中断的进程都会返回到与中断发生前完全相同的状态。

线程的引入

传统的进程既是资源分配的基本单位(地址空间)也是执行单位,随着共享内存多处理机的发展,为了支持进程内多道程序设计而引入了线程。进程内部同时发生着许多活动,某些活动会因为某些原因被阻塞。通过将应用程序分解成多个可以准并行运行的线程,程序模型设计会变得更加简单。总之,进程的出现使得多道程序设计变得简单,让我们不必考虑中断、计时器和上下文切换,而只需要考虑并行进程。类似的,有了多线程的概念之后,就有了一个新的抽象:并行的实体共享同一个地址空间和所有可用数据的能力。这种能力是必须的,而多进程却不拥有(具有不同的地址空间,天然具有隔离性);
线程的第二点优势是:线程更加轻量化,相比于PCB巨多的内容,TCB仅需少量的状态即可。
第三点:若多个线程都是CPU密集型的,那么并不会有性能的提升,但是如果存在大量的计算和大量的IO处理,拥有多个线程允许这些活动彼此重叠进行是有益的,从而加快应用程序的执行速度。
在多CPU系统中,多线程是有益,它使得真正的并行有了实现的可能性。
何时使用进程和线程?
当程序是CPU密集且无数据交换的需求时,使用进程,可以保障安全性;当需要共享一个地址空间和所有数据时,应当使用线程。
互斥与同步:进程间的互斥与同步同样适用于线程之间,这里线程间的互斥与同步多了一种选择。
第一种可以使用同步原语(系统调用或者利用硬件同步指令的同步函数),实现同步与互斥。涉及到陷入与系统调用开销较大(类比synchronized);第二种,可以利用库函数,在用户空间使用TSL指令实现信号量操作,由于用户空间是共享的,且信号量操作(PV)由TSL指令实现,开销要小一些(不需要进入系统内核,类比AQS)。

多线程典型的例子

在这里插入图片描述
在这里插入图片描述
从上面可以看到,构建一个WEB服务器可以有三种方式:第一种单线程进程方式,当请求到来时,会调用阻塞系统调用,能处理的请求很少;
第二种方式就是分为分派线程和工作线程,分派线程接受请求,工作线程调用阻塞系统调用,实现了并行性,由于WEB服务器都会设有缓存,多个线程访问同一个地址空间,而多进程是做不到的。
第三种方式需要操作系统支持文件读取系统调用的非阻塞版本,当请求到来时,服务器先在表格中记录当前请求的状态,然后启动一个非阻塞的磁盘操作,然后执行下一个操作,如果是新的请求,就重复上述工作,如果是磁盘应答就从表格中取出对应的信息,处理该应答。其实这种方式模拟了堆栈与线程,但是相比于多线程版本省去了线程切换以及创建线程,所以CPU利用率是最高的(单线程进程CPU利用率或者叫做吞吐量总是高于多线程版本)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值