【Linux系统】线程:认识线程、线程与进程统一理解
一、更新认知
之前的认知
- 进程:一个执行起来的程序。进程 = 内核数据结构 + 代码和数据
- 线程:执行流,执行粒度比进程要更细。是进程内部的一个执行分值
更新认识:
- a. 进程是承担分配系统资源的基本实体
- b. 线程是OS调度的基本单位
二、Linux下线程的概念和实现
线程是进程内部的一个执行分支,说明一个进程就可能有多个线程,这样OS就必须将线程管理起来,Linux系统管理线程会通过先描述,再组织的方式,先将线程描述成一个结构 struct threadctlblock
,再对该结构进行组织,达到对系统内线程的管理组织。
线程结构也是 task_struct
?
实际上,在 Linux系统中,没有真正的 struct threadctlblock
的 TCB 结构,Linux下的线程是用进程模拟实现的!
线程也使用进程的 task_struct
来描述,这样就无需为线程单独创建一套线程的管理机制,毕竟线程和进程过于相像,用进程模拟线程,大大减少了操作系统内核设计的难度,复用了历史代码,增加代码可维护性
减少了许多设计工作,如:线程创建、线程队列链表组织…、线程切换、线程….
Linux 这一点设计是非常厉害巧妙的,因为其他一些操作系统如 windows
是真的有线程的,内核代码和管理复杂不少!不像 Linux 的伪线程
进程内多线程共用进程资源
一个进程 task_struct
内部还有多个用于描述线程的 task_struct
。
进程 task_struct
和线程 task_struct
同属于一个PCB结构,他们共享同一个进程地址空间,共享进程内的资源。
比如划分代码区,各个线程负责执行代码的不同部分:
三、进程vs线程 概念统一
进一步理解
重新理解进程和线程
进程:task_struct
+ 地址空间 + 页表 + 代码和数据
线程:可以暂时简单理解为一个task_struct
(后续会进行更详细的解释)。
进程由PCB描述,每个进程中可能存在多个这样的控制块,它们共享同一个地址空间,分配给不同的任务使用,这便是我们所说的线程。
所以,线程实际上是一个PCB加上代码和数据(还有一些相关数据结构将在后面讨论)。
单线程 vs 多线程
在之前的学习中,每个进程就是单独的一个执行流,只有一个执行分支。这实际上是内部只有一个线程的单线程结构!
当前我们学习了多线程的概念,可以理解到只有一个执行流的进程,是多进程的特殊情况,即单线程结构
这就将进程和线程的概念统一起来了
进程与资源管理
进程作为系统资源分配的基本实体,当我们创建一个进程时,需要为其准备地址空间、PCB、页表等,这些都需要占用内存并申请系统资源。因此,进程承担了分配系统资源的责任。相反,线程无需单独申请系统资源,因为它们依赖于进程已经准备好的资源。线程更像是一个个执行流,负责拿着进程申请的资源去执行各自的程序段。
因此,线程只需划分并使用需要资源(执行程序段所需的资源),而进程才是需要申请系统资源
CPU视角下的进程与线程
从CPU的角度来看,Linux将执行流统一称为轻量级进程(LWP
: Lightweight Process
)。一个进程由多个轻量级进程组成。然而,在Linux中并没有真正意义上的线程存在;所谓的线程实际上是通过LWP模拟实现的。
轻量级进程是在 UNIX 系统中的一种进程模型,用于支持多线程编程。LWP 提供了一种比传统进程更轻便的方式来创建和管理并发执行的任务。
在传统的 UNIX 系统中,进程是独立运行的基本单位,每个进程都有自己的地址空间和其他资源。而 LWP 则共享一个进程的地址空间和其他资源,因此它们之间的切换开销较小,更适合于需要大量并发任务的应用场景。
LWP 与线程的关系密切,实际上,LWP 就是线程在操作系统中的实际表示形式之一。在某些操作系统中,如 Solaris,LWP 是线程调度的基础,而在其他操作系统中,如 Linux,LWP 可能被隐藏起来,由操作系统内部使用。
总之,LWP 是一种轻量级的进程模型,旨在提供高效的并发执行能力,适用于需要大量并发任务的应用场景。
通俗理解进程和线程
这个世界是一个巨大的操作系统和资源库,我们每个家庭都是一个个进程,作为承担世界分配资源的基本实体(每个家庭都有一定的租房地、生活空间….等资源),而家庭内的每个人都是一个个线程,每个人都有自己需要做的事:如爷爷奶奶早起公园散步锻炼、爸爸妈妈工作赚钱、你和兄弟姐妹上学学习….
每个人做事的最终目的都是为了家庭,为了提高家庭幸福而努力,即进程内的每个线程做着不同的任务,最终目的都是为了完成进程的整个大任务
认识一下线程:代码创建
我们写一些代码来创建一个线程来见识一下(仅为了了解,暂时还没开始讲代码)
创建线程的函数:
线程相关函数并不是系统调用,而是有一个单独的线程库,编译含有线程创建等函数的程序需要主动连接线程库,线程库是一种动态库
编译时加上链接线程库:
g++ -o testpthread testpthread.cc -lpthread
代码如下
#include <iostream>
#include <pthread.h>
#include <unistd.h>void *run(void *args)
{while (true){std::cout << "I am new thread" << '\n';sleep(1);}
}int main()
{// 创建新线程pthread_t tid;pthread_create(&tid, nullptr, run, (void *)"thread-1");// 主线程while (true){std::cout << "I am main thread" << '\n';sleep(1);}return 0;
}
运行结果如下:运行一个程序,有两个执行流打印语句!
代码:打印进程 pid
这些执行流(线程)都是同属于一个进程的,打印出来的进程pid都是一样的!
#include <iostream>
#include <pthread.h>
#include <unistd.h>void *run(void *args)
{while (true){std::cout << "I am new thread" << '\n';std::cout << "pid : " << getpid() << '\n'; sleep(1);}
}int main()
{std::cout << "pid : " << getpid() << '\n'; // 创建新线程pthread_t tid;pthread_create(&tid, nullptr, run, (void *)"thread-1");// 主线程while (true){std::cout << "I am main thread" << '\n';std::cout << "pid : " << getpid() << '\n'; sleep(1);}return 0;
}
上述内容讲解了 LWP
轻量级进程的概念,下面我们见识一下系统层面运行起来的轻量级进程!
ps axj # 这是查询进程的
ps -aL # 这是查询轻量级进程的
其中:pid
一样,LWP
不同
LWP
和 pid
一样 的是主线程
CPU区分线程(LWP),即区分执行流的唯一性是以 LWP 号为基准的
CPU真实调度执行流是用 LWP 号
而我们以前学习的说 CPU 用 pid 作为调度,也没错
之前学到进程都是单执行流单线程的,pid = lwp
因此实际上,进程 task_struct
内部有 pid 和 LWP 两种字段,就是为了兼容 Linux 模拟实现线程的情况
四、分页式存储管理
我们通过这篇博客认识和理解一下分页式存储管理系统:【Linux系统】分页式存储管理-CSDN博客
五、进程划分资源给线程
如何理解?如何做到?
逐步引入
首先被划分的资源肯定有代码区,通过划分代码给不同的线程执行?
其次这些划分有没有必要刻意的划分?
根据之前学过的线程创建:pthread_create(..., ..., run, ...)
线程创建出来就会去执行这个 run
函数,这意味着无论创建出来多少个线程都是会通过这些 run
的函数指针的指引找到并执行对应的函数
真相浮出
这些 run
函数都是有自己在虚拟地址空间中的虚拟地址的,我们没必要刻意的划分虚拟地址空间的代码给不同线程执行,因此当线程创建出来时,就已经根据指令为不同线程提供了对应的函数地址,线程只需根据该地址就能找到自己负责的那部分!
每个函数都是一个代码块部分,只要拥有该函数的虚拟地址,就等同于拥有该函数所有代码指令,即该代码块部分的虚拟地址。执行程序时,每个线程都查询不同部分的页表执行代码,不就完成了逻辑上对代码的划分吗!!
总的来说,CPU调度一个 LWP ,只需给他一个函数的入口地址,CPU就能讲该执行流调度运行起来
六、拓展:如何理解写时拷贝?
可以看这篇博客:【Linux系统】如何理解写时拷贝?一次拷贝4KB不浪费?-CSDN博客
相关文章:
【Linux系统】线程:认识线程、线程与进程统一理解
一、更新认知 之前的认知 进程:一个执行起来的程序。进程 内核数据结构 代码和数据线程:执行流,执行粒度比进程要更细。是进程内部的一个执行分值 更新认识: a. 进程是承担分配系统资源的基本实体b. 线程是OS调度的基本单位 …...
蓝桥杯字串简写(二分)
输入 4 abababdb a b 输出 6 思路: 如果暴力,o(n**2),超时,想到可以先与处理一下,记录c1出现的位置,再根据c2的位置用二分法看前面有多少个符合条件的c1。 why二分: 代码:一些…...
【C语言】指针详细解读3
1. 数组名的理解 我们使用指针一般访问数组内容时,我们可能会这样写: int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,⽽…...
Python爬虫-如何正确解决起点中文网的无限debugger
前言 本文是该专栏的第45篇,后面会持续分享python爬虫干货知识,记得关注。 本文以起点中文网为例子,针对起点中文网使用控制台调试出现无限debugger的情况,要如何解决? 针对该问题,笔者在正文将介绍详细而又轻松的解决方法。废话不多说,下面跟着笔者直接往下看正文详细…...
畅游Diffusion数字人(15):详细解读字节跳动最新论文——音频+姿态控制人类视频生成OmniHuman-1
Diffusion models代码解读:入门与实战 前言:昨晚字节跳动刚发布了一篇音频+姿态控制人类视频生成OmniHuman-1的论文,效果非常炸裂,并且是基于最新的MM-DiT架构,今天博主详细解读一下这一技术。 目录 贡献概述 方法详解 音频条件注入 Pose条件注入 参考图片条件注入 …...
Windows图形界面(GUI)-QT-C/C++ - QT Dock Widget
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 工具栏 2. 侧边栏 3. 调试窗口 三、常见样式 1. 停靠位置 2. 浮动窗口 3. 可关闭 4. 可移动 四、属性设置 1. 设置内容 2. 获取内容 3. 设置标题 …...
MIT AppInventor v2.74更新的内容
MIT v2.74更新的内容如下: 新的 UI 选择器提示 向菜单、调色板和设计视图添加键盘导航 更新至 Google Blockly 版本 10 按住 Shift 并拖动以选择多个块 当值被拖近并且没有空闲插槽时,文本等块会自动合并并展开列表 将块拖到边缘时工作区会自动滚动 新的…...
使用 Ollama 在 Windows 环境部署 DeepSeek 大模型实战指南
文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来,大语言模型(LLM)的应用逐渐成为技术热点,而 DeepSeek 作为国产开…...
Hackmyvm whitedoor
简介 难度:简单 靶机地址: 环境 kali:192.168.194.9 靶机:192.168.194.24 扫描 nmap -sT -sV -A -T4 192.168.194.24 -p- -Pn 三个服务,ftp匿名登录、ssh连接以及web服务 ftp里面只有一个没用的README文件 访问…...
02/06 软件设计模式
目录 一.创建型模式 抽象工厂 Abstract Factory 构建器 Builder 工厂方法 Factory Method 原型 Prototype 单例模式 Singleton 二.结构型模式 适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyw…...
Java的Integer缓存池
Java的Integer缓冲池? Integer 缓存池主要为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能。 在-128到 127范围内的 Integer 对象会被缓存和复用…...
[特殊字符] ChatGPT-4与4o大比拼
🔍 ChatGPT-4与ChatGPT-4o之间有何不同?让我们一探究竟! 🚀 性能与速度方面,GPT-4-turbo以其优化设计,提供了更快的响应速度和处理性能,非常适合需要即时反馈的应用场景。相比之下,G…...
2024年12月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试
202412 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试 一、单选题(共25题,共50分) 第 1 题 小猫初始位置和方向如下图所示,下面哪个选项能让小猫吃到老鼠?( ) A. B. …...
【2025】camunda API接口介绍以及REST接口使用(3)
前言 在前面的两篇文章我们介绍了Camunda的web端和camunda-modeler的使用。这篇文章主要介绍camunda结合springboot进行使用,以及相关api介绍。 该专栏主要为介绍camunda的学习和使用 🍅【2024】Camunda常用功能基本详细介绍和使用-下(1&…...
35.Word:公积金管理中心文员小谢【37】
目录 Word1.docx Word2.docx Word2.docx 注意本套题还是与上一套存在不同之处 Word1.docx 布局样式的应用设计页眉页脚位置在水平/垂直方向上均相对于外边距居中排列:格式→大小对话框→位置→水平/垂直 按下表所列要求将原文中的手动纯文本编号分别替换…...
关于使用numpy进行数据解析性能优化的几点认识
前言:数据解析的性能严重影响用户体验,针对需要批量处理的数据,考虑使用numpy自定义矢量化计算函数提升数据解析的性能。下面的表述都是网上查找的资料,仅供大家参考,具体情况还是需要具体分析的。 1. 使用numpy自定义…...
扣子平台的选择器节点:让智能体开发更简单,扣子免费系列教程(17)
欢迎来到涛涛聊AI。今天,我们来聊聊一个非常实用的工具——扣子平台的选择器节点。即使你不是计算机专业人员,但对计算机操作比较熟悉,这篇文章也能帮你快速上手。我们会从基础知识讲起,一步步带你了解选择器节点的使用方法和应用…...
java s7接收Byte字节,接收word转16位二进制
1图: 2.图: try {List list getNameList();//接收base64S7Connector s7Connector S7ConnectorFactory.buildTCPConnector().withHost("192.168.46.52").withPort(102).withTimeout(1000) //连接超时时间.withRack(0).withSlot(3).build()…...
学习日记250205
一.论文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 二、计划: 理一下微调相关的文章 三. )——( 明天认真学习了,不能再打这么久的星露谷了!!࿰…...
位置-速度双闭环PID控制详解与C语言实现
目录 概述 1 控制架构解析 1.1 级联控制结构 1.2 性能对比 2 数学模型 2.1 位置环(外环) 2.2 速度环(内环) 3 C语言完整实现 3.1 控制结构体定义 3.2 初始化函数 3.3 双环计算函数 4 参数整定指南 4.1 整定步骤 4.2 典型参数范围 5 关键优化技术 5.1 速度前馈 …...
21.2.1 基本操作
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 Excel的基本操作步骤: 1、打开Excel:定义了一个Application对象: Microsoft.Office.Interop.E…...
Python-基于PyQt5,Pillow,pathilb,imageio,moviepy,sys的GIF(动图)制作工具
前言:在抖音,快手等社交平台上,我们常常见到各种各样的GIF动画。在各大评论区里面,GIF图片以其短小精悍、生动有趣的特点,被广泛用于分享各种有趣的场景、搞笑的瞬间、精彩的动作等,能够快速吸引我们的注意…...
c++ stl 遍历算法和查找算法
概述: 算法主要由头文件<algorithm> <functional> <numeric> 提供 <algorithm> 是所有 STL 头文件中最大的一个,提供了超过 90 个支持各种各样算法的函数,包括排序、合并、搜索、去重、分解、遍历、数值交换、拷贝和…...
Java学习进阶路线
Java基础 Java Web 前端HTML/css/js,J2EE(Servlet/jsp),数据库(Mysql/oracle) Java开发框架 Spring MVC/Mybatis/Herbernate/maven 《Java编程思想》 深入了解java基础 Java设计模式 《Effective j…...
探寻系统响应的奥秘:为何常用以 e 为底的指数组合表示
一、引言 在工程与科学领域的系统分析中,常常会发现系统响应多以 e e e 为底的指数组合来表示。从电路系统里的电流电压变化,到机械系统的振动情况,再到控制系统的动态特性,这种表示方法无处不在。那么,究竟是什么原…...
java 进阶教程_Java进阶教程 第2版
第2版前言 第1版前言 语言基础篇 第1章 Java语言概述 1.1 Java语言简介 1.1.1 Java语言的发展历程 1.1.2 Java的版本历史 1.1.3 Java语言与C/C 1.1.4 Java的特点 1.2 JDK和Java开发环境及工作原理 1.2.1 JDK 1.2.2 Java开发环境 1.2.3 Java工作原理 1.…...
Ext文件系统
文件内容属性 被打开的文件在内存中,没有被打开的文件在磁盘里文件系统的工作就是根据路径帮我们找到在磁盘上的文件 磁盘(硬件) 磁盘的存储结构 磁头在传动臂的运动下共同进退,向磁盘写入的时候是向柱面批量写入的 OS文件系统访…...
C++滑动窗口技术深度解析:核心原理、高效实现与高阶应用实践
目录 一、滑动窗口的核心原理 二、滑动窗口的两种类型 1. 固定大小的窗口 2. 可变大小的窗口 三、实现细节与关键点 1. 窗口的初始化 2. 窗口的移动策略 3. 结果的更新时机 四、经典问题与代码示例 示例 1:和 ≥ target 的最短子数组(可变窗口…...
【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(四) -> 常见组件(一)
目录 1 -> List 1.1 -> 创建List组件 1.2 -> 添加滚动条 1.3 -> 添加侧边索引栏 1.4 -> 实现列表折叠和展开 1.5 -> 场景示例 2 -> dialog 2.1 -> 创建Dialog组件 2.2 -> 设置弹窗响应 2.3 -> 场景示例 3 -> form 3.1 -> 创建…...
【加餐】使⽤指针实现链表
【加餐】使⽤指针实现链表 面向过程方式和面向对象方式(把面向过程的封装一下就行了)是两种不同的编程方法论...
用 Python 绘制爱心形状的简单教程
1. 引言 在本教程中,我们将学习如何使用 Python 和 Matplotlib 库来绘制一个简单的爱心形状。这是一个有趣且简单的项目,适合初学者练习图形绘制和数据可视化。 2. 环境准备 首先,确保您的系统上安装了 Python 和 Matplotlib 库。如果还未…...
DeepSeek安装
安装运行环境 https://ollama.com/ 安装验证 cmd指令 ollama -v 安装运行模型 https://ollama.com/library/deepseek-r1:14b-qwen-distill-q4_K_M 例如: ollama run deepseek-r1:1.5b-qwen-distill-q4_K_M 结果 再次使用时,直接cmd运行上一步的ru…...
Git--使用教程
Git的框架讲解 Git 是一个分布式版本控制系统,其架构设计旨在高效地管理代码版本,支持分布式协作,并确保数据的完整性和安全性。 Git 的核心组件: 工作区(Working Directory): - 作区是你在本…...
【HTML性能优化】提升网站加载速度:GZIP、懒加载与资源合并
系列文章目录 01-从零开始学 HTML:构建网页的基本框架与技巧 02-HTML常见文本标签解析:从基础到进阶的全面指南 03-HTML从入门到精通:链接与图像标签全解析 04-HTML 列表标签全解析:无序与有序列表的深度应用 05-HTML表格标签全面…...
C#从XmlDocument提取完整字符串
方法1:通过XmlDocument的OuterXml属性,见XmlDocument类 该方法获得的xml字符串是不带格式的,可读性差 方法2:利用XmlWriterSettings控制格式等一系列参数,见XmlWriterSettings类 例子: using System.IO; …...
wordpress每隔24小时 随机推荐一个指定分类下的置顶内容。
在WordPress中实现每隔24小时随机推荐一个指定分类下的置顶内容,可以通过以下步骤实现: 1. 创建自定义函数 在主题的functions.php文件中添加以下代码,用于创建一个定时任务,每隔24小时随机选择一个置顶文章并存储到选项中&…...
《chatwise:DeepSeek的界面部署》
ChatWise:DeepSeek的界面部署 摘要 本文详细描述了DeepSeek公司针对其核心业务系统进行的界面部署工作。从需求分析到技术实现,再到测试与优化,全面阐述了整个部署过程中的关键步骤和解决方案。通过本文,读者可以深入了解DeepSee…...
HTTP请求响应周期步骤
一个典型的 HTTP 请求/响应周期 从建立连接开始,经过客户端向服务器发送请求、服务器处理请求并返回响应,最终关闭连接。这个过程可以分为多个阶段,以下是详细的步骤: 一、建立连接(TCP连接) 客户端发起连接请求:在HTTP通信中,客户端通常是浏览器,首先通过 DNS 查询…...
synchronized, volatile 在 DCL 的作用
背景 最近在看设计模式,在单例模式的 Double Check Lock(DCL)中,存在两个关键字:volatile & synchronized。 之前都知道 DCL 怎么写,直接套娃。但是这两关键字在单例里面的作用还没深究过,…...
Java进阶笔记(中级)
-----接Java进阶笔记(初级)----- 目录 集合多线程 集合 ArrayList 可以通过List来接收ArrayList对象(因为ArrayList实现了List接口) 方法:接口名 柄名 new 实现了接口的类(); PS: List list new ArrayList();遍历…...
人生总有终点,不必好高骛远
夕阳西下,我漫步在河堤上。河水缓缓流淌,倒映着天边最后一抹晚霞。岸边垂柳依依,枝条轻拂水面,荡起一圈圈涟漪。这涟漪由近及远,渐渐消散在暮色中,如同我们每个人在时间长河中泛起的微澜。 记得年少时&…...
C#中堆和栈的区别
C#中的堆(Heap)和栈(Stack)详解 基本概念 栈(Stack) 栈是一个后进先出(LIFO)的内存结构由系统自动分配和释放存储空间连续,大小固定主要用于存储值类型和对象引用 堆…...
如何利用i18n实现国际化
1.首先新建i18.js文件 // i18n配置 import { createI18n } from vue-i18n // import ElementPlus from element-plus import zhCn from element-plus/es/locale/lang/zh-cn import zh from ./zh-cn import en from ./en import ru from ./ru const messages {en_US: {...en,//…...
SpringMVC响应
第一章:数据处理及跳转 1. 结果跳转方式 ①.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . <bean id"templateResolver" class"org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolv…...
深入理解特征值与稳定性密码:以弹簧 - 质量 - 阻尼典型二阶系统为例
从看特征值决定稳定性的原因 摘要 本文以弹簧 - 质量 - 阻尼系统这一典型二阶系统为研究对象,深入剖析特征值决定系统稳定性的内在原因。通过详细的数学推导和直观的物理意义阐释,全面揭示了特征值与系统稳定性之间的紧密关联,为理解和分析…...
python pandas 读取合并单元格并保留合并信息
读取合并单元格并保留合并信息 当我们只是使用 pandas 的 read_excel 方法读取 Excel 文件时,我们可能会遇到一个很棘手的问题:合并单元格的信息将会丢失,从而导致我们的数据出现重复或缺失的情况。 在本篇文章中将介绍使用 pandas 正确地读…...
Go-Gin Web 框架完整教程
1. 环境准备 1.1 Go 环境安装 Go 语言(或称 Golang)是一个开源的编程语言,由 Google 开发。在开始使用 Gin 框架之前,我们需要先安装 Go 环境。 安装步骤: 访问 Go 官网下载页面:https://golang.org/dl…...
机器学习专业毕设选题推荐合集 人工智能
目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...
Java程序员 面试如何介绍项目经验?
项目经历是面试过程中重点问的,但是很多人在回答的时候往往会有问题: 重点是介绍项目,而忽略了个人的经历。 经历是你做了什么、你怎么做的、做完后的结果。例如:项目中的哪些部分是你做的?你是不是核心人员…...
YONBIP后端环境搭建-IDEA
1、IDEA环境搭建 1.1、插件安装 打开设置窗口,添加自定义插件存储库路径。 https://nccdev.yonyou.com/ide/idea/latest/updatePlugin.xml 在 Marketplace 中搜索 YonBuilder Premium开发者工具 ,点击安装。 1.2、Home配置 点击Home配置按钮…...