Linux——进程概念详解

一、进程的基本概念

在给进程下定义之前,我们先了解一下进程:

我们在编写完代码并运行起来时,在我们的磁盘中会形成一个可执行文件,当我们双击这个可执行文件时(程序时),这个程序会加载到内存中,而这个时候我们不能把它叫做程序了,应该叫做进程。所以说,只要把程序(运行起来)加载到内存中,就称之为进程。

进程的概念:程序的一个执行实例,正在执行的程序等

二、进程描述—PCB

PCB:进程控制块(结构体)
当一个程序加载到内存中,操作系统要为刚刚加载到内存的程序创建一个结构体(PCB),进程信息被放在这个结构体中(PCB),可以理解为PCB是进程的属性的集合。

在Linux操作系统下的PCB是:task_struct
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
在进程执行时,任意时间内,进程对应的PCB都要以下内容:

  • 标示符:描述本进程的唯一标示符,用来区别其他进程
  • 状态:任务状态
  • 优先级:相对于其他进程的优先级
  • 程序计数器:程序中即将被执行的下一条指令的地址
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块指针
  • 上下文数据:进程执行时处理器的寄存器中的数据
  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等
  • 其他信息:…

优先级的理解:
由于CPU只要一个,进程可以有多个,所以CPU的资源有限,操作系统在调度进程到CPU时会根据进程的优先级来判断。
程序计数器的理解:
CPU跑一个进程时,要执行它的代码,而代码是自上往下执行的(if、else、循环等除外),CPU先要取指令,然后分析指令,再然后执行指令。取完一个指令后,CPU中的寄存器(EIP指令寄存器)会保存当前指令的下一条指令的地址,方便下次取下一个指令。
所谓的函数跳转、分支判断、循环等,都是修改EIP完成的。
上下文数据的理解:
CPU在跑一个进程时,没有跑完就开始切换其他进程,为了下次继续跑完这个进程,会保留这个进程的上下文数据,当这个进程回来时,会把上下文数据移动到CPU内部继续执行。

三、通过系统调用获取进程标示符

#include<stdio.h>
#include<unistd.h>
int main()
{
   while(1)
   {
     printf("i am process...pid:%d,ppid:%d\n",getpid(),getppid());
     sleep(1);
   }
return 0;
 }           

通过ps aux | grep 文件名来找
其中getpid()是找进程的标示符,getppid()找父进程的标示符

四、通过系统调用创建进程——fork

fork函数可以创建一个子进程

#include<stdio.h>
#include<unistd.h>
int main()
{
  pid_t id=fork();//创建子进程
  while(1)
  {
    if(id==0)
    {
   		printf("i am process...child---pid:%d,ppid:%d\n",getpid(),getppid());
    	sleep(1);
    }
    else if(id>0)
    {
	     printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid());
	    sleep(1);
    }
    else{
    	;
    }
  }
 return 0;                                                                                  
}

我们可以得出:这段代码有两个进程,并且它们的关系是父子关系。

什么是fork函数:在调用fork函数之前,只有一个进程(父进程),当这个进程调用fork函数之后,fork函数会复制一个进程(子进程),区别是PID不同,它们的关系是父子关系。

fork函数会返回两次值:
——给父进程返回子进程的pid。
——给子进程返回0。
——失败时,在父进程中返回-1,不创建子进程,并且errno被适当地设置。

五、进程的状态

操作系统存在着五种状态模型:

  • 新建态:刚刚创建的进程,操作系统还没有把它加入可执行进程组中。
  • 就绪态:进程已经做好准备,只有有机会就会开始执行。
  • 运行态:该进程正在执行。
  • 阻塞态:进程在某些事件发生前不能执行,如I/O操作完成。
  • 退出态:操作系统从可执行进程组中释放出进程,或者自身停止,或者是因为某些原因被取消。

R 可执行状态

通过命令 ps aux 可以查看进程的状态

【注意】此可执行状态并非上面的运行态。
进程中的R状态不代表正在运行,代表的可被调度,此运行相当于上面的就绪态。

操作系统会把进程中R状态的进程全放在调度队列中,方便调度。

S 睡眠状态

(1)创建一个可执行态

#include<stdio.h>
#include<unistd.h>
int main() 
{
    while(1);
	return 0;
}

(2)创建休眠态进程

#include<stdio.h>
#include<unistd.h>
int main() 
{
    while(1)
    sleep(10);
	return 0;
}

S状态是浅度睡眠,随时可以被唤醒,也可以被杀掉。

D 磁盘休眠状态

可以表示为深度睡眠,该进程不会被杀掉,即使你是操作系统,除非我自动唤醒,才可以恢复。

这种状态(D)的进程杀不死。

T 暂停状态

向进程发送SIGSTOP信号,该进程会响应该信号进入暂停状态,
向该进程发送SIGCONT信号,该进程会从暂停状态恢复到可执行状态。

X 死亡状态 & Z 僵尸状态

僵尸状态:一个处于僵尸状态的进程,会等待它的父进程或操作系统对它的信息进行读取,之后才会被释放。

通过代码来模拟僵尸状态的进程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
    pid_t id=fork();
   	int count=5;
   	while(1)
  	{
     	if(id==0)
    	{
       		while(count){
     		printf("i am process..child---.pid:%d,ppid:%d\n,count: %d",getpid(),getppi    d(),--count);
    		sleep(1);
   			}
     		 printf("child quit....\n");
    		 exit(1);
   		}
    	else if(id>0)
     	{
     		printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid());
     		sleep(1);
   		}
  	}
 	return 0;
 }

 while :; do ps aux |head -1&&ps aux|grep a.out; echo "#######################";sleep 1;done 来监控进程的状态。

死亡状态:进程被操作系统释放了或者自己退出了

六、僵尸进程

当一个进程变为僵尸状态的时候,该进程就变成了僵尸进程。

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

僵尸进程的危害

七、孤儿进程

在Linux中,进程的关系主要是父子关系。

一对父子进程中的父进程退出了,子进程还在运行,就会形成孤儿进程。
如果没有进程来回收该子进程的信息,那么会变成僵尸状态,会存在内存泄漏的问题。

为了解决这个问题,该子进程会立即被1号init进程领养。

通过代码来模拟孤儿状态的进程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
    pid_t id=fork();
   	int count=5;
   	while(1)
  	{
     	if(id==0)
    	{
       		while(1){
     		printf("i am process..child---.pid:%d,ppid:%d\n,count: %d",getpid(),getppid(),--count);
    		sleep(1);
   			}
     		printf("child quit....\n");
    		exit(1);
   		}
    	else if(id>0)
     	{
            while(count)
            {
     	        printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid()); 
     		    count--;
                sleep(1);
            }
            exit(0);
   		}
  	}
 	return 0;
 }

用 while :; do ps axj |head -1 && ps axj | grep a.out;echo "#######################";sleep 1;done 来监控进程的状态。

观察子进程的PPID

通过查看该子进程的信息,可以得知该进程被1号init进程领养。

八、进程优先级

基本概念

CPU中的资源是有限的,不可能多个进程一起在CPU上运行,利用优先级把进程有效的先后排好,改善了系统的性能。

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)
  • 优先权高的有优先执行权。

查看进程优先级

用 ps -l 可以查看到进程的优先级

PRI:表示这个进程被执行的优先级,其值越小越早执行
NI:表示这个进程的nice值

PIR and NI

nice值表示进程可被执行的优先级的修正值。
PIR=PIR(old)+nice。
当nice为负值时,那么该进程的优先级值会变小,优先级会变高,进程越快被执行。

当然,nice也是有范围的,-20~19,一共40个级别。

用top命令更改已存在的进程的nice

top命令

接着按r然后输入进程的PID输入nice

其他

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【系统架构设计】数据库系统(一)

数据库系统&#xff08;一&#xff09; 数据库模式与范式数据库的结构与模式数据模型关系代数数据的规范化反规范化 数据库设计事务管理备份与恢复分布式数据库系统数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库的结构与模式 数据库技术中采用分级的方法将数据库的结…

Linux - 冯-诺依曼体系结构、初始操作系统

目录 冯•诺依曼体系 结构推导 内存提高效率的方法 数据的流动过程 体系结构相关知识 初始操作系统 定位 设计目的 操作系统之上之下分别有什么 管理精髓&#xff1a;先描述&#xff0c;再组织 冯•诺依曼体系 结构推导 计算机基本工作流程图大致如下&#xff1a; 输入设备&a…

vscode 打开远程bug vscode Failed to parse remote port from server output

vscode 打开远程bug vscode Failed to parse remote port from server output 原因如图&#xff1a; 解决&#xff1a;

【数学建模】技术革新——Lingo的使用超详解

目录 基础知识 1. 变量声明 示例 2. 常量声明 语法格式 示例 3. 目标函数 语法格式 示例 4. 约束条件 语法格式 示例 5. 完整的Lingo模型示例 示例 解释 6. 整数变量声明 语法格式 示例 7. 非线性规划 示例 8. 多目标优化 语法格式 示例 9. 数据输入与…

TypeScript 函数类型 (二)

函数类型 函数有两种方式定义 function 关键字来定义函数 function a(){}表达式定义&#xff08;箭头函数的形式&#xff09; const a()>{}函数需要定义类型的有三个地方 入参 和 返回值 以及 函数本身 的类型, 函数本身的类型常用于表达式定义的函数 function sum(a:stri…

洛谷 P1056 [NOIP2008 普及组 T2]:排座椅 ← 贪心算法

【题目来源】https://www.luogu.com.cn/problem/P1056https://www.acwing.com/problem/content/436/【题目描述】 上课的时候总有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。 不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c…

Ubuntu Desktop Docker 配置代理

Ubuntu Desktop Docker 配置代理 主要解决 docker pull 拉取不了镜像问题. Docker Desktop 配置代理 这个比较简单, 直接在 Docker Desktop 里设置 Proxies, 示例如下: http://127.0.0.1:7890 Docker Engine 配置代理 1.Docker Engine 使用下面配置文件即可, root 用户可…

Git的基础操作

环境&#xff1a;Linux操作系统-Centos 创建本地仓库 首先创建一个目录,命名为:gitcode mkdir gitcode进入gitcode目录&#xff0c;创建本地仓库 git init此时&#xff0c;就会创建出了一个空的仓库在当前目录下了&#xff0c;此时目录下就有git的目录了 配置Git 首先重要的…

科技出海|百分点科技智慧政务解决方案亮相非洲展会

近日&#xff0c;华为非洲全联接大会在南非约翰内斯堡举办&#xff0c;吸引政府官员行业专家、思想领袖、生态伙伴等2,000多人参会&#xff0c;百分点科技作为华为云生态合作伙伴&#xff0c;重点展示了智慧政务解决方案&#xff0c;发表《Enable a Smarter Government with Da…

which 命令在Linux中是一个快速查找可执行文件位置的工具

文章目录 0、概念1、which --help2、which命令解释 0、概念 which命令用于查找命令的可执行文件的路径which 命令在 Linux 中用于查找可执行命令的完整路径。当你在 shell 中输入一个命令时&#xff0c;shell 会在环境变量 $PATH 定义的目录列表中查找这个命令。which 命令可以…

【Neural signal processing and analysis zero to hero】- 1

The basics of neural signal processing course from youtube: 传送地址 Possible preprocessing steps Signal artifacts (not) to worry about doing visual based artifact rejection so that means that before you start analyzing, you can identify those data epic…

SQL Server Query Store Settings (查询存储设置)

参考&#xff1a;Query Store Settings - Erin Stellato 在 SQL Server 2017 中&#xff0c;有九 (9) 个设置与查询存储相关。虽然这些设置记录在sys.database_query_store_options中&#xff0c;但我经常被问到每个设置的值“应该”是多少。我在下面列出了每个设置&am…

[Vulnhub] devt-improved slog_users+vim权限提升+nano权限提升+passwd权限提升+Lxc逃逸权限提升

信息收集 IP AddressOpening Ports192.168.101.149TCP:22,113,139,445,8080 $ nmap -p- 192.168.101.149 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | …

【GPT4充值】WildCard虚拟卡

绑定流程 官网&#xff1a;WildCard | 一分钟注册&#xff0c;轻松订阅海外软件服务 1、使用手机号验证码注册、可以使用zfb快捷认证 2、填写身份信息后&#xff0c;然后根据流程验证即可。 3、选择卡片使用期限&#xff0c;填入邀请码【PEACEFUL】可立减$2。 4、打开openAI开发…

leetcode热题100.分割等和子集(动态规划)

分割等和子集 Problem: 416. 分割等和子集 思路 我选择使用动态规划的方法来解题。我们需要判断是否可以将数组分割成两个子集&#xff0c;使得这两个子集的和相等。这个问题可以转化为在数组中找到一个子集&#xff0c;使得其和等于数组总和的一半。 解题过程 首先&#xf…

卷积神经网络-猫狗识别实战

课程来自bilibiliMomodel平台 全长只有两个小时&#xff0c;理论部分讲得很粗糙 1 人的视觉和计算机视觉 人的大脑&#xff1a;神经元细胞&#xff0c;轴突发送信号&#xff0c;树突接收信号&#xff0c;互相连接&#xff0c;连接的强度和状态会随着新的经历刺激而变化。 用…

GitHub+Picgo图片上传

Picgo下载&#xff0c;修改安装路径&#xff0c;其他一路下一步&#xff01; 地址 注册GitHub&#xff0c;注册过程不详细展开&#xff0c;不会的百度一下 地址 新建GitHub仓库存放图片 ——————————————————————————————————————————…

【贪心算法】贪心算法30题

一、贪心算法简介 证明贪心策略正确性的常用方法&#xff1a;直接证明、交换论证法、反证法、分类讨论… 二、相关编程题 2.1 柠檬水找零 题目链接 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 题目描述 算法原理 提示&#xff1a;最优解和贪心解唯一可能不同…

Java IO流(详解)

目录 1.概述 2.File文件类 2.1 文件的创建操作 2.2 文件的查找操作 3. File里面一些其他方法 3.1 经典案例 4. IO流 4.1 概念 4.2 IO分类 4.3 字节输出流 4.4 字节输入流 4.5 案例 4.6 字符输出流 4.7 字符输入流 4.8 案例 4.9 处理流--缓冲流 4.10 对象流: 1.…

IP地址定位与智慧城市和智能交通

智慧城市和智能交通是现代城市发展的关键领域&#xff0c;通过先进技术提升城市管理和居民生活质量。IP地址定位在交通监控、智能路灯管理等方面发挥了重要作用&#xff0c;本文将深入探讨其技术实现及应用。 交通监控与优化 通过IP地址连接交通传感器和摄像头&#xff0c;可…