文章目录
1. 进程 线程 轻量级进程
- linux内核上准确来说并没有 线程这一概念
- linux的线程其实是一种"轻量级进程"
- 进程:操作系统分配系统资源的基本单位
- 线程(轻量级进程):系统执行任务的基本单位
- 多线程进程=多个轻量级进程组合成一个进程=一个线程(轻量级进程)组
插一句: 线程间共享进程的虚拟地址空间(不准确) ,线程是有默认大小的
线程的本质就是一个额外的一个栈(apue 第12章线程属性)
一个进程只有一个栈空间, 线程会有默认的栈空间大小
Linux使用轻量级进程对多线程应用程序提供更好的支持
具体:实现多线程程序的一个简单方式就是把轻量级进程与每个线程关联起来.这样线程之间就可以通过简单地共享同一个内存地址空间,统一打开文件集来进行访问相同的应用程序数据结构集.
同时每个线程都可以独立的调度
2. 进程描述结构PCB
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;
//...
};
这样做的好处是
- 仅将最关键的、访问最频繁的运行环境保存在核心栈里(仍然是两个页大小),
而将 task_struct 大部分内容通过 thread_info::task 指针保存在栈外,以方便扩充。thread_info 的分配方式和访问方式与 2.4 中的 task_struct 完全相同,现在的 current 需要这样来访问:
2,得到stack,thread_info或task_struct任意一个数据结构的地址,就可以很快得到另外两个数据的地址。