操作系统概念-个人笔记(线程)

操作系统第六版-第五章-线程

线程

线程,有时也被称为轻量级进程(LWP),是一个基本的 CPU 执行单元;它包含了一个线程 ID、一个程序计数器、一个寄存器组和一个堆栈。它与属于同一个进程的其它的线程共享代码段、数据段,以及其它的操作系统资源(比如:打开的文件和信号)。一个传统的(或者说重量级)进程有一个单独的控制执行序列。如果一个进程有多个控制执行序列,那么它就能够同时进行多个任务。

线程的优点

1. 提高了响应速度:多线程交互式应用程序可以允许程序在它的一部分被阻塞或正在执行一个冗长的操作时持续运行,从而提高了了对用户的响应速度。例如,一个多线程网页浏览器可以在一个线程下载图片时利用另外一个线程与用户交互。

2. 资源共享:缺省情况下,线程共享它们所属进程的存储器和资源。代码共享的优点在于它允许应用程序在同样的地址空间内拥有多个不同的活动线程。

3. 经济实惠:为进程创建分配存储器和资源代价高昂。因为线程共享它们所属进程的资源,所以线程的创建和上下文转换更为划算。创建和维护进程与创建和维护线程的开销孰大孰小难以测量(一般根据经验判断),但是通常创建和管理进程比创建和管理线程需要更多的时间。

4. 提高了多处理机体系结构的利用率:在多处理机体系结构中,多线程的优点就更加显著了。在这种系统中,多个线程可以在不同的处理器上并行运行。一个单线程进程只能够在一个 CPU 上运行,而不论有多少 CPU 可供使用。在多 CPU 机器中,多线程提高了并发性。在单处理机体系结构中,CPU 通常快速的在每个线程之间移动,如此以至于用户感觉到这是在并行运行(这是个假象),但是实际上同时只有一个线程在运行。

用户线程和内核线程

对用户线程的支持通常处于内核之上,线程库提供了对线程的创建、调度和管理的支持,这无需来自内核的支持。因为内核并不知道用户级线程的存在,所有的线程创建和调度工作都在用户空间完成,而且整个过程不受内核的干涉。所以,用户级线程的创建和管理通常很快;然而,它们也有一些缺点。例如:如果内核是单线程的,那么任何用户级线程执行一个导致阻塞的系统调用时就会导致整个进程阻塞,即使程序内部的其它线程可以运行。

内核线程由操作系统直接支持:内核在内核空间内实现了线程的创建、调度和管理。因为线程管理由操作系统完成,所以内核线程的创建和管理要比用户线程慢。然而,由于线程由内核管理,如果一个线程执行一个导致阻塞的系统调用,那么内核可以调度程序中的其它线程执行。同样,在多处理机环境中,内核能够在不同的处理器中调度线程。大多数现代操作系统都支持内核线程。

多对一模型

多对一模型(many-to-one model)将多个用户级线程映射到一个内核线程。线程管理在用户空间完成,所以它的效率比较高。但是如果一个线程调用了导致阻塞的系统调用的话,那么将阻塞整个进程。而且,因为一次只有一个线程可以访问内核,所以在多处理机环境中多个线程不能够并发执行。

一对一模型

一对一模型(one-to-one model)将每个用户线程映射到一个内核线程。它允许在一个线程调用导致阻塞的系统调用的情况下持续运行其它的线程,从而提供了比多对一模型更好的并发性;它也允许多个线程在多处理机环境中并行执行。这种模型的唯一缺点在于创建一个用户线程就需要创建一个相应的内核线程。因为创建内核线程的开销会加重应用程序的负担,所以这种模型的大多数实现都要限制系统支持的线程数量。

多对多模型

多对多模型(many-to-many model )将用户级线程多路复用到与之数量相等或少一点的内核线程。内核线程的数量由具体的应用程序或具体的机器确定(分配给应用程序的内核线程数量在多处理机环境中可能比单处理机环境中多)。然而,多对一模型允许开发者随心所欲的创建用户线程。但是,因为内核一次只能调度一个线程,所以并不能获得真正的并行性。一对一模型允许更大的并行性,但是开发者必须小心,以免在一个程序中创建过多的线程(而且在某些情况下可能会限制开发者能够创建的线程的数目)。多对多模型则免却了所有这些缺点:开发者能够创建所需的用户线程,而且相应的内核线程能够在多处理机环境中并行运行。而且当一个线程执行导致阻塞的系统调用时,内核能够调度其它的线程执行。(golang的协程模型就是多对多

线程池

假设不论服务器何时接收到一个请求,它都会创建一个独立的线程来处理这个请求。而创建一个独立的线程明显要优于创建一个独立的进程,虽然如此,多线程服务器依然面临一些潜在的问题。第一个问题是在处理请求之前创建线程的时间需求,还要考虑到该线程一旦完成工作就要被丢弃。第二个问题就更加严重了:如果我们允许为每一个请求都创建一个新线程来处理,那么我们难以在系统中实现足够数量的线程。不受限制的创建线程可能耗尽系统资源,比如:CPU 时间或存储器。

一种解决方案是线程池。线程池的思想是在进程开始时创建一定数量的线程并将它们置入一个池(pool)中,线程在这个池中等待工作。当服务器接收到一个请求时,它就从池中唤醒一个线程(如果有可用的线程),由它来处理请求。一旦线程服务完毕,它就返回线程池等待后面的工作。如果池中没有可用的线程,那么服务器就等待,直到某个线程被释放。

线程池有如下优点:

1.  利用已存在的线程服务请求要比等待创建一个线程要快。

2.  线程池限制了线程的数量。在不能够支持大量的并发线程的系统中这一点特别重要。

线程池中的线程数量的设定要根据一些因素,比如:系统中的 CPU 数量、物理内存的容量和所期望的并发的客户端请求的数量。更加完善的线程池体系结构能够根据应用情况动态调节线程池中的线程数量。这样的体系结构优点更多,系统负载较低时拥有一个较小的线程池,因此所需的存储器更少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值