线程
进程和线程
到目前为止提出的进程的概念包含两个特点:
1:资源所有权:一个进程包括一个存放进程映像的虚拟地址空间;进程映像是程序、数据、栈和进程控制块中定义的属性的集合。一个进程总是拥有对资源的控制或所有权,这些资源包括内存、IO通道、IO设备和文件等。操作系统提供保护功能,以防止进程之间在发生不必要的与资源相关的冲突。
2:调度/执行:一个进程沿着可以通过一个或多个程序的执行路径(轨迹)执行。其执行过程可能与其他进程的执行过程交替进程 。因此,一个进程具有一个执行状态(运行、就绪等)和一个被分配的优先级,它是一个可被操作系统调度和分派的实体。
既然上述两个特点是独立的,那么操作系统应该能够独立地处理它们。很多操作系统,特别是近期开发的操作系统已经这样做了。为区分这两个特点,分派的单位通常称为线程或轻量级进程,而拥有资源所有权的单位通常称为进程 或任务。
多线程
多线程是指操作系统在单个进程内支持多个并发执行路径的能力
在多线程环境中,进程被定义成资源分配的单位和一个被保护的单位。与进程相联的有:
1:存放进程映像的虚拟地址空间。
2:受保护地对处理器、其他进程(用于进程间通信)、文件和IO资源(设备和通道)的访问。
在一个进程中,可能有一个或多个线程,每个线程有:
1:线程执行状态(运行、就绪等)。
2:在未运行时保存的线程上下文;从某种意义上看,线程可被视为进程内的一个独立操作的程序计数器。
3:一个执行栈。
4:用于每个线程局部变量的静态存储空间。
5:与进程内的其他线程共享的对进程的内存和资源的访问。
从进程管理的角度说明线程和进程的区别:在单线程进程模型中(也就是说,并没有明确的线程概念),进程的表示包括它的进程控制块和用户地址空间,以及在进程执行中管理调用/返回行为的用户栈和内核栈。当进程正在运行时,处理器寄存器将被该进程所控制;当进程不运行时,这些处理器寄存器中的内容将被保存。在多线程环境中,进程仍然只有一个与之关联的进程控制块和用户地址空间。但是每个线程都有一个独立的栈,还有独立的控制块用于包含寄存器值、优先级和其他与线程相关的状态信息。
因此,进程中的所有线程共享该进程的状态和资源,它们驻留在同一块地址空间中,并且可以访问到相同的数据。当一个线程改变了内存中的一个数据项时,其他线程在访问这一能够看到变化后的结果。如果一个线程以读权限打开一个文件,那么同一进程中的其他线程也能够从这个文件中读取数据。
线程功能特性
和进程一样,线程具有执行状态,且可以相互之间进行同步。
线程状态
和进程一样,线程的关键状态有运行态、就绪态和阻塞态。一般来说,挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念。
1:派生:在典型情况下,当派生一个新进程时,同时也为该进程派生了一个线程。随后,进程 中的线程可以在同一个进程中派生另一个线程,并为新线程提供指令指针和参数;新线程拥有自己的寄存器上下文和栈空间,且被放置在就绪队列中。
2:阻塞:当线程需要等待一个事件时,它将被阻塞(保存它的用户寄存器、程序计数器和栈指针),此时处理器转而执行另一个就绪线程。
3:解除阻塞:当解除阻塞一个线程的事件发生时,该线程被移到就绪队列中。
4:结束:当一个线程完成时,其寄存器上下文和栈都被释放。
线程同步
一个进程中的所有线程共享同一个地址空间和诸如打开的文件之类的其他资源。一个线程对资源的任何修改都会影响同一个进程中其他线程的环境。因此,需要同步各种线程的活动,以便它们互不干涉且不破坏数据结构。例如,如果两个线程都试图同时往一个双向链表中增加一个元素,则可能会丢失一个元素或者破坏链表结构。
线程同步带来的问题和使用的技术通常与进程同步相同。
相关推荐
在"线程描述生产与销售关系"的场景中,我们可以将线程应用到模拟面包工厂的生产与销售流程,以实现高效的资源管理和任务调度。 首先,我们需要理解面向对象设计。这是一种软件开发方法,它将现实世界的问题抽象为类...
之后,通过`Pthread_create()`函数向管理线程发送创建线程的请求,管理线程检查调度策略,分配资源,初始化线程描述符,调整优先级,最终完成线程创建。新线程创建后,会被插入到活动线程的双向链表中,其优先级可以...
pthread_create()函数创建的线程执行start_routine()函数,thread返回创建的线程描述符,而attr是创建线程时设置的线程属性,arg可以作为任意类型的参数传给start_routine()函数。 QNX对创建线程前需要设置的线程...
描述了如何安全地中断线程,并确保所有资源得到正确释放。 第三章:RUNLOOPS RunLoop是管理线程上事件循环的对象。本章详细介绍了RunLoop的模式、输入源、如何配置和启动RunLoop,以及退出RunLoop的方法。 第四章...
1. **线程描述数据结构及实现限制**:LinuxThreads是早期在Linux系统中实现的线程库,每个线程都有一个与之对应的轻量进程。线程描述符保存了线程的状态、栈信息、调度信息等,但其局限性在于不支持线程组,不完全...
创建线程的基本函数是`pthread_create()`,它需要一个线程描述符、线程函数和传递给新线程的参数。线程函数定义了线程运行时要执行的任务。 线程间通信是多线程编程中的关键部分,主要包括共享内存和信号量。共享...
### 线程描述数据结构 在Linux中,每个线程都有自己的描述符,主要由`struct thread_info`和`struct task_struct`两个数据结构来描述。其中,`struct thread_info`包含了线程的寄存器状态、内核栈指针、信号处理...
在Linux内核中,线程的组织和管理涉及到多个结构体,比如pthread-descr-struct和pthread-handles,这些结构体支持线程描述和线程句柄的管理。每个线程都有自己的任务描述符,通过调度器来决定哪个线程获得CPU时间片...
2. **Java中的线程描述** - **主线程**:JVM启动时,会找到包含`main`方法的类并执行其`main`方法,负责执行这部分代码的线程被称为主线程。 - **Thread类**:Java提供了`Thread`类来描述和管理线程。我们可以创建...
1. **线程创建**:使用`pthread_create()`函数创建一个新的线程,该函数需要传入一个线程描述符、线程属性、线程入口点和参数。线程入口点是一个函数指针,新线程从这里开始执行。 2. **线程标识**:每个线程都有一...
线程描述了一个任务执行的运行环境,也描述了这个任务所处的优先等级。重要的任务可以设置相对较高的优先级,不重要的任务可以设置较低的优先级,不同的任务还可以设置相同的优先级,按照时间片运行。 RT-Thread...
内核线程的创建涉及到线程描述符的初始化、栈空间的分配、上下文的保存等步骤。调度则是根据一定的策略决定哪个内核线程应该获得CPU的执行权。线程的回收则涉及清理资源,比如撤销栈空间和释放线程描述符。 在实际...
### 多线程基础知识 #### 一、多线程概念解析 多线程是指在一个程序或进程中同时运行多个线程的技术。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。每一个线程都有一个...
`pthread_create`函数用于创建新线程,需要提供线程描述符、线程属性、线程入口点函数以及传递给线程的参数。线程创建成功与否可以通过函数返回值来判断。 6. **生产者-消费者模型**: 生产者-消费者模型是多线程...
- `pthread_descr_sem_waiting`: 一个链表,用于存储等待该信号量的线程描述符。 - **函数**: - `sem_wait(struct semaphore *sem)`: 当信号量值大于0时,该函数将信号量值减1,并允许调用者继续执行。如果信号...
线程描述:线程描述记录了线程的详细信息,包括线程 ID、线程状态、线程堆栈等信息。线程描述可以帮助开发者和维护者快速定位和解决问题。 进程描述:进程描述记录了进程的详细信息,包括进程 ID、进程状态、虚拟机...
### Delphi多线程编程详解 #### 一、Delphi多线程编程概述 多线程编程是现代软件开发中的关键技术之一,它能够显著提升应用程序的性能和用户体验。Delphi作为一种广泛使用的编程语言,提供了丰富的多线程支持,...
描述中提到的"创建多个线程,每个线程又创建多个子线程",这是一种典型的多级线程结构,可以构建出复杂的并发执行树。这种设计模式使得程序能并行处理更多任务,但同时也带来了线程管理和同步的挑战。 在C++中,...
在描述中提到的问题是典型的多线程性能问题:当开启40个线程与单线程运行相比,整体执行时间反而变慢了。这可能源于以下几个原因: 1. **线程切换开销**:操作系统在管理多线程时需要频繁地进行上下文切换,即保存...