【Linux】进程概念

在我们讲解进程之前,首先对操作系统做一个解释,操作系统是用来管理软硬件资源的,可以为应用程序提供一个良好的执行环境。在整个计算机中,操作系统的定位就相当于管理者。
我们如何理解管理这个词呢,很简单,就是先描述(利用结构体)被管理的对象,然后将被管理的对象组织起来(利用像链表等高效的数据结构),总结一下就是:先描述,后组织。

进程

进程是程序的一个执行实例,是占用资源的基本单位。
进程的所有信息通过一种数据结构PCB(进程控制块)描述,Linux下PCB叫做task_struct。
所有运行的进程的PCB都会以链表的数据结构组织起来。

task_struct结构体所包含的内容:
1. 标识符:进程ID,唯一标识这个进程。
2. 状态:进程状态,退出状态码,退出信号等。
3. 优先级:相对于其他进程的优先级。
4. 程序计数器:程序中即将被执行的下一条指令的地址。
5. 上下文数据。
6. 其他信息。

查看进程的命令:
ps -ef 显示所有进程信息
ps -aux 显示进程信息
ps -l 显示更多的信息,优先级等等。

进程状态:
1. R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
2. S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)。
3. D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
4. T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
5. X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

僵尸进程

僵尸状态(Z)是一个比较特殊的进程状态。当子进程退出,但是父进程没有读取到子进程的退出的返回代码时,子进程变成僵尸进程。僵尸进程会以终止状态保持的进程表中,并一直等待父进程读取它的进程退出代码。所以只要子进程退出,父进程还在运行,但没有读取到子进程退出状态,则子进程进入僵尸状态。

下面代码创建了一个维持三十秒的僵尸进程:

#include <stdio.h>
#include <stdlib.h>
int main()
{
 pid_t id = fork();
 if(id < 0){
 perror("fork");
 return 1;
 }
 else if(id > 0){ //parent
 printf("parent[%d] is sleeping...\n", getpid());
 sleep(30);
 }else{
 printf("child[%d] is begin Z...\n", getpid());
 sleep(5);
 exit(EXIT_SUCCESS);
 }
 return 0;
}

当执行这段代码,然后用 ps -aux 命令查看该进程会发现已经成为僵尸进程(Z)。

僵尸进程的危害:

当一个进程变为僵尸进程时,因为该进程一直在等待其父进程读取它的退出状态,所以僵尸进程一直维持着退出状态,这也属于进程的信息,会保留在PCB中。也就是说,僵尸进程一直存在,其PCB也就一直存在着。这样就会操作资源浪费,产生内存泄漏问题。

孤儿进程

孤儿进程是指父进程先于子进程退出了,这个子进程就变成孤儿进程,孤儿进程会被1号init进程“领养”,由该init进程来回收释放孤儿进程所占的资源。
这也是一种解决僵尸进程的方法,那就是将僵尸进程的父进程退出(kill -9),那么僵尸进程编程孤儿进程,由1号init进程回收释放资源。

下面代码创建了一个孤儿进程:
 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
 pid_t id = fork();
 if(id < 0){
 perror("fork");
 return 1;
 }
 else if(id == 0){//child
 printf("I am child, pid : %d\n", getpid());
 sleep(10);
 }else{//parent
 printf("I am parent, pid: %d\n", getpid());
 sleep(3);
 exit(0);
 }
 return 0;
}

进程优先级

cpu资源分配的先后顺序,就是指进程的优先级(priority)。
在Linux操作系统中,可以使用命令 ps -l来查看进程的信息包括优先级相关信息。

我们可以看到有PRI和NI两个选项
PRI表示进程可被执行的优先级,值越小优先级越高。
NI表示进程的nice值,取值范围是 -20~19。nice值不是进程的优先级,但是可以影响进程的优先级。

PRI(new)=PRI(old)+nice。

修改进程优先级:通过修改nice值来实现

进程的特点:

1. 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
2. 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
3. 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。
4. 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。可以被子进程继承下去。

环境变量组织方式

每个进程都有一张环境表,环境表是一个字符指针数组,每个指针指向一个以\0结尾的环境字符串。

通过代码获取环境变量
1. mian函数第三个参数。

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
 int i = 0;
 for(; env[i]; i++){
 printf("%s\n", env[i]);
 }
 return 0;
}

2. 通过第三方变量environ获取
 

#include <stdio.h>
int main(int argc, char *argv[])
{
 extern char **environ;
 int i = 0;
 for(; environ[i]; i++){
 printf("%s\n", environ[i]);
 }
 return 0;
}

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

通过命令或者系统调用获取或设置环境变量

getenv():获取指定的环境变量
 

#include <stdio.h>
#include <stdlib.h>
int main()
{
 printf("%s\n", getenv("PATH"));
 return 0;
}

在Linux下运行:

一、 内容概要 本资源提供了一个完整的“金属板材压弯成型”非线性仿真案例,基于ABAQUS/Explicit或Standard求解器完成。案例精确模拟了模具(凸模、凹模)与金属板材之间的接触、压合过程,直至板材发生塑性弯曲成型。 模型特点:包含完整的模具-工件装配体,定义了刚体约束、通用接触(或面面接触)及摩擦系数。 材料定义:金属板材采用弹塑性材料模型,定义了完整的屈服强度、塑性应变等真实应力-应变数据。 关键结果:提供了成型过程中的板材应力(Mises应力)、塑性应变(PE)、厚度变化​ 云图,以及模具受力(接触力)曲线,完整再现了压弯工艺的力学状态。 二、 适用人群 CAE工程师/工艺工程师:从事钣金冲压、模具设计、金属成型工艺分析与优化的专业人员。 高校师生:学习ABAQUS非线性分析、金属塑性成形理论,或从事相关课题研究的硕士/博士生。 结构设计工程师:需要评估钣金件可制造性(DFM)或预测成型回弹的设计人员。 三、 使用场景及目标 学习目标: 掌握在ABAQUS中设置金属塑性成形仿真的全流程,包括材料定义、复杂接触设置、边界条件与载荷步。 学习如何调试和分析大变形、非线性接触问题的收敛性技巧。 理解如何通过仿真预测成型缺陷(如减薄、破裂、回弹),并与理论或实验进行对比验证。 应用价值:本案例的建模方法与分析思路可直接应用于汽车覆盖件、电器外壳、结构件等钣金产品的冲压工艺开发与模具设计优化,减少试模成本。 四、 其他说明 资源包内包含参数化的INP文件、CAE模型文件、材料数据参考及一份简要的操作要点说明文档。INP文件便于用户直接修改关键参数(如压边力、摩擦系数、行程)进行自主研究。 建议使用ABAQUS 2022或更高版本打开。显式动力学分析(如用Explicit)对计算资源有一定要求。 本案例为教学与工程参考目的提供,用户可基于此框架进行拓展,应用于V型弯曲
### Linux 进程基本概念详解 Linux 系统中的进程操作系统进行资源分配和调度的基本单位,每个运行中的程序都对应一个进程进程的管理与调度是操作系统的核心功能之一[^1]。以下将从多个方面对 Linux 进程的基本概念进行详细说明。 #### 1. 进程的状态 在 Linux 系统中,进程具有多种状态,这些状态反映了进程当前的行为和生命周期。通常,Linux 中的进程有以下几个主要状态: - **创建状态**:当一个新的进程被创建时,它处于此状态。 - **就绪状态**:进程已经准备好运行,等待 CPU 资源分配。 - **执行状态**:进程正在 CPU 上运行。 - **阻塞状态(等待状态)**:进程因等待某些事件(如 I/O 操作完成)而暂停运行。 - **终止状态**:进程已完成或被终止。 此外,Linux 特有的状态还包括: - **D状态(不可中断的睡眠状态)**:这是一种深度睡眠状态,通常发生在进程与硬件交互时,例如等待慢速设备完成操作。该状态下的进程无法被信号唤醒或终止,只能通过等待其完成或重启系统来解决[^2]。 - **Z状态(僵尸状态)**:当子进程退出后,父进程尚未回收其退出状态时,子进程会进入僵尸状态。这种状态的进程仅保留在进程表中,不占用任何实际资源[^5]。 #### 2. 进程控制块(PCB) 每个进程都有一个对应的进程控制块(Process Control Block, PCB),它是操作系统用来描述和管理进程的数据结构。PCB 包含了进程的所有信息,包括但不限于: - 进程标识符(PID) - 内存管理信息 - CPU 寄存器状态 - 文件描述符表 - 其他资源使用情况 PCB 是操作系统管理和调度进程的基础,通过它,操作系统可以跟踪和控制每个进程的运行状态[^4]。 #### 3. 进程的优先级与竞争性 由于系统中可能存在大量的进程,而 CPU 的资源有限,因此进程之间存在竞争关系。为了更高效地完成任务,操作系统引入了进程优先级的概念进程优先级决定了进程在 CPU 调度中的顺序,高优先级的进程通常会优先获得 CPU 资源。可以通过 `nice` 命令调整进程的优先级[^3]。 #### 4. 进程的并行与并发 - **并行**:在多核或多 CPU 系统中,多个进程可以同时运行,这称为并行。 - **并发**:在单核 CPU 系统中,操作系统通过时间片轮转等调度策略,在一段时间内让多个进程轮流运行,从而实现并发的效果[^3]。 #### 5. 创建子进程Linux 系统中,可以通过 `fork()` 系统调用创建子进程。`fork()` 函数会复制当前进程的所有资源,并生成一个几乎完全相同的子进程。子进程拥有独立的地址空间和资源,但继承了父进程的部分属性,例如文件描述符和环境变量[^4]。 ```python import os pid = os.fork() if pid == 0: # 子进程代码 print("子进程 PID:", os.getpid()) else: # 父进程代码 print("父进程 PID:", os.getpid(), "子进程 PID:", pid) ``` #### 6. 查看进程 Linux 提供了多种工具用于查看和管理进程,例如: - `ps` 命令:显示当前系统的进程状态。 - `top` 命令:实时监控系统中各个进程的资源使用情况。 - `kill` 命令:向指定进程发送信号以终止或控制其行为。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值