什么是线程?线程和进程谁更弔?

第一个参数是所创建进程的pid。

第二个是线程的属性。

第三个参数是返回值为void*,参数也为void*的函数指针。 

第四个参数是给第三个参数的参数,也就是给给函数传参。

#include<iostream>
#include<pthread.h>
#include<unistd.h>
using namespace std;
//新线程
void *ThreadRoutine(void*args)
{
    const char*threadname=(const char*)args;
    while(true)
    {
        cout<<"I am a new thread:"<<threadname<<"pid:"<<getpid()<<endl;
        sleep(1);
    }
}
int main()
{
    // 已经有进程了
    pthread_t tid;
    pthread_create(&tid,nullptr,ThreadRoutine,(void*)"thread 1");
    //主线程
    sleep(2);
     pthread_t tid1;
    pthread_create(&tid,nullptr,ThreadRoutine,(void*)"thread 2");
    sleep(2);
     pthread_t tid2;
    pthread_create(&tid,nullptr,ThreadRoutine,(void*)"thread 3");
    sleep(2);
     pthread_t tid3;
    pthread_create(&tid,nullptr,ThreadRoutine,(void*)"thread 4");
    while(true)
    {
        cout<<"I am main thread"<<"pid:"<<getpid()<<endl;
        sleep(1);
    }
    return 0;
}

线程属于同一个进程,所以它们的pid相同。

要区分它们,就需要LWP(Lightweight processes)。

使用ps -aL命令可以查看Linux内部的轻量级进程 。

其中L指的就是light(轻)。

也就是说,在pcb中,除了pid,还有lwp这个字段。

操作系统调度的时候,看的也是lwp,判断是主线程还是新线程,看的是lwp是否等于pid。

线程的本质就是CPU调度的基本代码,Linux内核复用了进程代码,用进程pcb模拟充当线程。

在数据结构层面上,它只创建pcb,和父进程指向同一块地址空间。

在资源划分上,把代码数据划分好,各自私有或者各自执行一部分代码,执行流就可以并发跑了。

线程间大部分资源是共享的,进程要保证独立性,而线程在进程中运行。

线程较进程更轻量化,调度上来说,pcb切换另一个pcb,地址空间,页表等是不用切换的,只需更换进程运行中寄存器产生的临时数据。

换句话说,线程切换时,不需要切换CPU内部的所有寄存器的数据,而只需更换少部分。

这个是线程轻量化的一个原因,但不是主要原因,主要原因是下面这个。

CPU除了寄存器外,还集成了一个比较大的存储空间,就是硬件级别的cache。 

cache会对用户操作做出预判,加以缓存,大概率猜对,猜不对也没关系,重新缓存。

预加载是一种IO,但是也不会对整体效率有太大影响。

我们一般把保存在cache中的一部分代码和数据叫做热数据。

cache的缓存是以进程为单位的,线程间切换不需要切换cache。

因为cache缓存的本来就是地址空间中的代码和数据。

进程和线程共享进程的时间片,创建线程时时间片不会增多,因为时间片本身也是资源。

相关推荐

  1. 进程线

    2024-04-22 18:00:08       7 阅读
  2. 线忙循环什么

    2024-04-22 18:00:08       37 阅读
  3. 进程线

    2024-04-22 18:00:08       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 18:00:08       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 18:00:08       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 18:00:08       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 18:00:08       20 阅读

热门阅读

  1. 每天学习一个Linux命令之chown

    2024-04-22 18:00:08       16 阅读
  2. 常见的领域驱动设计架构

    2024-04-22 18:00:08       16 阅读
  3. SRE职能描述以及个人见解

    2024-04-22 18:00:08       14 阅读
  4. 力扣【剑指offer】二维数组中的查找

    2024-04-22 18:00:08       12 阅读
  5. cannot import name ‘cross_validation’ from ‘sklearn’

    2024-04-22 18:00:08       15 阅读
  6. linux无网环境实现nginx免安装

    2024-04-22 18:00:08       13 阅读
  7. 前端:防止重复请求的方案

    2024-04-22 18:00:08       11 阅读
  8. 初始C++

    初始C++

    2024-04-22 18:00:08      10 阅读
  9. 【C++进阶】特殊类的设计——单例模式详解

    2024-04-22 18:00:08       12 阅读
  10. XiaodiSec day031 Learn Note 小迪渗透学习笔记

    2024-04-22 18:00:08       12 阅读
  11. FPGA学习路线

    2024-04-22 18:00:08       13 阅读
  12. c#创建安装windows服务

    2024-04-22 18:00:08       11 阅读
  13. 电子证据的固定方法研究

    2024-04-22 18:00:08       14 阅读
  14. gRPC健康检查原理学习笔记

    2024-04-22 18:00:08       15 阅读