什么是线程?线程的优缺点和使用场景。

1、什么是进程?
进程是程序的而一次动态执行过程。
2、什么是线程?
个进程内部的控制序列, 是进程的一个实体,是进程的一条执行路径。程也就是一个轻量级进程(仅仅是在linux系统中。在windows系统中,进程就是经常进程,线程就是线程),每个线程都有自己的线程控制块,即一个进程至少有一个轻量级进程。
在线程组里面,所有的线程都是对等的关系,没有父线程的概念。
3、什么是主线程?
主线程就是创建进程中产生的第一个线程,也就是main函数对应的线程。
4、线程ID
线程是一个轻量级进程,每一个用户态的线程 ,在内核中都对应这一个调度实体,也拥有着自己 的进程描述符。
tgid:线程组ID,线程组中的每一个线程的tgid都是相同的,在外表现为进程ID,它等于主线程的ID 。
tid:每一个线程在自己的用户层面上都有一个私有的pid,可以通过tid找到自己的虚拟地址,再通过页表映射到物理地址空间。在用户层面上展现的是线程的ID(tid),但在内核中它实际上是一个轻量级进程(pid)。

这里写图片描述
5、线程资源?
进程可以拥有资源,并且是系统拥有资源的基本单位 。线程本身并不拥有系统资源,仅有一些 能保证独立运行 的资源,这块资源的各个线程私有的。
1)线程各自独立拥有的部分:

  • 线程ID
  • 一组寄存器
  • errno(错误编码)
  • 信号屏蔽字(一个进程中pending(未决)信号只有一个,但是任意一个线程都可以处理这个信号)
  • 调度优先级

    2)共享区域

  • 同一个地址空间(代码、全局数据、堆都是共享的。如果定义一个函数,在每个线程中都可以共享到,如果定义一个全局变量,在任何一个线程中都可以访问到
  • 文件描述符表
  • 每种信号的处理方式
  • 当前工作目录
  • 用户ID和组ID

6、线程的优点

  • 创建一个新线程的代价要比创建一个新进程小的多
  • 线程之间的切换相较于进程之间的切换需要操作系统做的工作很少
  • 线程占用的资源要比进程少很多
  • 能充分利用多处理器的可并行数量
  • 等待慢速 IO操作结束以后,程序可以执行其他的计算任务
  • 计算(CPU)密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
  • IO密集型应用,为了提高性能,将IO操作重叠,线程可以等待不同的IO操作。

7、线程的缺点?

  • 性能损失( 一个计算密集型线程是很少被外部事件阻塞的,无法和其他线程共享同一个处理器,当计算密集型的线程的数量比可用的处理器多,那么就有可能有很大的性能损失,这里的性能损失是指增加了额外的同步和调度开销,二可用资源不变。)
  • 健壮性降低(线程之间是缺乏保护性的。在一个多线程程序里,因为时间上分配的细微差距或者是共享了一些不应该共享的变量而造成不良影响的可能影响是很大的。)
  • 缺乏访问控制( 因为进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响 。)
  • 编程难度提高(编写和 调试一个多线程程序比单线程困难的多。)

8、进程和线程的区别?

  • 调度 :进程是操作系统分配资源的一个基本单位。线程是 CPU调度的基本单位。
  • 并发性:引入线程之后,不仅进程之间是可以并发执行的,而且在一个进程之中的多个线程也是 可以并发执行的,甚至是允许一个进程中 的全部进程并发执行。同样,不同的进程中的线程也是可以并发执行的。使得OS有 更好的并发性,提高了资源的利用率和系统吞吐量。
  • 拥有资源:进程可以拥有资源,并且是系统拥有资源的基本单位 。线程本身并不拥有系统资源,仅有一些 能保证独立运行 的资源,这块资源的各个线程私有的。例如,线程ID、一组寄存器、栈、errno、信号屏蔽字(一个进程中pending信号只有一个,但是任意一个线程都可以处理这个信号)、调度优先级。
  • 独立性:在同一进程中线程的独立性要比在不同的进程中独立性要低很多 。
  • 系统开销:线程切换的开销低于进程切换的开销,
  • 支持多处理机系统:对于传统的进程,也就是单线程进程 ,不管有多少个处理机,进程只能运行在同一个 处理机上面,但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上面,使其并发执行,加速了进程的完成。

9、进程和线程的应用场景?

总而言之:

  • 需要频繁创建销毁优先使用线程。
  • 需要大量计算的优先使用线程。
  • 相关性较强的使用线程,相关性较弱使用进程。
  • 可能要扩展到多机分布使用进程,多核分布使用线程

猜你喜欢

转载自blog.csdn.net/ffsiwei/article/details/81230374