Linux 线程的概念

线程

我们先来看看什么是线程?
举个例子:一个工厂,工厂里有很多的生产线。此时进程就是这个工厂,而线程就是就是工厂中的一条生产线。

线程与进程:
1.线程就是一个执行流,创建一个线程就是在内核中创建一个PCB,这个PCB指向了进程的虚拟地址空间。所以真正去执行代码的是每一个进程内部的执行流,也就是线程。
2.线程其实在当前内核中是没有这个概念的,我们所认为的线程是一个轻量级进程(LWP)。
3.创建出来的线程的PCB也是需要放在内核中双向链表上的,也就意味着操作系统可以通过链表来获取到线程的PCB,从而调度线程获取CPU资源。
4.线程是操作系统调度的最小单位。
5.进程是操作系统分配资源的最小单位。

通过一个图来理解一下线程与进程:
在这里插入图片描述
知道了是上述概念,大家也许会有个疑问:一个进程中的所有线程都是和进程共享资源的,那么他们共享部分资源?还是共享全部资源?共享哪一部分资源?
线程与进程的共享:
1.共享了进程虚拟地址空间,代码段和数据段,函数和全局变量都可以被线程访问到。
2.文件描述符表。
3.当前进程的工作路径。
4.用户id和组id。
线程独有的
1.tid。
2.信号屏蔽字。
3.优先级调度。
4.一组寄存器(程序计数器、上下文信息)。
5.errno。
6.线程私有的栈(如果都用进程虚拟地址空间的栈,有可能会造成调用栈混乱的问题)。

用一幅图来理解一下线程独有的内容在进程虚拟地址空间中的位置
在这里插入图片描述

那么线程id在内核中是如何标识的?
内核级的线程id,和进程id一样,线程id是pid_t类型的变量,而且能够用来唯一标识线程的一个整形变量。

那么我们为什么要学习多线程呢?
因为多线程可以提高程序的效率。缩减程序的运行时间。

线程的优点:
1.创建一个线程的开销要比创建一个进程的开销小。
2.创建一个线程所用的资源要比创建一个进程小。
3.进程当中的不同线程可以并行的去运行。

线程的缺点:
1.健壮性(鲁棒性)低。也就是其他线程正常运行,只要某一个线程崩溃了,就会导致整个进程崩溃掉。
2.代码的编写难度变高了。
3.缺乏访问控制,不同的执行流的执行先后问题。

这里说一些关于线程的指令:
top 可以查看进程CPU的使用率
top -H -p [pid] 可以查看每一个线程CPU的使用率。
gcore 可以让一个进程强制产生core文件。
pstack 可以查看一个进程的堆栈。
thread apply all bt 在gdb调试时,查看线程的调用堆栈。

多线程与多进程的区别
1.多进程:每一个进程都有自己的虚拟地址空间,所以一个进程的异常不会导致其他进程异常退出。多进程也会提高程序的运行效率或者程序的稳定性,带来了进程间通信的问题。
2.多线程:由于线程都是用同一个进程的虚拟地址空间,所以一个线程异常有可能导致整个进程退出。所以多线程的健壮性(鲁棒性)低。多线程也会提高程序的运行效率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值