011 Linux_线程概念与创建

前言

本文将会向你介绍线程的概念,以及线程是怎么被创建的

线程概念

一、进程是承担系统资源的基本实体,线程是cpu调度的基本单位

首先,地址空间在逻辑上相当于进程的资源窗口, 每个进程都有这样一个资源窗口。通过地址空间+页表获取自身的代码和数据
在这里插入图片描述

那么有没有可能创建一个“进程”只需要创建一个pcb进程控制块即可?(以前创建进程,需要创建地址空间,页表,建立映射关系等等)

只需要创建一个pcb和父进程指向同一个地址空间的起始位置 注定了每一个“进程”看到的是同一个资源窗口(包括主进程,再创建几个进程,每个pcb都指向同一个地址空间,这意味着每个进程都能看到同一份“资源”),把代码拆成几个部分,把该共享的共享,不该共享的每个“进程”各一份,每个"进程"只会执行一部分代码

在这里插入图片描述
其实后续创建的每一个“进程”就是linux给出的线程的概念

每一个执行流占一份,每个执行流只需要占页表的一部分,就可以看到每一个区域不同的资源块
创建线程的量级明显比创建进程的要低, 创建进程要从0创建,pcb地址空间构建各种映射关系,页表,加载代码和数据,动态库也要加载,初始化各种代码和数据等等
创建线程只需要创建个pcb,并没有过多的资源申请,线程是参与资源分配的

LInux中线程的实现方案

操作系统只给线程是什么,特征是什么
具体一款os,无论底层怎么实现,只要符合给出的线程概念,就是线程,在教材里只给出线程的特征,但并不给出怎么实现线程,需要各个平台去实现符合概念的线程
(就好比不管你读的哪个大学,读的清华,还是北大,都是大学生)

综上所述:

1.线程创建更简单,
2.线程在进程的地址空间中运行(在进程内部中运行) 主进程创建时,申请地址空间,页表等等资源等到后续再创建线程时,就只需要创建一个pcb即可指向同一个地址空间,分配其中的资源,因此线程在进程的地址空间中运行

想必第一点你已经理解了,线程的创建更加地简单
那么第二点该如何理解呢?
从前的进程:内部只有一个执行流(红色框内的表示进程)
在这里插入图片描述

现在的进程(进程=内核数据结构+代码和数据):内部有多个执行流(整个红色框内表示一个进程)
其中第一个线程表示的是主线程
因此回到开头,进程(整个红色框所包含的)是承担系统资源的基本实体,而线程(一个个task_struct)是cpu调度的基本单位
在这里插入图片描述
往后cpu看到一个pcb就执行该pcb的方法,方法只需要能在地址空间上被分配资源,cpu就执行进程代码的一部分,访问进程数据的一部分
因此真实在cpu上真实跑的执行流(轻量级进程—线程)就比传统进程的量级要低一些

线程的创建

功能:创建一个新的线程
原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void * (start_routine)(void), void *arg);
参数:
thread:返回线程ID attr:设置线程的属性
attr为NULL表示使用默认属性
start_routine:是个函数地址,线程启动后要执行的函数
arg:传给线程启动函数的参数 返回值:成功返回0;失败返回错误码

绝大多数函数的名字以“pthread_”打头的函数
要使用这些函数库,要通过引入头文件<pthread.h> 链接这些线程函数库时要使用编译器命令的“-lpthread”选项

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
int gcnt = 100;
//新线程
void *ThreadRoutine(void *arg)
{const char *threadname = (const char *)arg;while(true){std::cout<<"I am a new thread:" << threadname << ",pid: "<< getpid() << "gcnt:" << gcnt << "," << &gcnt << std::endl;gcnt--;sleep(1);}
}
int main()
{pthread_t tid1;  //实际上pthread_t就是无符号长整形//创建线程1pthread_create(&tid1, NULL, ThreadRoutine, (void*)"thread 1");sleep(2);//主线程while(true){std::cout << "I am main thread" << std::endl;sleep(1);}return 0;
}

通过

ps -aL 命令来查看线程id

在这里插入图片描述
现象:打印的pid是一样的,说明两个线程是属于同一个进程里的线程,因此获取的pid相同(理解:可以看看前文讲的现在的进程是怎样的)
LWP是用来区分线程的,全名是LIGHT WEIGHT PROCESSES轻量级进程(也就是线程)
在第一行中PID与LWP相同的就是主线程

#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <sys/types.h>
int gcnt = 100;
void *ThreadRoutine(void *arg)
{const char *threadname = (const char *)arg;while(true){std::cout<<"I am a new thread:" << threadname << ",pid: "<< getpid() << "gcnt:" << gcnt << "," << &gcnt << std::endl;gcnt--;sleep(1);}
}
int main()
{pthread_t tid1;  //实际上pthread_t就是无符号长整形//创建线程1pthread_create(&tid1, NULL, ThreadRoutine, (void*)"thread 1");sleep(2);pthread_t tid2;//创建线程2pthread_create(&tid2, NULL, ThreadRoutine, (void*)"thread 2");sleep(2);pthread_t tid3;//创建线程3pthread_create(&tid3, NULL, ThreadRoutine, (void*)"thread 3");sleep(2);//主线程while(true){std::cout << "I am main thread" << std::endl;sleep(1);}return 0;
}

现象:所有线程共享同一份地址空间(共享同一份资源,观察:每个线程上对gcnt变量的修改在全局上有效)
在这里插入图片描述

小结

今日的分享就到这里啦,如果本文存在疏漏或错误的地方,还请您能够指出!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试知识点合集

原型和原型链 任何函数都可以作为构造函数。当该函数通过 new 关键字调用的时候&#xff0c;就称之为构造函数。 var Parent function(){}//定义一个函数&#xff0c;那它只是一个普通的函数&#xff0c;不能称它为构造函数var instance new Parent(); //这时这个Parent就不…

C#理论 —— WPF 应用程序Console 控制台应用

文章目录 1. WPF 应用程序1.1 工程创建1.2 控件1.2.1 控件的公共属性1.2.1 TextBox 文本框1.2.1 Button 按钮 *. Console 控制台应用1.1 工程创建 1. WPF 应用程序 1.1 工程创建 Visual Studio 中新建项目 - 选择WPF 应用程序&#xff1b; 1.2 控件 1.2.1 控件的公共属性 …

Linux网络编程——网络基础

Linux网络编程——网络基础 1. 网络结构模式1.1 C/S 结构1.2 B/S 结构 2. MAC 地址3. IP地址3.1 简介3.2 IP 地址编址方式 4. 端口4.1 简介4.2 端口类型 5. 网络模型5.1 OSI 七层参考模型5.2 TCP/IP 四层模型 6. 协议6.1 简介6.2 常见协议6.3 UDP 协议6.4 TCP 协议6.5 IP 协议6…

【兔子机器人】根据自身机器人参数修改simulink模型

关节电机 机体初始高度 &#xff01;&#xff01;&#xff01;接下来尝试修改各腿的坐标朝向

LeetCode54题:螺旋矩阵(python3)

路径的长度即为矩阵中的元素数量&#xff0c;当路径的长度达到矩阵中的元素数量时即为完整路径&#xff0c;将该路径返回。 循环打印&#xff1a; “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。 class Solution:def spiralOrder(self, matrix: List[List[i…

怎么对App进行功能测试

测试人员常被看作是bug的寻找者&#xff0c;但你曾想过他们实际是如何开展测试的吗&#xff1f;你是否好奇他们究竟都做些什么&#xff0c;以及他们如何在一个典型的技术项目中体现价值&#xff1f;本文将带你经历测试人员的思维过程&#xff0c;探讨他们测试app时的各种考虑. …

Android和Linux的嵌入式开发差异

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

【C语言】linux内核generic_xdp_tx

一、中文注释 /* 在执行通用XDP时&#xff0c;我们必须绕过qdisc层和网络挖掘点&#xff0c;* 以匹配驱动内XDP的行为。*/ void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog) {struct net_device *dev skb->dev; // 获取skb对应的网络设备struct netd…

面试高频率问答题目

索引&#xff1a; 主键索引&#xff1a;表的id &#xff08;唯一 且 不能为空&#xff09; 唯一索引&#xff1a;表User 假设有account 字段 &#xff0c;用户名不重复 &#xff08;唯一 可以为空&#xff09; 复合索引&#xff1a;where() 的条件 用户名&#xff0c;密码 …

MySQL:函数

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意&#xff1a;pwd为密码字段&#xff0c;这里使用了VARCHAR(128)类型&#xff0c;为了后面方便对比&#xff0c;开发项目里一般使用char(32)&#xff0c;SQL语句里使用MD5加密函数 USE db…

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块 说明思路准备获取Excel表格内文件名和FB块名等信息新建文件夹部分筛分获取的文件夹数据&#xff0c;去掉重复内容创建文件夹 导入FB块导出FB块的xml文件查找需要放置的文件夹导入块 说明 续上一篇文章&#xff0c;这次是根据…

多线程 --- [ 线程池、线程安全、其他常见的锁 ]

目录 1. 线程池 模块一&#xff1a;线程的封装 模块二&#xff1a;线程池的封装 模块三&#xff1a;互斥量的封装 (RAII风格) 模块四&#xff1a;任务的封装 模块五&#xff1a;日志的封装 模块六&#xff1a;时间的封装 模块六&#xff1a;主函数 模块七&#xff1a…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题&#xff08;十分十分的巧妙&#xff09;&#xff1a; 显然我们应该一行一行放&#xff0c;又竖的会对下一行产生影响&#xff0c;我们令横着放为0&#xff0c;竖着放的上方为1. 对于下一行&#xff0c;前一行放1的下面为0&#xff0c;但是会出现…

前端【技术类】资源学习网站整理(那些年的小网站)

学习网站整理 值得分享的视频博主&#xff1a;学习网站链接 百度首页的资源收藏里的截图&#xff08;排列顺序没有任何意义&#xff0c;随性而已~&#xff09;&#xff0c;可根据我标注的关键词百度搜索到这些网站呀&#xff0c;本篇末尾会一一列出来&#xff0c;供大家学习呀 …

彻底搞懂回溯算法(例题详解)

目录 什么是回溯算法&#xff1a; 子集问题&#xff1a; 子集问题II(元素可重复但不可复选): 组合问题&#xff1a; 组合问题II(元素可重复但不可复选): 排列问题&#xff1a; 排列问题II(元素可重复但不可复选): 什么是回溯算法&#xff1a; 「回溯是递归的副产品&…

leetcode hot100 每日温度

在本题中&#xff0c;我们是通过单调栈来解决的&#xff0c;因为我们采用了栈的数据结构&#xff0c;并且&#xff0c;栈内存储的元素是单调的。 本题我们考虑&#xff0c;将气温数组元素的下标存入栈中&#xff0c;首先初始化要把0放入&#xff0c;0是下标的意思。然后我们拿…

华为HCIP Datacom H12-821 卷4

1.单选题 下面哪些策略或工具不能够应用于 OSPF: A、access-list B、prefix-list C、route- Policy D、as-path filter 正确答案&#xff1a; D 解析&#xff1a; as-path-filter命令用来创建AS路径过滤器&#xff0c;OSPF属于IGP协议&#xff0c;不涉及到AS号。 2.单选题…

【python基础学习05课_for循环以及双重for循环】

FOR循环 一、认识循环-while 1、循环条件不能超出列表长度 当i 1&#xff0c;while i < len(lst1) 时&#xff0c;i 3后, 打印print&#xff08;lst[3]&#xff09;小宋老师&#xff0c; 继续1, i 4, 4不小于 len(lst1)&#xff0c;打破循环。 2、循环条件超出列表长度报错…

latex报错I was expecting a `,‘ or a `}‘的解决办法

解决办法——经过检查在ref22后面缺少一个逗号 总结 当你在使用LaTeX时遇到“I was expecting a , or a }”这样的错误&#xff0c;这通常意味着LaTeX在解析你的代码时&#xff0c;预期在某个位置看到一个逗号&#xff08;,&#xff09;或一个大括号&#xff08;}&#xff09;…

每日一题 2369

2369. 检查数组是否存在有效划分 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 &#xff0c;则可以称其为数组的一种 有效 划分&#xff1a; 子数…