Linux下进程相关概念详解

目录

一、操作系统

概念

设计操作系统的目的

定位

如何理解“管理”

系统调用和库函数概念

二、进程

概念

描述进程—PCB(process control block)

查看进程

进程状态

进程优先级

 三、其它的进程概念


一、操作系统

概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。简单的理解,操作系统包括:

  • 内核(进程管理、内存管理、文件管理、驱动管理)
  • 其他程序(例如函数库、shell程序等等)

设计操作系统的目的

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

定位

在整个计算机软硬件架构中,操作系统的定位是:一款“搞管理”的软件。

如何理解“管理”

答:先描述,再组织 

先描述:先用结构体确定其属性

再组织:再用链表或者其它高效的数据结构将其关联起来 

层状结构图 

系统调用和库函数概念

  • 在开发角度,操作系统对外会表现一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度,从而形成库(c库、c++库等),有了库,就方便上层用户或者开发者进行二次开发。 

二、进程

在Windows中,我们启动一个软件,本质上是启动了一个进程

而在Linux中,我们运行一条命令或者一个程序,其实就是在系统层面上创建了一个进程

概念

狭义的理解:进程是正在运行的程序的示例

广义的理解:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动

内核的观点:进程是担当分配系统资源的实体

进程 = 对应的代码和数据 + 进程对应的PCB结构体

描述进程—PCB(process control block)

PCB中存放着进程的信息,可以把PCB理解为是进程属性的集合

不同的操作系统对PCB的命名可能不同,在Linux下,PCB是被命名为task_struct的结构体

task_struct是Linux中描述进程的结构体

task_struct是Linux内核的一种数据结构,它会被装载到内存里并且包含着进程的信息

task_struct的内容划分

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

查看进程

进程的信息可以通过/proc系统文件夹查看 

myproc.c 

#include <stdio.h>
#include <unistd.h>
 
int main()
{
   while(1)
   {
     printf("hello world\n");
     sleep(1);
   }                                                                                                                                                                       return 0;
}

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

  •  进程ID(PID)
  • 父进程ID(PPID)

  #include <stdio.h>
  #include <sys/types.h>
  #include <unistd.h>
   
  int main()
  {
    while(1)
    {
      pid_t pid = getpid();//自己进程的pid
      pid_t ppid = getppid();//父进程                                   
      printf("hello world,pid: %d, ppid: %d\n", pid, ppid);
      sleep(1);                                      
    }                                                
    return 0;                                        
  }    

 其中的这个父进程就是bash

进程状态

先来看看Linux内核中关于进程状态的定义

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

关于内核源码可以自行去官网下载

  • R运行状态:并不意味这进程一定在运行中,它表明进程要么在运行中要么在运行队列里
  • S睡眠状态:意味着进程在等待事件完成(这里的睡眠有时候也叫可中断睡眠)
  • D磁盘休眠状态:有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待I/O结束
  • T(t)停止状态:可以通过发送SIGSTOP信号给进程来停止进程。这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
  • X死亡状态(终止状态):这个状态只是一个返回状态,是一瞬间的,你不会在任务列表里看到这个状态

注:当你在查看你的进程状态时后面可能会带一个+号,表明这是一个前台进程

如果要程序在后台运行,可以在运行时加上&,如下

  •  Z僵尸状态:僵尸状态是一个比较特殊的状态。一个子进程已经退出,但是父进程没有读取到子进程退出的返回代码,此时子进程就会变成僵尸状态,这个进程也称为僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态码。

代码演示僵尸状态

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
   pid_t id = fork();

 if(id < 0)
 {
   perror("fork");
   return 1;
 }
 else if(id == 0)
 {
   while(1)
   {
     printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());
     sleep(3);
     break;
   }
   exit(0);
 }
 else 
 {
   while(1)
   {
     printf("I am father, pid:%d, ppid:%d\n", getpid(), getppid());
     sleep(1);
   } 
 }
  return 0;
}

僵尸进程的危害

  1. 造成内存资源的浪费。因为进程退出了,但是还没有被释放,因此这个进程就还需要被维持下去,而维持这个状态本身就是要用数据来维持,也属于进程的基本信息,所以保存在PCB中,Z状态一直不退出,PCB就要一直维护。
  2. 造成内存泄露。因为PCB是个结构体,而结构体是要在内存中开辟空间的。

孤儿进程

父进程先退出,子进程还没退出,这时子进程就称之为“孤儿进程”,孤儿进程会被1号init进程(系统本身)领养,当然也会被init进程回收。

代码演示

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
 
   pid_t id = fork();

 if(id < 0)
 {
   perror("fork");
   return 1;
 }
 else if(id == 0)
 {
   while(1)
   {
     printf("I am child, pid:%d, ppid:%d\n", getpid(), getppid());
     sleep(1);
   }
 }
 else 
 {
   while(1)
   {
     printf("I am father, pid:%d, ppid:%d\n", getpid(), getppid());
     sleep(5);
     break;
   } 
   exit(0);
 }
  return 0;
}

进程优先级

 CPU资源分配的先后顺序,就是指进程的优先级。优先级高的进程有优先执行的权利。

为什么要有优先级?

因为CPU是有限的,而进程太多,需要通过某种方式来竞争资源。

Linux中的优先级的做法是

优先级 = 老的优先级 + nice值

ps -l:查看系统进程 

PRI就是进程的优先级,其值越小进程的优先级别越高

NI就是nice值,其表示进程可被执行的优先级的修正数值

加入nice值之后,此时PRI = PRI(老)+ nice

当nice值为负值时,该程序的优先级值将会变小,即其优先级会变高。因此调整进程优先级在linux下就是调整进程的nice值。

nice的取值范围是-20至19,一共40个级别

更改进程的优先级

  1.  在命令行输入top
  2. 进入top后按“r”
  3. 输入进程的PID
  4. 输入nice值

设置有限的nice值而不直接改PRI的原因是:操作系统设置nice值的本质就是更好的平衡进程对系统资源的占用,如果直接改PRI可能产生一个进程长时间占用系统资源的现象。

三、其它的进程概念

独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。

竞争性:系统进程数目众多,而CPU资源有限,所以进程之间是具有竞争属性的。

并行:多个进程在多个CPU下同时进行运行。

并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进。

上下文数据:一个进程在被运行时,CPU里的寄存器保存的一定是这个进程的临时数据,而这个临时数据就叫做上下文。上下文是绝对不可以被丢去的。在进程时间片到了要被切换时,要连同上下文一起打包带走。上下文可以有多份,分别对应不同的进程


内容如有错误,还望批评指正。如果你觉得内容有用的话,就给博主一键三连吧,你的支持将会是我的动力。 

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

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

相关文章

HPE ProLiant MicroServer Gen8更换坏硬盘(RAID 1+0)

HPE ProLiant MicroServer Gen8今天硬盘告警&#xff0c;坏了一块硬盘&#xff08;估计还是由于上次突然断电导致的&#xff09;&#xff0c;关机&#xff0c;拆下坏硬盘&#xff0c;更换新硬盘&#xff0c;开机后按了一次F1键&#xff0c;系统继续启动并正常使用&#xff0c;同…

VueCli的安装与卸载

文章目录 一.Node安装包的报读网盘提取码二、Vue脚手架Cli三、Vue-CLI使用步骤(自定义安装)1.转换路径并创建项目2.创建步骤的解释(保姆级)3.等待vue项目自己创建好(保姆级) 四、通过npm对vue的安装与卸载 一.Node安装包的报读网盘提取码 下面的链接为地址: Node的百度网盘提取…

面试准备:排序算法大汇总 C++

排序算法总结 直接插入排序 取出未排序部分的第一个元素&#xff0c;与已排序的部分从后往前比较&#xff0c;找到合适的位置。将大于它的已排序的元素向后移动&#xff0c;将该元素插入到合适的位置。 //1. 直接插入排序 void InsertionSort(vector<int>& nums){f…

#WEB前端(HTML属性)

1.实验&#xff1a;a,img 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; a: href插入超链接 默认情况下在本窗口打开链接, target可以设置打开的窗口,parent在父窗口打开&#xff0c;blank新开串口打开,top在顶层串口打开,self为默认在本窗口打开 img: 插入图片 可以插…

走进SQL审计视图——《OceanBase诊断系列》之二

1. 前言 在SQL性能诊断上&#xff0c;OceanBase有一个非常实用的功能 —— SQL审计视图(gv$sql_audit)。在OceanBase 4.0.0及更高版本中&#xff0c;该功能是 gv$ob_sql_audit。它可以使开发和运维人员更方便地排查在OceanBase上运行过的任意一条SQL&#xff0c;无论这些SQL是成…

基于 Amazon EKS 的 Stable Diffusion ComfyUI 部署方案

01 背景介绍 Stable Diffusion 作为当下最流行的开源 AI 图像生成模型在游戏行业有着广泛的应用实践&#xff0c;无论是 ToC 面向玩家的游戏社区场景&#xff0c;还是 ToB 面向游戏工作室的美术制作场景&#xff0c;都可以发挥很大的价值&#xff0c;如何更好地使用 Stable Dif…

Day10:基础入门-HTTP数据包Postman构造请求方法请求头修改状态码判断

目录 数据-方法&头部&状态码 案例-文件探针 案例-登录爆破 工具-Postman自构造使用 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件…

数字图像处理 SUJOY滤波器:用于图像边缘检测的通用一阶导数滤波器

1、前言 因为是比较旧的论文,但是据论文作者说SUJOY滤波器为图像边缘检测提供了比其他常用的一阶导数方法(如 Robert 算子、Prewitt 算子、Sobel 算子等)更好的方法。 经过测试感觉并没有作者说的那么好,很水的东西,另外图像领域的事情很少有绝对的,通常都是某些方法适合…

【二分】第k个缺失的数

第K个缺失的数 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/kth-missing-positive-number/ 题目 题解 二段…

医学大数据|文献阅读|有关“胃癌+机器学习”的研究记录

目录 1.基于32基因特征构建的机器学习模型可有效预测胃癌患者的预后和治疗反应 2.胃癌患者术后90天死亡率的机器学习风险预测模型 3.使用机器学习模型预测幽门螺杆菌根除患者胃癌患病风险 4.利用初始内窥镜检查和组织学结果进行个性化胃癌发病率预测 1.基于32基因特征构建的…

ABAP - SALV教程07 斑马纹显示和SALV标题

SALV设置斑马纹和标题 METHOD set_layout.DATA: lo_display TYPE REF TO cl_salv_display_settings. * 取得显示对象lo_display co_alv->get_display_settings( ).* 设置ZEBRA显示lo_display->set_striped_pattern( X ). * 设置Titlelo_display->set_list_he…

探讨倒排索引Elasticsearch面试与实战:从理论到实践

在当前大数据时代&#xff0c;Elasticsearch&#xff08;以下简称为ES&#xff09;作为一种强大的搜索和分析引擎&#xff0c;受到了越来越多企业的青睐。因此&#xff0c;对于工程师来说&#xff0c;掌握ES的面试准备和实战经验成为了必备技能之一。本文将从ES的面试准备和实际…

【MCAL】TC397+EB-tresos之CAN配置实战 - (CAN/CANFD)

本篇文章介绍了在TC397平台使用EB-tresos对CAN驱动模块进行配置的实战过程,不仅介绍了标准CAN的发送与接收&#xff0c;还介绍了CANFD的实现与调试以及扩展帧的使用。M_CAN是德国博世公司开发的IP&#xff0c;因为英飞凌的芯片完整的集成了这个IP&#xff0c;所以整体的配置都比…

leetcode 热题 100_三数之和

题解一&#xff1a; 双指针遍历&#xff1a;暴力解法的三层遍历会超时&#xff0c;因此需要优化遍历的过程。首先是需要对结果进行去重&#xff0c;这里采用排序跳过重复值的做法&#xff0c;在指针遍历时跳过已经遍历过的相同值。在第一层循环确定第一个值后&#xff0c;剩下两…

【RT-Thread基础教程】邮箱的使用

文章目录 前言一、邮箱的特性二、邮箱操作函数2.1 创建邮箱创建动态邮箱创建静态邮箱 2.2 删除邮箱2.3 发邮件2.4 取邮件 三、示例代码总结 前言 RT-Thread是一个开源的实时嵌入式操作系统&#xff0c;广泛应用于各种嵌入式系统和物联网设备。在RT-Thread中&#xff0c;邮箱是…

阶跃信号与冲击信号

奇异信号&#xff1a;信号与系统分析中&#xff0c;经常遇到函数本身有不连续点&#xff08;跳变电&#xff09;或其导函数与积分有不连续点的情况&#xff0c;这类函数称为奇异函数或奇异信号&#xff0c;也称之为突变信号。以下为一些常见奇异函数。 奇异信号 单位斜变信号 …

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

xxl-job--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.xxl-job1. 1 发展历史1.2 XXL-JOB的系统架构1.3 xxl-job与其他框架对比 2. XXL-JOB的使用2.1 准备工作- 配置调度中心XXL-JOB的数据表 2.2 配置执行器1 引入依赖包…

一个脚本两步计算材料Raman谱(附数据处理和绘图脚本)

在以往推送中已经介绍了相当多的计算材料Raman的方法&#xff0c;使用的软件主要为Phonopy-Spectroscopy&#xff0c;相关软件还有vasp&#xff0c;phonopy&#xff0c;phono3py等。 Phonopy-Spectroscopy计算材料红外和Raman光谱 Phonopy-Spectroscopy 计算红外和拉曼光谱 也…

Github配置SSH免密认证

以Ubuntu Server为例 生成SSH ssh-keygen -t ed25519 -C "your_emailexample.com" 如果系统不支持Ed25519算法&#xff0c;使用旧的命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 根据提示生成公私钥文件&#xff0c;记下位置…