现代操作系统——线程

经典的线程模型

引例:在字处理软件的例子中我们可以看到线程在实际应用中的必要性,三个线程,第一个用来和用户交互,第二个用来在的到通知时对文档进行格式化,第三个用来备份。在这里,三个线程共享一片公共内存,所以可以对同一个文件进行操作,而三个进程不能。

现在不妨这样重新理解一下进程:
◉为了方便管理,用某种方法把一些资源集中在一片地址空间,集中起来的这个概念模型称作进程。
◉这些资源包括程序(code),数据(data),以及其他资源(比如子进程,打开的文件,即将发生的定时器,信号处理程序等)。
◉然后在进程模型中还有一个负责执行的模型叫做线程,线程模型拥有一个程序计数器(用来记录接下来要执行哪条指令),有寄存器(用来保存工作变量),还有一个堆栈(用来记录执行历史,每一帧保存了已调用但未返回的过程)。

◉实际上就是将之前的进程模型拆解成资源分组和执行两个部分,线程就是负责执行的部分。
在这里插入图片描述
a)就是上面描述的一种模型,每个进程只有一个线程
当线程给进程模型增加一项内容:在同一个进程环境中,允许彼此之间有较大独立性的多个线程执行。
于是就有了b)图中的模型:在一个进程中并行运行多个线程(这实际上是对在计算机上并行运行多个进程的模拟);这里的并行也并非是真正意义上的并行,和进程一样,是CPU在多个线程之间的快速切换是实现的伪并行。

线程中的内容

在这里插入图片描述
第一列给出的是进程中所有线程共享的内容,但是第一列的表项是进程的属性,例如,一个线程打开了一个文件,那么同属于一个进程的所有线程都能对文件进行读写。如果每个线程有自己的地址空间,打开文件,即将发生的定时器等,那这些线程就应该属于不同的进程了。

第二列给出的也叫线程的属性
ps:
1.无论是否引入线程,进程始终是系统资源分配的基本单位。
2.在引入线程的系统中,线程可以取代进程成为调度的基本单位。

线程概念试图实现的是,共享一组资源的多个线程的执行能力,以使这些线程可以为完成某一任务而共同工作。

线程的状态

线程的各个状态(运行,就绪,阻塞)以及进程之间的转换和进程没有区别。值得一提的是,需要认识到每个线程有自己的一个堆栈,用来存放一个调用过程中的局部变量和返回地址。另外,线程没有与进程类似的时钟中断强制线程让出CPU,但是可以通过一个系统调用来实现,见下。

和线程相关的系统调用

线程的创建:多线程一般从单线程开始,然后该线程可以调用库函数thread_create()来创建新线程。
线程的退出:线程可以调用库函数thread_exit()来退出;有的线程系统可以调用thread_join()来阻塞当前线程直到另一特定线程退出时退出。
线程没有进程那样的时钟中断机制,但是可以通过调用thread_yeild()来主动放弃CPU给其他的线程。

线程的实现

在用户空间中实现线程

在这里插入图片描述
线程包在用户控件内,内核不知道线程的存在,按照单线程进程的方式进行管理。
在每个进程内有由运行时系统(run-time system)管理的专用的线程表(thread table),线程表与内核中的进程表一样,记录了各个线程的属性(程序计数器,堆栈,寄存器,状态等)。
运行时系统管理下的某个线程进入阻塞态是,运行时系统的调度程序会在同属该进程的线程中选一个就绪的来执行,直到内核分配给进程的时间片结束(或没有可运行的线程)为止。

优点:
用户级线程包可以在不支持线程的系统上实现
每个进程允许有定制的个性化的调度算法(每个进程有独立的运行时系统来管理线程)
◉保存线程状态和调度程序都是本地过程,因此比内核调度效率更高;另外,不需要陷入内核,不需要上下文切换(也叫进程切换),也不需要对内存高速缓存刷新,使得线程调度很快捷
◉用户级线程还具有较好的可扩展性,内核空间内的内核线程需要一些固定的表格空间和堆栈空间,如果线程数量比较大就会出问题

问题:
如果一个线程发生阻塞,线程发送信号给所属的进程,进程同样无法获得所需资源或信号输入时就会进入阻塞态,结果会导致同属于这个进程的所有线程停止工作

在内核中实现线程

在这里插入图片描述
内核中维护有记录所有线程属性的线程表,线程通过系统调用的方式创建新的线程或撤销已有线程。
内核可以直接调度,管理线程。当一个线程阻塞的时候,内核可以运行另一个线程(无论这些线程是否属于同一进程)。
所有能阻塞线程的调用都通过系统调用的形式实现,相对运行时系统来说代价更大。

优点:
一个线程阻塞,不会影响其他线程正常进行。

问题:
◉内核比较公平的调度所有的线程,没法实现各个进程定制化的调度算法。
◉对于一些比较老旧的操作系统,有可能需要一些改造才能支持。

混合实现

在这里插入图片描述
混合实现的一种方法是将用户级线程与某些或全部内核级线程多路复用起来,灵活度很高。
这种情况下,内核只识别内核级线程,对内核级线程进行调度;也可以通过内核级线程实现对属于不同组的线程应用不同的调度算法;还可以在某一线程发生阻塞时不影响其他组的线程继续进行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值