首页 > 系统相关 >Linux线程:线程的概念及定义

Linux线程:线程的概念及定义

时间:2024-05-26 20:05:15浏览次数:17  
标签:定义 虚拟地址 线程 页表 Linux 进程 执行 内存

目录

一、线程的概念

1.1什么是线程

 1.2Linux中线程和进程的关系

1.3页表的结构及实现

二、线程的创建及使用

2.1pthread_t


一、线程的概念

1.1什么是线程

1、在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。 2、一切进程至少都有一个执行线程。     3、线程在进程内部运行,本质是在进程地址空间内运行。 4、在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。 5、透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。

 1.2Linux中线程和进程的关系

在博主之前的文章中曾详细介绍过进程,进程=内核数据结构+代码和数据。而实际上要站在内核的角度:进程是分担系统资源的基本实体。进程实际上包含了PCB内核数据结构,进程地址空间,页表,以及其所映射到的物理内存

在以往的概念中进程执行代码是从上往下串行进行执行的,而线程则是可以并行执行的,A和B作为线程可以一起执行,互不干扰,而从理论角度上来讲线程也应该有自己的数据结构,而OS管理线程也应该是先描述再组织。而新建一个类并对其进行管理就意味着要设置一套与其匹配的算法。但Linux设计者考虑到这个问题,就将线程对进程进行了复用,从而减轻OS的复杂度。

所以Linux中线程就是直接对进程的数据结构来进行复用,所以在OS中,线程即所有被调度的执行流也被叫做轻量级进程。

而一个进程可以包含多个线程即轻量级进程,每个线程可以分别执行该进程中代码的不同部分。

1.3页表的结构及实现

页表是将虚拟地址转换为物理地址的重要结构,是OS中不可或缺的部分,而页表的实现并不像我们所认为的那样简单,一个地址对应一个真实的物理内存,博主以4GB的内存举例,如果采用这样的方式,32位平台下,需要开辟2^32-1个页表单元来映射2^32-1个虚拟地址,一个单元里包含一个虚拟地址以及一个真实的物理地址,一个地址4byte,也就是说一个页表单元8byte,乘上这么多的页表单元,整个页表就得30多个GB,内存直接爆掉,直接没得玩,而真正的页表是通过两部分来实现将虚拟地址转换为真实的物理内存:

上图是一个4btye的大小所能表示的内容,也就是32个比特位,而Linux中的页表在对这个虚拟地址转换成物理地址时,其前十位代表的是页目录,中间十位则是页表,后12位则是页内偏移量,前20位也被叫做页表项。

 如此一来,32位平台下,页表最多有1024个(此处列举的是极限数据),而要想找到一个具体的物理地址,就可以根据页目录找到对应的页表项,再根据页表项找到对应的页框,然后加上后12位的页内偏移,就可以找到具体的物理内存,为什么是12位,因为2^12byte=2^10^2^2byte=1024^4byte=4KB。而在内存中刚好是以4KB为一个内存块进行划分的,所以每一个页表单元中存储的就是一个4KB内存块的起始地址也就是页框的地址。

找如上的方法,假设页目录和页表的单个单元都是4字节(32个比特位),那整个页目录也才4KB,假设每个页目录所对应的页表都是1024个单元每个也是4byte大小,那每个页表也才4KB,如此一来就大大减小了页表所占的空间。

二、线程的创建及使用

2.1pthread_t

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                    void *(*start_routine) (void *), void *arg);
创建线程
第一个参数:线程id
第二个参数:线程属性
第三个参数:返回值void*参数void*的函数指针
第四个参数:传递给线程的参数

 接下来就通过下图的代码具体展示一下该函数的调用:

首先定义线程id,然后通过pthread_t创建一个新线程,暂时将第二和第四参数设为nullptr,将我们写的newthreadrun函数当作第三个参数进行传参。此时当前线程就会继续往下执行代码,而新创建的线程则会执行我们传过去的函数。

此时如果直接通过makefile文件去编译可执行程序我们会发现编译器报错,所以需要在编译时链接pthread库,所以需要在makefile文件中加上相关链接:

test_thread:testThread.cc
    g++ -o $@ $^ -lpthread -std=c++11
.PHONY:clean
clean:
    rm -f test_thread

 运行起来以后,我们可以发现,

查看轻量级进程,lwp就是light weight process,也就是轻量级进程,而操作系统调度时也是拿lwp来调度。当进程中只有一个执行流时,lwp=pid。这也叫做单执行流的进程。

 所以,操作系统在进行调度的时候,就是通过lwp来调度的。

而一个.c文件进行编译后,其内部的函数就变成了若干代码块,每一行代码都有其虚拟地址(逻辑地址),而函数名则是该代码块的入口,最后形成的可执行程序,所有函数都会按照地址空间统一进行编址,而线程在进行并发执行时,各自就拿着各自的起始地址和结束地址去页表中找对应的物理内存然后执行对应的代码,从而就实现了一个进程中存在多个线程,各自去执行该代码的不同部分互不干扰。

标签:定义,虚拟地址,线程,页表,Linux,进程,执行,内存
From: https://blog.csdn.net/2201_75880188/article/details/139197794

相关文章

  • 【Linux 网络】网络基础(三)(网络层协议:IP 协议)
    在复杂的网络环境中确定一个合适的路径。一、TCP与IP的关系IP层的核心作用是定位主机,具有将数据从主机A发送到主机B的能力,但是能力并不能保证一定能够做到,所以这时就需要TCP起作用了,TCP可以通过超时重传、拥塞控制等策略来保证数据能够发送到B主机。所以,TC......
  • 这个让ChatGPT变强的功能还有多少人不知道(自定义ChatGPT)!
    ChatGPT已经成为许多人日常生活和工作中的重要工具。为了更好地满足用户的个性化需求,ChatGPT推出了自定义功能。但是最近我发现很多同学因为嫌麻烦或者不知道怎么写,就没有使用过这个功能,也有些同学都不知道这个功能。所以今天我就来科普一下怎么使用这个功能使你的ChatGPT......
  • Linux NVMEM子系统:概述以及RK3588 OTP实例
     NVMEM子系统为Non-Volatile类型存储提供统一内核处理框架。1NVMEM概述NVMEM子系统为eeprom,otp,efuse类型设备提供统一的访问接口。一般都基于regmap实现读写。NVMEM子系统初始化:nvmem_initbus_register--注册NVMEM总线nvmem_bus_type。2NVMEMAPI和数据结构2.1N......
  • 线程池(C++)
    个人主页:Lei宝啊 愿所有美好如期而遇线程池实现线程类#pragmaonce#include<pthread.h>#include<iostream>#include<vector>#include<string>#include<cstdlib>#include<cstring>#include<functional>#include<unistd.h>#in......
  • 【Python并发编程指南】多线程、多进程与异步编程比较与选择
    ......
  • Windows、Linux下,基于QT的打包方法
    整理这篇文档的意义在于:自己走了很多弯路,淋过雨所以想为别人撑伞,也方便回顾,仅供参考ps:第一次做Windows下打包,用了2小时,第二次20秒第一次做Linux(ubuntu)下打包,用了8小时,第二次1分半一、Windows有许多比较坑的帖子,会带新人走不少弯路,大家注意鉴别(没方法,随缘)1、首先,找到......
  • 32bit的linux系统内存分布
    32bit的linux系统内存分布​ 在32bit的linux系统,则每个运行的程序都会得到4G大小的内存空间,只不过每个程序得到的4G大小的内存都是虚拟内存,而物理内存才只有4G,物理内存是真实存在的,而虚拟内存是通过映射得到的。(如图所示一个程序有1M大小的物理内存,在运行之后会得到4G大小的虚......
  • Linux安装Anaconda
    清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/下载好安装bashAnaconda3-2020.07-Linux-x86_64.sh空格之后yes安装环境变量重新连接......
  • linux核心基础-权限管理
    1、更改文件的权限命令总结2、文件、目录的的rwx想要删除文件,要看是否有该文件所在目录,目录是否有w权限,才可以删除文件,且还得有x权限,才能进入文件夹。(用普通用户测试)3、环境变量1、env和set命令env命令为单个用户的环境变量命令为系统整体的环境变量[root@muserver1etc]......
  • 进程和线程
    何为进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。站在操作系统的角度,进程是程......