目录
1.线程概念
-
1.1进程和线程的关系
- 这里借用《程序员的自我修养》中的一段话来说明Linux的多线程
Windows对进程和线程的实现如同教科书一般标准, Windows 内核有明确的线程和进程的概念。在Windows API中,可以使用明确的API: CreateProcess 和CreateThread来创建进程和线程,并且有一系列的 API来操纵它们。但对于Linux来说,线程并不是一个通用的概念。
Linux对多线程的支持颇为贫乏,事实上,在Linux内核中并不存在真正意义上的线程的概念。Linux 将所有的执行实体(无论是线程还是进程)都称为任务(Task), 每一个任务概念上都类似于一个单线程的进程,具有内存空间、执行实体、文件资源等。不过,Linux下不同的任务之间可以选择共享内存空间,因而在实际意义上,共享了同一个内存空间的多个任务构成了一个进程,这些任务也就成了这个进程里的线程。 - 结论1 :线程是依附于进程才能存在的,如果没有 进程,则线程不会单独存在
- 结论2 :多线程的是为了提高整个程序的运行效率的
- 线程也被称之为执行流,因为在执行用户写的代码(程序员创建的线程被称之为“工作线程”)
-
1.2pid本质上是轻量级进程id,换句话说,就是线程ID
- 在task_ struct当中
- pid_ t pid; //轻量级进程id, 也被称之为线程id
- 不同的线程拥有不同的pid
- pid_ t tgid; //轻量级进程组id, 也被称之为进程id
- 一个进程当中的线程拥有相同的tgid
- 为什么进程概念的时候,说pid就是进程 id?
- 线程因为主线程的pid和tgid相等,而我们当时进程中只有一个主线程。所以我们的pid就等于tgid。所以将pid成为进程id也就是现在的tgid。
- 在task_ struct当中
-
1.3 linux内核是如何创建一个线程的呢?
- 其本质就是再在当前进程组中创建一个task_struct结构体,它拥有着和主线程不同的pid,指向同一块虚拟进程地址空间。
- 其本质就是再在当前进程组中创建一个task_struct结构体,它拥有着和主线程不同的pid,指向同一块虚拟进程地址空间。
-
1.4线程的共享与独有
- 在进程虚拟地址空间的共享区当中