<<深入linux内核>>第三章 进程

本文详细介绍了Linux内核中进程、线程(轻量级进程)的概念,强调Linux内核实际上没有线程,而是使用轻量级进程实现。讲解了进程描述结构PCB、进程链表的组织结构,包括双向链表、运行队列和prio_array_t,以及等待队列在进程同步中的应用。此外,还讨论了进程关系、PID、TID和TGID的区别,并提到了pidhash散列表在快速定位进程描述符中的作用。
摘要由CSDN通过智能技术生成

1. 进程 线程 轻量级进程

  1. linux内核上准确来说并没有 线程这一概念
  2. linux的线程其实是一种"轻量级进程"
  3. 进程:操作系统分配系统资源的基本单位
  4. 线程(轻量级进程):系统执行任务的基本单位
  5. 多线程进程=多个轻量级进程组合成一个进程=一个线程(轻量级进程)组

插一句: 线程间共享进程的虚拟地址空间(不准确) ,线程是有默认大小的

线程的本质就是一个额外的一个栈(apue 第12章线程属性)

一个进程只有一个栈空间, 线程会有默认的栈空间大小

在这里插入图片描述

Linux使用轻量级进程对多线程应用程序提供更好的支持

具体:实现多线程程序的一个简单方式就是把轻量级进程与每个线程关联起来.这样线程之间就可以通过简单地共享同一个内存地址空间,统一打开文件集来进行访问相同的应用程序数据结构集.
同时每个线程都可以独立的调度

2. 进程描述结构PCB

task_struct结构体
在这里插入图片描述

3. 进程描述符的处理(存放)

进程描述符的存储
优秀博客(务必点进去)
https://blog.csdn.net/hzrandd/article/details/51034488

thread_union: 最大占两个页框,就是上图左边的

union thread_union {
   
    struct thread_info thread_info;
    unsigned long stack[THREAD_SIZE/sizeof(long)];
};
struct thread_info {
   
    unsigned long        flags;        /* low level flags */
    mm_segment_t        addr_limit;    /* address limit */
    struct task_struct    *task;        /* main task structure */
    int            preempt_count;    /* 0 => preemptable, <0 => bug */
    int            cpu;        /* cpu */
};
struct task_struct {
   
    volatile long state;
    void *stack; 
 //...
#ifdef CONFIG_SMP
    int on_cpu;
    int wake_cpu;
#endif
    int on_rq;
  //...
#ifdef CONFIG_SCHED_INFO
    struct sched_info sched_info;
#endif
 //... 
    pid_t pid;
    pid_t tgid;
 //...
};

这样做的好处是

  1. 仅将最关键的、访问最频繁的运行环境保存在核心栈里(仍然是两个页大小),

而将 task_struct 大部分内容通过 thread_info::task 指针保存在栈外,以方便扩充。thread_info 的分配方式和访问方式与 2.4 中的 task_struct 完全相同,现在的 current 需要这样来访问:
2,得到stack,thread_info或task_struct任意一个数据结构的地址,就可以很快得到另外两个数据的地址。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值