Linux--线程的认识(一)

2024-05-29 1839阅读

线程的概念

线程(Thread)是操作系统中进行程序执行的最小单位,也是程序调度和分派的基本单位。它通常被包含在进程之中,是进程中的实际运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

像之前所有执行的程序,都是用main作为主函数,单线程执行的;一切的语句都是在main函数中从上至下依次进行的;如果一条语句阻塞了,那么整个进程都将阻塞;

线程的特点

并发执行:线程是进程内的一条执行路径或控制单元,因此多个线程可以在同一进程中并发执行,共享进程的资源(如内存空间、文件句柄等)。

独立调度:线程作为系统调度的基本单位,系统能独立地分配CPU给线程,从而确保每个线程都能独立运行。

轻量级:线程的创建、销毁和切换比进程更快速,因为线程间的资源共享减少了资源分配和回收的开销。

同步与互斥:由于多个线程可能同时访问共享资源,因此需要使用同步机制(如互斥锁、条件变量等)来确保数据的一致性和正确性。

多线程编程:多线程编程模型允许开发者编写能够并发执行多个任务的应用程序,以提高程序的性能和响应能力。

线程的主要特点就是能够在进程中并发执行,对于一项任务来说,如果是流程分布的,那么单人打工和多人打工的效率可想而知,多线程的效率能够大大提高;并且相对于进程来说,它的开销更小,也就是比进程的量级小,这样我们可以有效利用资源,提高一切有用效率。

线程与进程的区别

Linux--线程的认识(一)

进程是操作系统资源分配和调度的基本单位;

线程是进程的一部分,是CPU调度和分配的基本单位;

每个进程都拥有自己独立的地址空间和系统资源,进程之间的资源是独立的;

线程不拥有系统资源,它们共享其所属进程的资源;

每个独立的进程都有一个程序运行的入口、顺序执行序列和程序入口;

线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制;

线程如何访问到内存(页表的进一步理解)

之前我们一直讲述,进程拥有自己的进程地址空间,上面的地址都是虚拟地址,需要通过页表的映射找到对应的物理内存;

那对于线程是如何找到对应内存的?

线程本身并不通过页表映射物理内存找到对应物理地址。线程是进程的一部分,它们共享进程的地址空间,包括进程的页表。当线程在访问内存时,实际上是进程在进程内存访问。因此页表的映射过程是在进程层面进行的。

下面简述线程是如何找到对应内存的:

    1. 虚拟地址的生成:当线程需要访问内存时,它会在进程中产生一个虚拟地址,这个虚拟地址就是在进程地址空间的。
    1. 页表查找:CPU使用虚拟地址的页号部分作为索引来查找进程的页表。页表是一个包含多个表项的数据结构,每个页表都对应一个虚拟页面,并记录该页面在物理内存中的位置或其他相关信息。(类似于我们找到一本书,翻开目录查找相应页数中的内容);

    Linux--线程的认识(一)

      1. 页表项解析:CPU从页表中获取与虚拟地址对应的页表项。
      1. 构建物理地址:CPU将页表项中的物理页帧号与虚拟地址的页内偏移量相结合,生成一个完整的物理地址。该物理地址指向物理内存中实际存储数据的位置。
      1. 内存访问:CPU使用这个物理地址来访问内存中的数据。如果页面已经存在于物理内存中(即该页面已经被加载到内存中),则CPU可以直接从物理内存中读取或写入数据(共享内存)。如果页面不存在于物理内存中(即发生了页错误),则操作系统将触发页面置换算法来选择一个页面进行置换,并将所需的页面从磁盘或其他存储介质中加载到物理内存中。

      线程的控制

      简单使用

      void* newthreadrun()
      {
            while(true)
          {      
              cout
          //1.id
          //2对于新线程和主线程哪个先运行,由调度器决定
          pthread_t tid;
          void* ret=nullptr;
          pthread_create(&tid,nullptr,newthreadrun,nullptr);
          
          while(true)
          {
              cout
          char id[64];
          snprintf(id,sizeof(id),"0x%lx",tid);
          return id;
      }
      void* newthreadrun()
      {
          while(true)
          {
              cout
          //1.id
          //2.对于新线程和主线程哪个先运行,由调度器决定
          pthread_t tid;
          pthread_create(&tid,nullptr,newthreadrun,nullptr);
          while(true)
          {
              cout
          char id[64];
          snprintf(id,sizeof(id),"0x%lx",tid);
          return id;
      }
      void* newthreadrun(void* args)
      {
          string threadname=(char*)args;
          
          while(true)
          { 
              cout
          //1.id
          //2对于新线程和主线程哪个先运行,由调度器决定
          pthread_t tid;
          void* ret=nullptr;
          pthread_create(&tid,nullptr,newthreadrun,(void*)"thread-1");//传参
          while(true)
          {
              
              cout
          char id[64];
          snprintf(id,sizeof(id),"0x%lx",tid);
          return id;
      }
      void* newthreadrun(void* args)
      {
          string threadname=(char*)args;
          
          while(true)
          { 
              cout
          //1.id
          //2对于新线程和主线程哪个先运行,由调度器决定
          pthread_t tid;
          void* ret=nullptr;
          pthread_create(&tid,nullptr,newthreadrun,(void*)"thread-1");//传参
          while(true)
          {
              
              cout
          char id[64];
          snprintf(id,sizeof(id),"0x%lx",tid);
          return id;
      }
      void* newthreadrun(void* args)
      {
          string threadname=(char*)args;
          int cnt=5;
          while(cnt--)
          {
              printf("new thread, g_val: %d, &g_val: %p\n", g_val, &g_val);
              g_val++;
              sleep(1);
          }
         pthread_exit((void*)123);
      }
      int main()
      {   
          pthread_t tid;
          void* ret=nullptr;
          pthread_create(&tid,nullptr,newthreadrun,(void*)"thread-1");//传参
          while(cnt--)
          {
               printf("main thread, g_val: %d, &g_val: %p\n", g_val, &g_val);
             
               sleep(1);
          }    
          int n=pthread_join(tid,&ret);
          cout
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]