一. Linux中线程是怎么理解的
1.1 线程概念
在Linux中,线程是在进程“内部”执行的,线程是处于进程的进程地址空间中运行,线程用到的资源都是进程的资源,线程是执行进程的一部分代码,线程是最小的执行流,执行流要执行就得有资源,资源是在物理内存中存储着,通过进程地址空间+页表的形式找到对应的资源。
1.2 重新定义线程和进程
一个或多个执行流(线程),进程地址空间,文件描述符表,页表,物理内存保存的进程资源等加一起才是进程,线程是在进程内部的执行流资源。线程是操作系统调度的基本单位。进程是资源分配的基本实体(单位)。 操作系统以进程为基本单位分配资源,进程在创建时就会携带一个线程,这个线程是是主线程。进程包含线程,进程内有一个或多个线程,一个进程有自己的一个PCB,页表,进程地址空间,文件描述符表,这都是操作系统给其分配的。
除了Linux操作系统外,管理线程是用结构体TCB描述线程并用链表或更高级的数据结构管理起来进程的线程们,TCB是置在进程的PCB中的。 而在Linux中,管理线程也是复用了管理进程的方法,在Linux中,并没有线程的概念,线程又称轻量级进程,每个线程都有自己的PCB,在之前讲进程的时候,在进程被创建的时候会有自己的一个PCB,其实这个PCB是属于进程被创建时一并被创建的主线程的。
1.3 线程周边概念
1.3.1进程VS线程
1) 线程的创建和释放比进程的创建和释放更轻量级:更快。因为线程的创建不用创建进程地址空间,页表什么的,只需要创建一个PCB就可以,释放也是如此,只用释放一个PCB即可。
2)线程的切换比进程的切换也更轻量化:线程的切换不需要大规模的改动,只用替换CPU寄存器的数据即可,而进程的切换涉及到页表,进程地址空间等等资源的切换。还有一点是cache缓存,在CPU拿取数据是从cache拿取数据的,不会直接存内存拿取数据,内存数据是要先加载到cache中的,线程切换时,不用切换cache缓存的数据,因为进程中的线程共用一个进程地址空间,所以用到的物理内存的数据也是同一份数据。而进程的切换需要涉及到cache缓存中缓存数据的切换,这也是一个细节。
线程的优点
创建线程的代价比进程小且线程占用的资源要比进程少很多。
线程之间的切换需要操作系统做的工作要少很多。
线程的缺点 健壮性低下如果一个线程出现问题,这个进程将会崩溃。这是因为线程出异常,就是进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。
编程难度提高编写与调试一个多线程程序比单线程程序困难得多。
线程最重要的两个字段是线程自己的栈空间和硬件上下文,独立的硬件上下文能体现出线程是被调度处理的基本单元,栈能让线程的资源独立。线程除了栈空间外,其他区域都是共享的。进程的第一个线程是主线程,其他线程是工作线程,进程被创建出来就有一个线程(主线程),这个