【Linux操作系统】线程概念

一、线程概念

1.1 什么是线程

对于进程,比较老的说法是加载到内存的程序叫做进程;修正后的说法是进程 = 内核数据结构 + 程序的代码和数据。对于线程,它是进程内部的一个执行分支,是CPU调度的基本单位。
在这里插入图片描述
在地址空间的正文代码区,用户写的代码在进程中,都是串行执行的。换句话说,如果还有其他的进程(有多个进程),那么还需要开辟空间给新的进程创建地址空间和页表。这样就比较浪费时间和空间,即成本高。所以为了节省创建的成本,让新创建的task_struct与之前的task_struct共用一个地址空间和页表,地址空间和地址空间上的虚拟地址也是一种资源,地址空间的代码区划分成几个部分,分别给这些task_struct执行,互不影响。这一个一个task_struct就是线程。

1.2 为什么要这样设计Linux线程

进程控制块叫做PCB,里面有进程的各种属性信息;线程也有自己的线程控制块,叫做TCB。一个进程里面可能有一个线程,也有可能有很多线程,所以操作系统也要把这些线程管理起来。
在这里插入图片描述
但是Linux的设计者认为,进程和线程都是执行流,相似性高,没必要单独创建数据结构和算法给线程,直接复用进程的代码就行了。这样更方便维护和管理。

1.3 进程 vs 线程

以前的进程:一个内部只有一个线程的进程
现在的进程:一个内部有多个线程的进程
在这里插入图片描述
在内核角度看进程:进程是承担分配系统资源的基本实体。而线程是进程的其中一个执行分支。

1.4 关于调度的问题

在这里插入图片描述
CPU在执行调度所有的执行流时是不用区分task_struct的,在它看来,进程和线程都是执行流,每个task_struct都有自己的代码,从地址空间来的。Linux中,所有的调度执行流都叫做轻量级进程。

1.5 再谈地址空间(页表 虚拟地址 物理内存)

一个进程内部有多个线程,那么这些线程是如何得到地址空间中的代码的?在地址空间中,多个执行流是如何进行代码划分的?

操作系统对内存进行管理的基本单位是4kb,每个数据块都有自己的地址,即物理地址。
在这里插入图片描述
原来认识的页表分为页目录和页表,地址空间的虚拟地址有32位,分为3个部分,10,10,12;第一个10找到页目录的第几位,然后指向对应的第几个页表;第二个10找到当前页表的第几个页框;最后的12表示的地址加上当前页框的地址找到物理的内存中的位置,就能访问到内存中的数据了。

与线程有什么关系?这样划分的形式是给不同的线程分配不同的区域,本质就是让不同的线程各自看到全部页表的子集。也就是线程看不到的页表,不让访问数据;看得到的页表,就能访问对应的数据。

1.6 验证——一个简单的线程

调用创建线程的接口:
在这里插入图片描述
第一个参数是线程标识符,第二个参数是线程的属性,第三个参数是函数指针,第四个参数是传递给线程函数的参数。

代码:

#include <iostream>
#include <unistd.h>
#include <thread>
using namespace std;

void *newthreadrun(void *arg)
{
    while (true)
    {
        cout << "I am new thread" << endl;
        sleep(1);
    }
}

int main()
{
    pthread_t ptd;
    pthread_create(&ptd, nullptr, newthreadrun, nullptr);
    while (true)
    {
        cout << "I am main thread" << endl;
        sleep(1);
    }
    return 0;
}

在这里插入图片描述
通过指令查看线程的id:

ps -aL | head -1 && ps -aL | grep mytestThread

在这里插入图片描述
两个pid是一样的,说明这两个线程属于一个进程;LWP表示的是轻量级进程,也可以理解为线程,操作系统在调度的时候看的就是LWP。当一个进程内部只有一个线程时,PID=LWD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值