【简记】Operating System——Thread

来源:互联网 发布:php继承的原理 编辑:程序博客网 时间:2024/04/30 12:00

This memo is based on the course of Dr.Li with Operating System as the reference book.

本章内容:

  • 线程概念
  • 线程模型
  • 线程优缺点
  • 线程池

4.1 概述

动机:有时一个应用程序可能执行多个相似任务,例如web应用程序。当有多个(或数千个)客户并发访问它时,假设网页服务器作为传统的那个线程的进程来执行,那么一次只能处理一个请求,客户需等待较长的时间;若为每个客户创建一个进程,则消耗内存很大,也不合理。

这里写图片描述

多线程编程的优点:

  • 响应度高:如果对一个交互程序采用多线程,那么即使部分线程阻塞或执行较冗长的操作,该程序仍能执行。
  • 资源共享:线程默认共享它们所属进程的内存和资源。代码和数据共享的优点是允许一个应用程序在同一地址空间有不同的活动线程。
  • 经济:更省时间和空间
  • 多处理器体系结构的利用:便于每个进程能并行运行在不同的处理器上

多线程之间共享内存空间:

这里写图片描述


4.2 多线程模型

有两种不同的方法来提供线程支持:

用户层的用户线程(受内核支持,而无需内核管理)(Java Threads)

内核层的内核线程(由操作系统直接支持和管理)

4.2.1 多对一模型(多见于不支持多线程进程的操作系统)

缺点:如果一个线程执行了阻塞系统调用,内核线程被挂起,因为多个用户线程对应一个内核线程,则整个进程就会阻塞。
因为任一时刻只有一个线程能访问内核,所以多个线程不能并行运行在多处理器上。

每个线程被分配到的执行时间:先经过一次进程间的分配,进入单个进程后,又执行了一次分配

这里写图片描述

4.2.2 一对一模型(Linux与Windows)

该模型在一个线程执行阻塞系统调用时,能允许另一个线程继续执行。提供了更好的并发功能。允许多个线程并行运行在多处理器上。

缺点是没创建一个用户线程就需创建一个相应的内核线程,开销会影响应用程序的性能。

4.2.3 多对多模型

这里写图片描述


4.4 多线程带来的问题

1.fork()函数,线程在调用fork函数时,究竟是复制的单个线程的资源,还是所在进程的所有线程资源?

2.取消操作,如多个线程同时搜索数据库,一个线程找到了结果,那么其他线程可以被取消;或者在网页加载时,当用户点击停止加载时,所有装入网页的线程就被取消了。

  • 异步取消:一个线程立即终止目标线程
  • 延迟取消:目标线程不断地检查是否应终止,允许目标线程有序地终止

3.信号处理

4.线程池
为解决多线程服务器的两个潜在问题“线程在工作完成之后被丢弃以及一对一模型下线程的数量控制问题”

合理利用线程池能够带来三个好处。
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

java中,线程池ThreadPoolExecutor,使用的时候用executor来调用runnable。

5.调度程序激活

要解决内核与线程库之间的通信问题。
需要用到上面的多对多和二级模型。引入一个中间数据结构LWP。
这里写图片描述

LWP:轻量级进程(LWP)是一种实现多任务的方法。与普通进程相比,LWP与其他进程共享所有(或大部分)它的逻辑地址空间和系统资源;与线程相比,LWP有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父子关系。

LWP只能由内核管理并像普通进程一样被调度。

在上述模型中,LWP表现为一种可以调度用户线程来运行的虚拟处理器。通过LWP,用户线程和内核线程相连接。

当LWP小于用户线程数时,需要调度器激活。

阅读全文
0 0
原创粉丝点击