Java并发编程(1)—— 操作系统、Linux、Java中进程与线程的区别

news2024/11/24 3:52:39

一、操作系统中什么是线程和进程

线程和进程都是操作系统中定义的结构,进程是系统中一个独立的活动程序,比如像QQ、网易云音乐,进程是操作系统进行资源分配的基本单位,一个进程中的所有线程共享进程内的资源,而线程则是进程中真正执行程序的工作单位,一个进程中由于多子任务需要可能有多个线程,每个线程都是系统运行过程中的一个独立的指令执行流,主要是基于多任务并行处理的需要设计实现的,是操作系统进行CPU调度的基本单位,由操作系统根据调度算法对系统内所有线程进行调度轮流占用CPU执行程序,这称为并发执行,基于此我们才能在宏观上看到计算机上多个程序像是在同时运行一样。

二、Linux中的进程与线程

而在Linux系统中,上述“线程”概念是通过轻量级进程实现的,实现结构为task_struct,“进程”概念是由多个线程构成的一个线程组实现的。一个线程组中有一个“主线程”(事实上和线程组中其它线程是平级的),只有主线程在创建时会实际分配资源,其他线程通过浅拷贝共享主线程的资源,通过这样的方式实现的“进程是资源分配的基本单位”。

此外,Linux系统中还有进程组的概念,一个进程组由多个进程构成,其中有一个为主进程(父进程),进程组下的其他进程都是父进程的子进程。因此,整体结构如下:

  • Linux系统中存在多个进程组
  • 一个进程组下有多个进程(1:n)
  • 一个进程对应一个线程组(1:1)
  • 一个线程组下有多个线程(1:n)

内核层面:在每一个task_struct中,用命名空间中一个唯一的pid标识其自身,使用tgid(thread group id,等于线程组中主线程的pid)标识其所属的线程组,使用pgid(Process Group ID,等于其所属进程的父进程的tgid)标识其所属的进程组。

tgid相同的所有线程(轻量级进程)组成了概念上的“进程”。在Linux内核态中,只有task_struct,不区分进程和线程。

用户层面:我们在Linux系统中使用各种命令查看线程时还会显示“线程号”tid和父进程号ppid,那么实际上tid就是pid,ppid就等于pgid。而当打印PID时,通常实际上指的是tgid,用户层面称为“进程号”。

例如我们在使用top命令时,会打印系统当前运行的进程列表信息,其中的进程号PID指的就是进程的tgid
在这里插入图片描述
使用命令 <top -Hp 指定进程id> 显示的列表中的PID才是进程中线程的id

可能感觉有点绕,这样设计主要是为了让用户在使用Linux系统时有抽象的进程和线程的感觉,符合操作系统的抽象设计。我们只要在作为用户使用Linux时记住TID就是线程号,PID一般就是进程号,PPID就是父进程号,在实际分析Linux时不要搞错了就行了。

参考文章:

1.通俗易懂的了解——Linux线程模型和线程切换

2.进程各种id:pid、pgid、sid、全局pid、局部pid

3.Linux中pid与tid的异同及top中pid字段含义

三、Java中的线程

一个JVM就是一个进程。

Java中的线程是由Java虚拟机(JVM)管理的,是一个轻量级的执行单元。Java程序员可以使用Java的线程API来创建和控制线程,但实际上,这些线程最终都是由操作系统中的线程来执行的。

在Hotspot JVM中,每个线程与操作系统中的线程直接映射。当一个Java线程准备好执行后,此时操作系统的一个本地线程也同时创建,本地线程初始化完成后就开始执行Java线程run方法的字节码指令流译出的机器指令流,由系统进行调度。Java线程执行终止后,本地线程也会回收。

因此,Java中的线程可以看作是对操作系统线程的封装,它提供了一种方便的方式来管理和控制线程。Java程序员可以使用Java线程API来创建和启动线程,设置线程的优先级、状态等属性,并使用同步机制来协调多个线程之间的执行顺序。而操作系统负责管理线程的调度、内存分配等底层细节,以确保线程能够高效地运行。

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

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

相关文章

【Python学习笔记】第十八节 Python 内置函数

Python 内置函数内置函数就是Python给你提供的, 拿来直接用的函数&#xff0c;比如print&#xff0c;input等Python 内置函数一览表内置函数abs()divmod()input()open()staticmethod()all()enumerate()int()ord()str()any()eval()isinstance()pow()sum()basestring()execfile()…

ARMv8 同步和信号量(读写一致性问题):Load-Exclusive/Store-Exclusive指令详解

目录 一&#xff0c;Local Monitor 与 Global Monitor 1&#xff0c;Local Monitor 2&#xff0c;Global Monitor 二&#xff0c;Exclusive 指令的简单使用 三&#xff0c;Exclusive 示例程序 1&#xff0c;原子自加1程序 2&#xff0c;原子锁程序 四&#xff0c; 多处理…

算法设计与智能计算 || 专题一: 算法基础

专题一: 算法基础 文章目录专题一: 算法基础1. 算法的定义及特点1.1 算法的基本特征1.2 算法的基本要素1.3 算法的评定2 算法常见执行方法2.1 判断语句2.2 循环语句2.3 综合运用3. 计算复杂度4. 代码的重用5. 类函数的定义与使用5.1 定义类5.2 调用类函数1. 算法的定义及特点 …

_hand-2

实现一个迷你版的vue 入口 // js/vue.js class Vue {constructor (options) {// 1. 通过属性保存选项的数据this.$options options || {}this.$data options.data || {}this.$el typeof options.el string ? document.querySelector(options.el) : options.el// 2. 把da…

php mysql高校田径运动会成绩管理系统

第一章 引言 1 1.1 选题背景 1 1.2 编写目的 2 1.3 目标 2 1.4 功能需求 3 第二章 开发工具介绍 4 2.1 PHP 4 2.2 APACHE 5 2.3 MYSQL数据库 5 2.4 运行环境 WINDOWS XP 6 2.5 XAMPP 6 2.6 DREAMWEAVE8 6 2.7 EDITPLUS 7 第三章 需求…

【华为OD机试模拟题】用 C++ 实现 - 热点网络统计(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明热点网络统计【华为OD机试模拟题】题目输入输出描述示例一输入输出示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出…

C++入门知识【超详解】

目录1.认识Chello worldC关键字2.命名空间3.std标准库4.输入输出5.缺省参数6.函数重载7.引用7.1引用的概念7.2引用的场景1.作参数2.作返回值7.3引用的注意点7.4指针和引用的区别8.auto关键字9.基于范围的for循环10.内联函数10.1概念10.2特征11. C98中的指针空值1.认识C hello …

数据结构——单链表(上)

&#x1f307;个人主页&#xff1a;_麦麦_ &#x1f4da;今日名言&#xff1a;“生活总是让我们遍体鳞伤&#xff0c;但到后来&#xff0c;那些受伤的地方一定会变成我们最强壮的地方。” ——海明威《永别了武器》 目录 ​编辑 一、前言 二、正言 3.1链表的概念及结构…

HMM(隐马尔科夫模型)-理论补充2

目录 一.大数定理 二.监督学习方法 1.初始概率 2.转移概率 3.观测概率 三.Baum-Welch算法 1.EM算法整体框架 2. Baum-Welch算法 3.EM过程 4.极大化 5.初始状态概率 6.转移概率和观测概率 四.预测算法 1.预测的近似算法 2.Viterbi算法 1.定义 2. 递推&#xff1…

倒计时2天:中国工程院院士谭建荣等嘉宾确认出席,“警务+”时代来临...

近日伴随公安部、科技部联合印发通知&#xff0c;部署推进科技兴警三年行动计划&#xff08;2023-2025年&#xff09;&#xff0c;现代科技手段与警务工作相结合的方式&#xff0c;正式被定义为未来警务发展的新趋势。 21世纪以来&#xff0c;随着科技的不断发展和创新&#xf…

硬间隔支持向量机算法、软间隔支持向量机算法、非线性支持向量机算法详细介绍及其原理详解

相关文章 K近邻算法和KD树详细介绍及其原理详解朴素贝叶斯算法和拉普拉斯平滑详细介绍及其原理详解决策树算法和CART决策树算法详细介绍及其原理详解线性回归算法和逻辑斯谛回归算法详细介绍及其原理详解硬间隔支持向量机算法、软间隔支持向量机算法、非线性支持向量机算法详细…

JavaScript Date 日期对象实例合集

文章目录JavaScript Date 日期对象实例合集一&#xff0c;使用 Date() 方法获得当日的日期二&#xff0c;使用 getFullYear() 获取年份三&#xff0c;使用getTime() 返回从 1970 年 1 月 1 日至今的毫秒数四&#xff0c;如何使用 setFullYear() 设置具体的日期五&#xff0c;使…

小兔鲜注册页面验证、阶段案例(登录、首页页面)(重点)、小兔鲜放大镜效果——DOM

目录 1. 小兔鲜注册页面验证 2. 阶段案例&#xff08;登录、首页页面&#xff09;&#xff08;重点&#xff09; 3. 小兔鲜放大镜效果 1. 小兔鲜注册页面验证 验证码模块有个小问题&#xff1a; 连续点击获取验证码会导致触发多次计时器&#xff0c;会导致计时出现问题&…

【Stata】从入门到精通.零基础小白必学的教程,一学就fei

视频教程移步&#xff1a;https://www.bilibili.com/video/BV1hK4y1d714/?p4&spm_id_frompageDriver&vd_sourcecc8074e9c81a225f214226065db53d32P3 第二讲 Stata处理数据全流程&#xff08;上&#xff09; P3 - 01:37&#xfeff;内置数据 file example datasets使用…

FastDFS - 分布式文件存储系统

目录一、分布式文件存储1.分布式文件存储的由来2.常见的分布式存储框架二、FastDFS介绍三、FastDFS安装1.拉取镜像文件2.构建Tracker服务3.构建Storage服务4.测试图片上传四、客户端操作1.Fastdfs-java-client1.1 文件上传1.2 文件下载2.SpringBoot整合一、分布式文件存储 1.分…

【MySQL】什么是意向锁 IS IX 及值得学习的思想

文章目录前言行锁和表锁使用意向锁意向锁的算法意向锁的思想JDK 中相似的思想前言 之前看 MySQL 都刻意忽略掉了 IS 和 IX 锁&#xff0c;今天看 《MySQL 是怎样运行的》&#xff0c;把意向锁讲的很通透&#xff0c;本篇博文提炼一下思想。 I: Intention Lock&#xff08;意向…

自建服务器系列-0元搭建linux服务器(windows笔记本)

0元搭建linux服务器一.windows装Centos71.1 centos7 iso镜像1.2 准备U盘1.3 UltraISO 启动盘制作工具安装1.4 准备一台windows 机器1.5 安装过程二 、连接无线wifi三、固定wifi ip3.1 查看网络状态3.2 查看DNS3.3 查看GATEWAY3.4 设置静态IP四、一键快速安装单机版k8s五、申请域…

游戏高度可配置化:通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化&#xff1a;通数据引擎在模块化游戏开发中的应用构想图解 ygluu 码客 卢益贵 目录 一、前言 二、模块化与插件 1、常规模块化 2、插件式模块化&#xff08;插件开发&#xff09; 三、通用数据引擎理论与构成 1、名字系统&#xff08;数据类型&#xf…

数据结构与算法之树结构基础

目录为什么要使用树结构树结构基本概念树的种类树的存储与表示常见的一些树的应用场景为什么要使用树结构 线性结构中不论是数组还是链表&#xff0c;他们都存在着诟病&#xff1b;比如查找某个数必须从头开始查&#xff0c;消耗较多的时间。使用树结构&#xff0c;在插入和查…

58-59-60 - 动态内存分配的实现

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 讨论2. 动态内存管理2.1 动态内存管理的关键2.2 动态内存管理的分类3. 定长内存管理的设计与实现3.1 空间划分3.2 内存申请和归还3.3 关键数据类型3.4 思考4. 变长内存管理的设计与实现4.1 空间划分4.2 内存申请和归还4.3 关键数…