Linux中线程的介绍

本文详细介绍了Linux中线程的概念,强调Linux使用轻量级进程模拟线程。讨论了pthread库,包括线程创建、等待、终止和分离,并解释了线程ID与进程地址空间的关系。通过实例展示了线程的创建和管理,强调了线程资源管理和调度的重要性。
摘要由CSDN通过智能技术生成

目录

一.线程概念

1.什么是线程

二.Linux进程与线程

三.pthread库

3.1线程创建

3.2线程等待

3.2线程终止

 3.4分离线程

四.线程ID及进程地址空间布局


一.线程概念

1.什么是线程

1.在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”
2.一切进程至少都有一个执行线程
3.线程在进程内部运行,本质是在进程地址空间内运行
4.在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化
5.透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就了线程执行流
补充:一个进程的创建实际上伴随着其进程控制块(task_struct)、进程地址空间(mm_struct)以及页表的创建,虚拟地址和物理地址就是通过页表建立映射的。进程都有自己独立的进程地址空间和独立的页表,也就意味着所有进程在运行时本身就具有独立性。
如果我们在创建“进程”时,只创建task_struct,并要求创建出来的task_struct和父task_struct共享进程地址空间和页表,如图:

上面就创建了4个线程,其中每一个线程都是当前进程里面的一个执行流。

重新理解进程与线程:

进程:是上面图中框中的内容,包含task_struct,进程地址空间,页表,文件。信号等等,合起来称之为一个进程。站在内核角度来理解进程:承担分配系统资源的基本实体,叫做进程。

线程:是最小的基本调度单位,一个进程内的线程共享其中的资源。

其中,Linux系统中没有真正意义上的线程,而是用进程模拟的。

操作系统要支持真的线程,那么就需要对这些线程进行管理。比如说创建线程、终止线程、调度线程、切换线程、给线程分配资源、释放资源以及回收资源等,而在Linux看来,描述线程的控制块和描述进程的控制块是类似的,因此Linux并没有重新为线程设计数据结构,而是直接复用了进程控制块,所以我们说Linux中的所有执行流都叫做轻量级进程。没有真正的线程,那么也就绝对没有真正意义上的线程相关的系统调用!

但是Linux可以提供创建轻量级进程的接口,如vfork函数,原生线程库pthread

pid_t vfork(void);

返回值与fork函数相同

  • 给父进程返回子进程的PID。
  • 给子进程返回0。

原生线程库:原生线程库实际就是对轻量级进程的系统调用进行了封装,在用户层模拟实现了一套线程相关的接口。

线程的优点:

创建一个新线程的代价要比创建一个新进程小得多。
与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多。
线程占用的资源要比进程少很多。
能充分利用多处理器的可并行数量。
在等待慢速IO操作结束的同时,程序可执行其他的计算任务。
计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现。
IO密集型应用,为了提高性能,将IO操作重叠,线程可以同时等待不同的IO操作。
线程的缺点:
性能损失: 一个很少被外部事件阻塞的计算密集型线程往往无法与其他线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。

健壮性降低: 编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说,线程之间是缺乏保护的。

缺乏访问控制: 进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。

编程难度提高: 编写与调试一个多线程程序比单线程程序困难得多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值