Linux下进程相关概念详解

news2024/9/30 7:17:22

目录

一、操作系统

概念

设计操作系统的目的

定位

如何理解“管理”

系统调用和库函数概念

二、进程

概念

描述进程—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里的寄存器保存的一定是这个进程的临时数据,而这个临时数据就叫做上下文。上下文是绝对不可以被丢去的。在进程时间片到了要被切换时,要连同上下文一起打包带走。上下文可以有多份,分别对应不同的进程


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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

产品营销展示型wordpress外贸网站模板

工艺品wordpress外贸主题 简约大气的wordpress外贸主题&#xff0c;适合做工艺品进出品外贸的公司官网使用。 https://www.jianzhanpress.com/?p5377 餐饮设备wordpress外贸主题 简洁的wordpress外贸主题&#xff0c;适合食品机械、餐饮设备公司使用。 https://www.jianzh…

如何使用Docker搭建StackEdit编辑器并结合内网穿透实现远程办公

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

oms-Diffusion:用户可上传服装图片与参考姿势图进行试穿,解决服装行业高昂成本问题

之前已经向大家介绍了很多关于虚拟试穿的项目&#xff0c;如谷歌的Tryon Diffusion, 阿里的Outfit Anyone, 亚马的Diffuse to Choose。东京大学的OOTDiffusion虚拟服装试穿工具。基于扩散模型的技术基本已经成为现在主流应用的基石。感兴趣的小伙伴可以点点击下面链接阅读~ 电商…

GEE入门篇|图像处理(一):理论介绍

光谱指数是基于地球表面不同的物体和土地覆盖反射不同波长的不同数量的太阳光的事实。例如&#xff0c;在光谱的可见部分&#xff0c;健康的绿色植物反射大量的绿光&#xff0c;同时吸收蓝光和红光——这就是为什么它在我们的眼中是绿色的。来自太阳的光的波长也超出了人眼所能…

前端面试练习24.3.2-3.3

HTMLCSS部分 一.说一说HTML的语义化 在我看来&#xff0c;它的语义化其实是为了便于机器来看的&#xff0c;当然&#xff0c;程序员在使用语义化标签时也可以使得代码更加易读&#xff0c;对于用户来说&#xff0c;这样有利于构建良好的网页结构&#xff0c;可以在优化用户体…

Vue开发实例(四)Element-UI部分组件使用方法

Element-UI的使用 一、Icon图标的使用1、用 i 标签使用图标 二、用 el-button 使用图标1、使用type定义样式2、使用plain定义样式3、使用round定义样式4、使用circle定义样式5、带图标和文字的按钮6、按钮禁用7、文字按钮8、按钮组9、加载中 三、Link 文字链接1、基础用法2、禁…

LaTeX-设置表格大小

文章目录 LaTeX-设置表格大小1.创建表格2.设置表格的宽度2.1控制表格每一列的宽度2.2控制整个表格的宽度 3.设置表格的外观4.LaTeX绘制三线表 LaTeX-设置表格大小 本文介绍了LaTeX如何设置表格的大小、改变表格的外观以及如何绘制三线表。 1.创建表格 在LaTeX中创建表很耗时…

Springboot+vue的高校教师教研信息填报系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的高校教师教研信息填报系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&am…

Hololens 2应用开发系列(1)——使用MRTK在Unity中设置混合现实场景并进行程序模拟

Hololens 2应用开发系列&#xff08;1&#xff09;——使用MRTK在Unity中进行程序模拟 一、前言二、创建和设置MR场景三、MRTK输入模拟的开启 一、前言 在前面的文章中&#xff0c;我介绍了Hololens 2开发环境搭建和项目生成部署等相关内容&#xff0c;使我们能生成一个简单Ho…

100个百万阅读公众号爆文案例

100个100万公众号爆文案例 自从公众号流量推送修改之后&#xff0c;原来的私域玩法一去不复返&#xff0c;公域公众号正在崛起 现在公众号的玩法就是找爆款&#xff0c;去对标&#xff0c;去学习&#xff0c;努力使自己的公众号进入流量池&#xff0c;然后吃流量主的收益 这里…

【数据结构和算法】根据前序、中序、后序来确定一颗二叉树

目录 0 引言1 确定二叉树结构的方式1.1 前序和中序1.2 后序和中序1.3 前序和后序&#xff1a;无法确定结构 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;计算机四大基础专栏&#x1f4dc; 其他章节&#xff1a;网络快速入门系列、计网概述、计网…

Redis-基础篇

Redis是一个开源、高性能、内存键值存储数据库&#xff0c;由 Salvatore Sanfilippo&#xff08;网名antirez&#xff09;创建&#xff0c;并在BSD许可下发布。它不仅可以用作缓存系统来加速数据访问&#xff0c;还可以作为持久化的主数据存储系统或消息中间件使用。Redis因其数…

从下一代车规MCU厘清存储器的发展(2)

目录 1.概述 2.MCU大厂的选择 2.1 瑞萨自研STT-MRAM 2.2 ST专注PCM 2.3 英飞凌和台积电联手RRAM 2.4 NXP如何计划eNVM 3.小结 1.概述 上篇文章&#xff0c;我们简述了当前主流的存储器技术&#xff0c;现在我们来讲讲各大MCU大厂的技术选择 2.MCU大厂的选择 瑞萨日…

vue2结合electron开发桌面端应用

一、Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 。允许您保持一个 JavaScript 代码代码库并创建可在Windows、macOS和Linux上运行的跨平台应用 。 Electron 经常与 Ch…

文献阅读笔记《Spatial-temporal Forecasting for Regions without Observations》13页

目录 目录 目录 发行刊物 ABSTRACT 1 INTRODUCTION 2 RELATED WORK&#xff08;相关工作 2.1 Spatial-temporal Forecasting&#xff08;时空预测 2.2 Spatial-temporal Forecasting withIncomplete Data&#xff08;不完全数据的时空预测 2.3 Graph Contrastive Lear…

什么是Vue指令?请列举一些常见的Vue指令以及它们的用法

Vue.js 是一款流行的前端框架&#xff0c;它的指令&#xff08;Directives&#xff09;是 Vue.js 提供的一种特殊属性&#xff0c;用于在模板中对 DOM 元素进行直接操作。指令通常是以 v- 开头的特殊属性&#xff0c;用于响应式地将数据绑定到 DOM 元素上。 在 Vue 中&#xf…

VS Code(Visual Studio Code)本地(local)和远程(ssh)Docker Container 下的 Python 开发和调试

VS Code&#xff08;Visual Studio Code&#xff09;本地&#xff08;local&#xff09;和远程&#xff08;ssh&#xff09;Docker Container 下的 Python 开发和调试 1. 目的需求2. VS Code 简介3. 使用实践&#xff1a;一个简单的实例3.1 准备工作3.1.1 远程服务器3.1.2 本地…

测试面试精选题:可用性测试主要测试哪些方面,举例说明

1.界面设计&#xff1a; 评估软件的用户界面设计是否直观、美观、易于理解和操作。 测试用例&#xff1a;打开软件&#xff0c;查看界面布局是否合理&#xff0c;各个功能是否容易找到&#xff0c;是否符合用户习惯。 2.导航和布局&#xff1a; 评估用户在软件中导航和查找…

点云数据结构化与体素化理论学习

一、PCD点云数据存储格式的进一步认识 &#xff08;一&#xff09;PCD点云存储格式相较于其它存储格式&#xff08;如PLY、STL、OBJ、X3D等&#xff09;的优势[1] &#xff08;1&#xff09;具有存储和处理有组织的点云数据集的能力&#xff0c;这对于实时应用和增强现实及机器…

【C++】string 类 ( 上)

标准库中的string类 注意&#xff1a; 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作string的常规操作。 比特就业课 3. string在底层实际是&#xff1a;basic_string模板类的别名&#xff0c;typedef basi…