操作系统二、线程

什么是线程

在传统操作系统中,每个进程有一个地址空间和一个控制线程。事实上,这几乎就是进程的定义。不过,经常存在在同一个地址空间中准并行运行多个控制线程的情形,这些线程就像(差不多)分离的进程(共享地址空间除外)。

为什么要线程、线程与进程的区别与优略

1、有了进程,有了这样的抽象,我们才不必考虑中断、定时器和上下文切换,而只需考察并行进程。类似地,只是在有了多线程概念之后,我们才加入了一种新的元素:并行实体共享同一个地址空间和所有可用数据的能力。

2、由于线程比进程更轻量级,所以它们比进程更容易(即更快)创建,也更容易撤销。

3、若多个线程都是CPU密集型的,那么并不能获得性能上的增强,但是如果存在着大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠进行,从而会加快应用程序执行的速度。

4、线程使得真正的并行得以实现,我们知道,进程只是伪并行(当运行在单CPU系统中,线程也是伪并行,但是线程之间的切换非常之快,其速度可以达到CPU的三分之一),线程与进程有一个关键的差别。 保存该线程状态的过程和调度程序都只是本地过程,所以启动它们比进行内核调用效率更高。另一方面,不需要陷阱,不需要上下文切换,也不需要对内存高速缓存进行刷新,这就使得线程调度非常快捷。

用户态与内核态的线程实现

实现线程有两种方法:用户空间中和内核中实现

在用户空间实现线程包:将线程包放在用户空间,内核对线程包一无所知

用户空间实现线程,每个进程需要其专用的线程表,(进程表放在于内核之中)这些表和内核中的进程表类似,不过它仅仅记录各个线程的属性,如每个线程的程序,计数器、堆栈指针、寄存器和状态等。

线程的切换比内核中要快至少一个数量级甚至更多

用户级线程还有另一个优点。它允许每个进程有自己定制的调度算法。

尽管用户级线程包有更好的性能,但它也存在一些明显的问题。其中第一个问题是如何实现阻塞系统调用。

如果一个线程开始运行,那么在该进程中的其他线程就不能运行,除非第一个线程自动放弃CPU。

在内核中实现线程包

内核的线程表保存了每个线程的寄存器、状态和其他信息。

内核中创建或撤销线程的代价比较大

内核线程不需要任何新的、非阻塞系统调用。另外,如果某个进程中的线程引起了页面故障,内核可以很方便地检查该进程是否有任何其他可运行的线程,如果有,在等待所需要的页面从磁盘读入时,就选择一个可运行的线程运行。

混合实现

们已经研究了各种试图将用户级线程的优点和内核级线程的优点结合起来的方法。一种方法是使用内核级线程,然后将用户级线程与某些或者全部内核线程多路复用起来,编程人员可以决定有多少个内核级线程和多少个用户级线程彼此多路复用。

采用这种方法,内核只识别内核级线程,并对其进行调度。其中一些内核级线程会被多个用户级线程多路复用。如同在没有多线程能力操作系统中某个进程中的用户级线程一样,可以创建、撤销和调度这些用户级线程。在这种模型中,每个内核级线程有一个可以轮流使用的用户级线程集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值