进程与线程 thread (二)

为什么线程会有用以及如何使用它们

 

人们需要线程的主要原因:

1、在许多应用中同时发生着多种活动。其中某些活动随着时间的推移会阻塞。通过将这些应用程序分解成可以准并行运行的多个顺序线程,程序设计模型会变得更简单。

2、线程比进程更轻量级,所以他们比进程更容易创建,也更容易撤销

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

线程模型

并行实体拥有共享同一个地址空间所有可用数据的能力。

构造服务器的三种方法

模型 特性
多线程 并行性、阻塞系统调用
单线程进程 无并行性、紫色系统调用
有限状态机 并行性、非阻塞梓潼调用、中断

有限状态机

每次服务器从为某个请求工作的状态切换到另一个状态时,都必须显示的保存或重新装入相应的计算状态。我们以一种困难的方式模拟了线程及其堆栈。每个计算都有一个被保存的状态,存在一个会发生且使得相关状态发生改变的事件集合,我们把这类设计称为有限状态机。

多线程处理及大量数据的应用的例子

有关的进程可以用一个输入线程、一个处理线程和一个输出线程组成。输入线程把数据读入到输入缓冲区中;处理线程从输入缓冲区中取出数据,处理数据,并把结果放在输出缓冲区中;输出线程把这些结果写到磁盘上。

经典的线程模型

进程模型基于两种独立的概念:资源分组处理与执行。

理解进程的角度

1、进程用某种方法把相关资源集中在一起。进程有存放程序正文和数据以及其他资源的地址空间。

2、进程拥有一个执行的线程,通常简写为线程。线程中有一个计数器,用来记录接着要执行哪一条指令。线程拥有寄存器,用来保存线程当前的工作变量。线程还有一个堆栈,用来记录执行历史。

进程用于把资源集中到一起,而线程则是在CPU上被调度执行的实体。

所有的线程都有完全一样的地址空间,他们共享一样的全局变量。由于各个线程都可以进程地址空间中的每一个内存地址,所以一个线程可读可写甚至可清除另一个线程的堆栈

进程中的内容 线程中的内容

地址空间

全局变量

子进程

即将发生的定时器

信号与信号处理程序

账户信息

程序计数器

寄存器

堆栈

状态

为什么每个线程拥有自己的堆栈?

每个线程的堆栈有一帧,供各个被调用但是还没有从中返回的过程使用。该堆栈中存放了响应过程的局部变量以及过程调用完成之后使用的返回地址。每个线程会调用不同的过程,从而有一个各自不同的执行历史。

创建线程通常会返回一个线程标识符,该标识符是线程的名字。

创建线程 pthread_create
退出线程 pthread_exit
等待其他线程终止 pthread_join
允许线程让出CPU给出其他线程 pthread_yied
创建并初始化一个线程 pthread_attr_init
删除一个线程的属性结构 pthread_attr_destory

新创建的线程的线程标识符会被所谓函数值返回。

猜你喜欢

转载自blog.csdn.net/qq_29996285/article/details/84642503