[读书笔记]线程的认识

来源:互联网 发布:淘宝代缴公积金靠谱么 编辑:程序博客网 时间:2024/06/03 15:58

线程综述

多线程是指操作系统在单个进程内支持多个并发执行路径的能力。

从进程管理的角度,线程和进程的区别:多线程环境中进程仍然只有一个与之关联的进程控制块和用户地址空间。每个线程都有一个独立的栈,还有独立的控制块用于包含寄存器值,优先级和其他与线程相关的状态信息。进程中的所有线程共享该进程的状态和资源,它们驻留在同一块地址空间中,并且可以访问相同的数据。当一个线程改变了内存中的一个数据项时,其他线程在访问这一数据项时能够看到变化后的结果。线程是轻量级的进程

在单处理器中,线程有利于简化在逻辑上完成若干项不同功能的程序的结构。

  • 前台和后台工作
  • 异步处理
  • 执行速度
  • 模块化程序结构

线程具有执行状态,可以相互之间进行同步。

一个线程的阻塞是否会导致整个进程的阻塞?这涉及到用户线程和内核级线程。

  • 第一,在一个纯粹的用户级线程软件中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。通过线程库用于用户级线程管理,它包含用于创建和销毁线程的代码,在线程间传递消息和数据的代码,调度线程执行的代码,以及保存和恢复线程上下文的代码。一个进程中一次只有一个用户线程可以执行,在这种情况下,一个线程阻塞了(系统服务调用),会导致整个进程阻塞。

使用用户级线程而非内核级线程的优点
+ 由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核态特权,因此,进程不需要为了线程管理而切换到内核态,这节省了两次状态状态的开销
+ 调度可以是应用程序相关的。
+ 用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程。

用户级线程相对于内核级线程的缺点
+ 当用户级线程执行一个系统调用时,不仅这个线程会被阻塞,进程中所有线程都会被阻塞。
+ 在纯粹的用户级线程策略中,一个多线程应用程序不能利用多处理技术,内核一次只把一个进程分配给一个处理器。

  • 第二,纯粹的内核级线程,内核为进程及其内部的每个线程维护上下文信息,调度是由内核基于线程完成的。内核可以同时把同一个进程中的多个线程调度到多个处理器中。这时候,如果一个线程被阻塞,内核可以调度同一个进程中的另一个线程。

内核级线程方法的缺点:需要内核状态切换,用户级线程、内核级线程之间和进程之间有一个数量级上的性能差距。

  • 第三,混合方法。

多核和多线程

多核架构带来的潜在性能提升取决于一个应用程序有效使用可用并行资源的能力。多处理任务调度和痛心一集高速缓存一致性维护都会给软件带来额外的开销。

数据库管理系统、数据库应用程序、服务器程序能有效地使用多核系统。Oracle数据库是多进程应用程序。Java从根本上支持线程的概念,不仅Java 语言本身能够很方便地支持多线程应用程序开发,Java虚拟机也是一个多线程进程,它为Java应用程序提供调度机制和内存管理。

原语 是由若干条指令构成的完成某种特定功能的一段程序,具有不可分割性。原语的执行必须是连续的,在执行过程中不允许被中断。

Linux的进程

Linux中的进程和任务由一个task_struct数据结构表示。它包含如下信息

  • 进程的执行状态:执行态,就绪态,挂起态,停止态,僵死态。
  • Linux调度进程所需要的信息。
  • 标识符
  • Linux支持UNIX SVR4中的IPC机制。
  • 链接。每个进程都有一个到其父进程的链接及到其兄弟进程的链接和到所有子进程的链接。
  • 时间和计时器
  • 文件系统。包括指向被盖进程打开的任何文件的指针和指向该进程当前目录与根目录的指针
  • 地址空间
  • 处理器专用上下文。构成该进程上下文的寄存器和栈信息。

Linux进程执行状态

  • 执行态
  • 就绪态
  • 可中断阻塞态:此时进程正在等待一个事件(入I/O操作)的结束,一个可用的资源或另一个进程的信号
  • 不可中断阻塞态:该进程正在直接等待一个硬件条件,不会接受任何信号。
  • 停止态。进程被中止,并且只能由来自另一个进程的主动动作回复
  • 僵死态。该进程已经被终止,但是在进程表中仍然有它的任务结构

Linux线程

Linux提供一种不区分进程和线程的方案,用户级线程被映射到内核级进程上。组成一个用户级进程的多个用户级线程被映射到共享同一个组ID的多个Linux内核级进程上。这使得进程可以共享文件和内存等资源,使得同一组进程调度切换时不需要切换上下文。

Linux通过复制当前进程的属性集合来创建一个新进程。新进程被克隆出来,共享文件,信号处理和虚拟内存。Linux用clone命令来代替通常的fork命令创建进程。

0 0
原创粉丝点击