进程和线程的区别

一、共同点

内核

在内核的视角,进程与线程都被视为task,每一个进程或线程对应一个task_struct

struct task_struct {
    ...
    pid_t pid;         // 进程ID(线程ID)
    pid_t tgid;        // 线程组ID
    struct mm_struct *mm;  // 进程的内存描述符
    struct mm_struct *active_mm;
    struct files_struct *files;  // 打开的文件列表
    struct signal_struct *signal;  // 信号描述符
    ...
};
  • pid:Linux中线程与进程都有唯一的PID
  • tgid:线程组ID,由同一个进程所创建线程的tgid相同,等于创建它们的进程ID
  • mm:指向mm_struct的指针,描述进程的虚拟地址空间,多线程共享一个mm,而不同进程拥有独立的mm
  • files: 文件描述符表,所有线程共享同一组打开的文件描述符
进程调度

在Linux中,进程和线程是统一调度的,调度器只负责调度task_struct实例,不论进程或线程

二、不同点

内核

由于两者都由task_struct表示,区别主要体现在 task_struct 中某些字段的共享与否上,而这些字段是否共享,是由clone()创建新任务时,参数flag来决定新任务(进程或线程)是否与父任务共享某些关键资源

进程:

  • 独立的 task_struct,每个进程都有自己的 pidtgid
  • 独立的 mm_struct,即独立的地址空间。
  • 独立的信号处理机制。

线程

  • 线程有自己的栈空间和寄存器,但共享全局变量和堆
  • 每个线程也有独立的 task_struct,但它们的 tgid 是相同的。
  • 线程共享同一个 mm_struct,即同一个地址空间。
  • 线程共享文件描述符表和信号处理机制。
上下文切换

进程

虚拟内存与物理内存的映射需要查页表,TLB缓存记录映射关系,可以加快查询速度,而上下文切换时会切换页表(cr3寄存器指向新的页表),TLB失效,切换到新进程后查页表速度很慢,因为缓存命中率低。切换页表是进程切换的主要开销

线程

由于同一进程内的线程共享虚拟内存地址空间,没有切换页表(即切换cr3寄存器),也不会刷新TLB,内核只需保存当前线程的寄存器状态、程序计数器、堆栈指针等,开销相对较小

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wjq++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值