简述Linux的线程(未完结)

109 阅读3分钟

概念

什么是线程

  • 线程是一个程序的执行路线,更准确的说一个进程内部的控制序列
  • 一切的进程都有一个级以上的线程
  • 线程在进程内部运行,本质上是进程地址空间上运行
  • 进程的虚拟地址空间,将进程的资源合理的分配给每个执行流,就形成了线程的执行流 一个进程里面是存在多个线程的,操作系统需要管理线程,那么就要把线程的各种资源用数据结构来组织在一起来方便管理。我们知道一个线程是具有一个虚拟地址空间的,然后进程的PCB指向这个地址空间,那么线程也是存在于系统中的,线程的TCB实际上和PCB类似,它们都是指向虚拟地址空间,共享当前进程的资源代码数据。

image.png

在这里一个PCB就是一个单独的执行流,操作系统并没有设计专门的TCB,而是用进程的PCB来模拟线程。 这样做的好处是,不用在使用一套新的算法来维护线程,直接使用进程的一套方法就可以了。、

还有一个问题,为什么一个进程里面要有多个线程呢?

我们知道在创建一个进程的时候付出的代价相对较大。所以当一个进程中有多个执行流的时候,用多个线程来分配一个进程所拥有的资源,比通过进程之间的协同付出的代价要小的多。

所以是进程是承担系统资源的实体,线程是调用资源的基本单位。

Linux线程与接口关系的认识

Linux是用进程模拟的,Linux不会给我们提供操作线程的接口,而是给我们提供了同一个地址空间内创建PCB的方法,分配资源给指定的PCB的接口。但是这样就带来了问题,这样的方式对于用户来说不太方便,所以在创建线程,等待线程时等,系统级别的工程师就会把用户层面对Linux轻量级接口进行丰庄,打包成库,方便使用。

线程和进程共享与私有

实际上所有的轻量级进程都是在进程地址空间上运行的,所以大部分的地址空间上的资源都是被共享的,所以数据区和文本区都是共享的,如果定于一个全局函数,在各个线程中都可以调用,如果定义一个全局变量,在各个线程中都是可以访问的到的,除此之外各个进程还共享一下进程资源和环境

  • 文件描述符表
  • 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数)
  • 当前工作目录
  • 用户id和组id

但是运行时栈和上下文数据是私有的,对于不同进程而言,由于进程是具有独立性的,只有部分的共享资源例如管道和ipc资源。 我们使用线程创建函数来验证

image.png 这里30639是主线程,它与pid是相同的,30640是另一个线程。