linux深入理解线程相关内容

35 阅读3分钟

1.线程

在谈这个线程相关的内容之前,我们首先肯定是需要了解进程的;

进程看到的这个资源,实际上是通过这个地址空间看到的,因此这个地址空间就是进程看到资源的窗口;

image-20251010112320991

不同的进程的资源不同,是因为大家使用的这个地址空间是不同的,因此这个窗口是不一样的,那么通过这个窗口看到的资源就是不一样的;

如果我们今天看到一个进程,和另外一个进程使用同样的窗口,因此这个时候两个进程看到的这个资源是一样的,把同一个窗口里面的资源分配给不同的task_struct,这个时候就是线程的概念的引入,线程在彼此之间使用的是同样的一样窗口,因此这个看到的资源是一样的,不同的线程共享资源;

下面的这个图展示的就是我们的虚拟地址和物理地址之间的相互转换,以及页表存在的情况;

实际上,我们之前学习的进程,可以理解为一个家庭,家庭里面只有一个成员,使用这个资源;

现在引入了这个线程,我们就可以理解为是多个线程,也就是一个家庭的多个成员,使用这个共同的资源

image-20251010124625512

页表主要进行的就是我们的虚拟地址和物理地址之间的这个映射的过程,但是实际上,这个页表的数量肯定不是一个,而是多个;

下面的这个图片里面使用32位的进行说明,32=10+10+12,12表示的是便宜数量,第一个10表示的是页表目录里面的这个具体的编号,第二个10表示的是具体指向的这个页表,在这个特定页表里面额编号的范围;

不存在的时候,我们会从这个内存里面申请,建立新的映射关系,建立新的页表,因此这个页表也不是固定不变的;

为什么是低12位,因为这个4KB表示的这个范围就是4*1024,也就是12次方,我们使用12个bit位进行表示即可

image-20251010125609582

操作系统为什么叫做这个计算机里面的哲学,因为操作系统提供的是指导思想,我们人们理解这个具体的内容是比较容易的,但是对于这个指导思想比较难以理解的,这个也是操作系统难以理解的原因,因此操作系统的学习必须要是使用具体的操作系统进行学习,然后理解操作系统里面的思想,这个也是我最近很大的感触;

1)线程是动态的,栈结构--自己独占的

2)线程具有自己的上下文数据

image-20251010170443022

线程创建的时候,存在多线程的时候,我们需要使用二级指针接受,因为我们创建第二个新的线程(多线程)的时候,需要这个新的线程做事情,因此这个新的线程需要返回一些内容;

pthread——join函数创建新的线程,这个时候需要接受这个新的线程的返回值,但是不需要对于这个过程出现的异常的情况进行处理,因此线程共享资源,线程挂的时候,共享这个资源的其他的线程都会挂掉,因此这个线程如果异常了,这个父线程也就挂了,所以是不需要对于这个返回值进行特殊处理的