进程与线程

2023-05-16

进程与线程

讲线程之前要了解:进程间的通信(Inter-Process Communication IPC)
理论上,进程之间是独立的,但实际上往往是多个进程之间的互相配合完成复杂的工作。例如:使用MySQL时,通过workbench进程和mysql服务器进程进行通信,来实现数据的增删查改。因此就有了进程之间交换数据的必要性。
问题是:OS进行资源分配是以进程为基本单位进行分配的,包括内存。分配给A进程的内存不会在分配给B进程。所以,进程之间通过内存来进行数据交换的可能性完全不存在。A,B进程之间被隔离了。
此时,OS提供了一套机制,用于让进程之间进行必要的数据交换——进程间通信。
⭐进程间通信的常见方式:

  1. 管道(pipe)
  2. 消息队列(message queue)
  3. 信号量(semaphore)
  4. 信号(signal)
  5. 共享内存(shared memory)
  6. 网络(network)——workbench 和 mysql通信的方式
    ——————————————
    现在说OS系统层面上的线程(thread):
    ⭐进程(process)和线程(thread)的关系:
    1.进程和线程是一对多的关系。一个线程一定属于一个进程,一个进程下可以允许有多个线程。
    2.一个进程内至少有一个线程,通常这个一开始就存在的线程,称为主线程(main thread)。主线程和其他线程之间地位完全相等,没有任何特殊性。
    3.为什么OS要引入线程这一个概念:进程这一个概念天生就是资源隔离的,所以进程之间进行数据通信注定是一个高成本的工作。现实中,一个任务需要多个执行流一起配合完成是很常见的。所以,需要一种方便数据通信的执行流概念出来,线程就承担了这一职责。
    须知:
    执行流(execution flow):拥有独立PC的一套指令;不同的执行流从现象上看起来是完全独立的。
    ———————————————
    什么是线程?
    线程是OS进行调度的基本单位(调度:分配CPU)
    线程变成了独立执行的承载概念,进程退化成只是资源的承载概念(不含CPU)。
    比如:
    运行一个程序,没有线程之前,OS创建进程,分配资源,给定一个唯一的PC,进行运行。
    有了线程之后,OS创建进程,分配资源。创建主线程,给定一个唯一的PC,进行运行。一个进程中,主线程,其他线程,独立PC,可以简单地在共享着的内存中,简单的实现通信问题。
    ———————————————
    ⭐须知:
    没提出线程之前:进程:资源分配的基本单位,执行流的承载单位。
    提出线程之后:进程:资源分配的基本单位;线程:执行流的承载单位。
    进程:OS进行资源分配的基本单位(不包含CPU资源)
    线程:OS进行调度的单位(CPU资源)
    程序的一次执行过程表现为一个进程,main所在的线程是主线程。主线程中可以运行对应的操作来创建其他线程。
    只针对OS级别的线程:OS针对同一个进程下的进程实现“连坐”机制:一旦一个线程异常退出,OS会关闭该线程所在的整个过程。
    ———————————————
    线程 VS 进程:
    1.概念上的区别。
    2.由于进程把调度单位给线程了,使得单纯进程的创建销毁适当简单。
    3.线程的创建销毁不涉及资源分配、回收问题,所以通常说,线程的创建销毁成本要低于进程成本。
    ———————————————
    接下来说针对JVM中规定的线程:
    “Java线程” vs “OS线程(原生线程)”:
    不同的JVM有不同的实现,除了极少的几个现象外在表现基本一致。Java线程一个线程异常不会影响其他线程。我们用的HotSpot(Java实现的JVM)实现一个OS线程实现一个Java线程。
    ⭐Java线程在代码中的体现:
    java.lang.Thread类(包括其子类)的一个对象
    ⭐如何在代码中创建线程,两种最基本方式:
    其一、通过继承Thread类,重写run方法。实例化该类的对象>Thread对象
    其二、通过实现Runnable接口,并且重写run方法。实例化Runnable对象,利用Runnable对象去构建一个Thread对象。
    Thread——线程
    Runnable——让这个线程去完成的工作
    启动线程:有了一个Thread对象时,调用start()方法
    如图:Java线程调用
    代码演示,继承java.lang.Thread类使用线程:
package com.how_to_start_thread.demo2;
public class MyThread extends Thread{

    @Override
    public void run() {
        System.out.println("MyThread类下的run方法中的语句,会运行在子线程中");
    }
}

package com.how_to_start_thread.demo2;
public class Main {
    public static void main(String[] args) {
        MyThread t=new MyThread();
        t.start();
        System.out.println("Main类下的main静态方法中的语句,会运行在主线程中");
    }
}

第一种运行结果:
线程演示
第二种运行结果:
线程演示
两种演示结果是随机出现的,原因是:从子线程进入到就绪队列的这一刻其,子线程和主线程在地位上就完全平等了。所有哪个线程被选中去分配CPU,是完全随机的。先执行子线程中的语句还是主线程中的语句,理论上都是可能的。
⭐但是大概率都是主线程中的先打印先执行的,为什么?(第一种结果)
t.start() 是主线程语句,换言之,这条语句被执行了,说明主线程现在正在CPU上(主线程是运行状态)。主线程刚刚执行完t.start() 就马上发生子线程调度的概率不大,所以,大概率还是t.start() 的下一条语句先执行了。
线程调度
但不否认有这种情况:(第二种结果):1.非常碰巧的在t.start() 之后,System.out.println(“Main类下的main静态方法中的语句,会运行在主线程中”);之前,发生一次线程调度。主线程的状态:运行>就绪,主线程不在拥有CPU,那么以主线程t.start() 的下一条语句不再执行。调取的时候,选中子线程调度,子线程的状态:就绪>运行,子线程拥有CPU,就会执行子线程的语句。

package com.how_to_start_thread.demo2;

public class ErrorMain {
    public static void main(String[] args) {
        MyThread t =new MyThread();
        t.start();
        t.start();
    }
}

线程演示
以上情况原因:一个已经调用过start() 就不能在调用start() 了。t.start() 只运行工作在“新建”状态下。否则会报错:非法线程状态异常。
⭐还需要注意的点:不能调用成run() 方法,调用成run() 方法就和线程没关系了。完全是在主线程下运行代码。
如图示:线程演示
线程演示
线程演示
———————————————
什么情况下会出现线程调度?(开始选择新的线程分配CPU)
第一种:CPU空闲
1.(运行>结束)当前运行着的CPU执行结束。
2.(运行>阻塞)等待外部条件。
3.(运行>就绪)线程主动放弃。
第二种:被调度器主动调度
1.高优先级线程抢先。
2.时间片耗尽(这种情况比较常见)。
在多线程中,明明代码是固定的,但会出现的现象是随机的可能性,主要原因就是调度的随机性体现在线程的运行过程中。
如图示:线程演示
运行结果不是唯一的:
线程演示
线程演示
我们写的无论示Thread的子类还是Runnable的实现类,只是给线程启动的“程序”。所以同一个程序,可以启动多个线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程与线程 的相关文章

  • PX4平台(V3)+T8S遥控器校准

    1 PX4与接收机的连接 首先 xff0c 将遥控器接收机的信号线与PX4的RC IN信号相连 xff08 注意正负极 xff09 xff0c 在主控上电之后 xff0c 观察接收机信号指示灯的颜色 xff1a 1 PWM 信号工作模式 接
  • PX4编写CAN应用程序控制底盘运动

    目录 一 在PX4平台中添加自己的应用程序 1 建立应用程序 Hello can c文件 xff1a Kconfig文件 xff1a CMakeLists txt文件 xff1a 2 编译应用程序及固件 3 测试应用 xff08 硬件 xf
  • PyCharm2021安装教程

    Windows安装PyCharm2021教程 一 下载安装PyCharm二 安装Python三 配置PyCharm环境四 使用PyCharm五 PyCharm简介 一 下载安装PyCharm 1 进入官网PyCharm的下载地址 xff1a
  • ROS学习(二)创建功能包

    在上一讲中我们已经创建好工作空间catkin ws xff0c 我们要在其src文件中创建功能包 文章目录 一 创建功能包二 编译功能包三 查看功能包的依赖3 1一阶依赖3 2间接依赖 四 定制功能包自定义package xml文件4 1
  • 双冒号(::)和单冒号(:)在 C++ 中的含义和作用

    目录 一 双冒号 xff08 xff09 在C 43 43 中的含义和作用 二 单冒号 xff08 xff09 在C 43 43 中的含义和作用 双冒号 xff08 xff09 和单冒号 xff08 xff09 在 C 43 43 中都是特
  • 【OpenCV教程】OpenCV中的数据类型

    文章目录 1 CV 8U2 CV 8S3 CV 16U4 CV 16S5 CV 16F6 CV 32S7 CV 32F8 CV 64F9 一图流 1 CV 8U CV 8U 占8位的unsigned CV 8UC n 占8位的unsigne
  • 【ROS教程】安装ROS全流程及可能遇到的问题

    文章目录 1 配置Softerware amp Updates2 添加软件源3 设置key4 更新并安装4 1 更新4 2 安装 ros noetic desktop full 4 2 1 安装aptitude4 2 2 安装ROS软件包
  • 【unix】unix环境高级编程

    文章目录 1 UNIX基础知识1 基本知识2 文件和目录3 输入和输出4 程序和进程5 出错处理6 用户标识7 信号8 时间9 系统调用和库函数 标准化和实现1 标准化 ISO C POSIX Single UNIX Specificati
  • 在 Ubuntu 中安装 VSCode

    在 Ubuntu 中安装 VSCode 如果想要通过 ubuntu 安装 vscode 有三种方式 xff0c 可以通过应用中心下载 xff0c 也可以通过安装包下载 xff0c 以及指令安装 方式一 xff1a 首先在 ubuntu 桌面
  • 常用命名规范分类:匈牙利命名法、下划线命名法、驼峰命名法、帕斯卡命名法

    目录 1 匈牙利命名法 xff08 Hungarian xff09 变量属性 2 下划线命名法 xff08 UnderScoreCase xff09 3 驼峰命名法 xff08 小驼峰命名法 xff09 xff08 Camel xff09
  • keil5无法跳转自己要查询的函数

    之前用keil5的时候想要查询函数的意思 xff0c 去跳转结果给我报错 xff0c 出现这个报错信息 原因是编译的时候没有勾选这个按钮 xff1a 勾选上之后重新编译就不会报错了
  • Linux 安装 Node.js | NPM

    超级简单 yum y install nodejs 验证安装 安装node js 会自动一起安装npm 注意 python V 是大写字母V 错写为小写会进入python的编辑模式 执行exit 退出 执行node 启动node终端 两次C
  • 树莓派连接不上WIFi,VNC失效,SSH失效

    笔记 xff1a 树莓派连接不上wifi的解决方法 xff1a 1 xff0c usb连接手机 xff0c 手机设置中搜索 xff0c usb共享网络 xff0c 然后代开usb连接网络 2 xff0c 右键树莓派wifi标志符 xff0c

随机推荐

  • C++中类的运算符重载教程(一),内附完整代码与解析

    目录 xff1a 一 xff1a 加号运算符重载 对 43 重载函数的理解 xff1a xff08 个人理解 xff0c 仅供参考 xff09 二 xff1a 左移运算符的重载 对 lt lt 重载函数的理解 xff08 个人理解 xff0
  • 关于ros中pcl_ros和ros链接问题Makefile:140的一种解决方案

    本人在ros学习pcl和slam过程中 xff0c 使用catkin make进行编译 xff0c 最终只报了错误Makefile 140和make j4 l4错误 xff0c 诸如此类错误 xff0c 多为链接过程出现问题 坑多日 xff
  • rosbag播放过程ctrl+z暂停后继续播放的方法

    rviz 43 rosbag播放暂停与继续播放 rosbag播放暂停的方式可以在rosbag运行窗口 space按键进行控制 该方法用于进程管理的学习扩展 问题描述 xff1a rosbag包播放过程ctrl 43 z暂停播放恢复播放方法
  • github上docker镜像创建容器

    docker介绍 三个概念 1 镜像 xff1a 类似于模版 xff0c 在没有添加实例化前不能使用 2 容器 xff1a 镜像实例化 3 docker xff1a 放容器的一个载体 总结 xff1a docker就像一艘船 xff0c 上
  • vi/vim基本命令

    目录 打开创建文档模式介绍显示行号增删改查光标移动文档操作 打开创建文档 span class token function vim span hello txt 打开已存在hello txt文档或者创建一个不存在的hello txt文档
  • 关于leetcode刷题详细介绍

    虽然刷题一直饱受诟病 xff0c 不过不可否认刷题确实能锻炼我们的编程能力 xff0c 相信每个认真刷题的人都会有体会 现在提供在线编程评测的平台有很多 xff0c 比较有名的有 hihocoder xff0c LintCode xff0c
  • leetcode:13罗马数字转整数c++

    思路分析 两种情况 1 不同的罗马数字都是从左到右依次相加 2 不同的就是末尾数是4和9的情况 xff0c 也就是IV VIV xff08 if xff09 代码框架 整体过程 从题目中字符和数字的对应关系 xff0c 不难想到数据结构un
  • leetcode:20有效的括号——stack

    思路分析 题目匹配的情况有两中 xff1a 和 xff08 xff09 匹配成功的思路是每个 或者其他右包围结构都是和最近的 或者其他左包围结构匹配 最近 匹配的思想应该使用stack结构对数据进行操作 代码框架 1 遍历整个string
  • leetcode:21合并两个有序连表——slist

    思路分析 链表 xff1a 头节点为空 xff0c 每个节点有一个指针 xff0c 指向下一个节点的地址 俩链表节点之间比较 xff0c 用遍历 96 96 for xff0c 因为是list xff0c 可以直接通过迭代器 xff08 指
  • leetcode:53最大子数组和

    思路分析 有2个变量是一直变化的 1 最大集合的第一个元素 2 存放最大的变量 0 变量初始化 span class token keyword int span res span class token operator 61 span
  • Ubuntu安装docker及出现问题解决

    Ubuntu安装docker及出现问题解决 文章目录 Ubuntu安装docker及出现问题解决一 安装docker二 解决docker安装成功后 xff0c docker命令无法正常使用的问题 一 安装docker docker的安装可参
  • stl大全

    什么是STL xff1f 大佬 xff1a 为什么C 43 43 比C更受人欢迎呢 xff1f 除了C 43 43 的编译令人感到更舒适 xff0c C 43 43 的标准模板库 xff08 STL xff09 也占了很重要的原因 当你还在
  • input 图片上传

    使用 在vue项目中使用input上传图片给后台时 xff0c 需要对图片文件流和请求头进行一些处理 1 获取上传图片文件流 span class token tag span class token tag span class toke
  • Unix环境高级编程代码(实时更新)

    实例1 3 列出一个目录中所有文件 xff08 ls c xff09 include 34 apue h 34 include lt dirent h gt int main int argc char argv DIR dp struct
  • ROS入门(二):launch文件解析

    ROS入门 xff08 二 xff09 xff1a launch文件解析 文章目录 ROS入门 xff08 二 xff09 xff1a launch文件解析一 launch文件的运行二 launch文件格式1 浏览顺序 xff08 Eval
  • RLException: [**] is neither a launch file in package [**] nor is [**] a launch file name,.......

    按照网上现有对这个问题的解决方法 xff1a 方法1 xff0c 在工作空间下source 方法2 xff1a 对其进行路径添加 这个问题的来源还有一种来源 xff0c 你得确定你在终端运行的这个launch文件名是否写对 xff0c 打开
  • Linux 安装node.js和npm教程

    第一步 xff1a 去node js官网下载安装包 或者直接 wget https nodejs org dist v10 15 0 node v10 15 0 linux x64 tar xz 第二步 xff1a 解压 tar xf no
  • could not establish connection to “hostname”

    解决方案 Try to delete the fingerprint a single line that corresponds to this particular connection not the whole file saved
  • 基于UCOSIII的环境检测项目

    基于UCOSIII的环境检测项目 运用STM32F103C8T6开发板为项目核心板 xff0c 并加入UCOSIII实时操作系统 在操作系统基础上 xff0c 搭配外围传感器实现基于STM32环境检测项目开发 主要运用库函数在操作系统基础上
  • 进程与线程

    进程与线程 讲线程之前要了解 xff1a 进程间的通信 xff08 Inter Process Communication IPC xff1a 理论上 xff0c 进程之间是独立的 xff0c 但实际上往往是多个进程之间的互相配合完成复杂的