Linux进程总结详解(上——初识)

news2025/7/8 3:38:25

Linux进程


文章目录

  • Linux进程
  • 前言——先从硬件和软件谈起
    • 一、冯诺依曼体系结构
    • 二、操作系统
      • 概念
  • 一、进程介绍
    • 概念
    • 进程控制块
    • 查看进程
    • 通过系统创建进程
  • 二、进程状态
    • 1.内核代码如下:
  • 总结


前言——先从硬件和软件谈起

一、冯诺依曼体系结构

  1. 定义:数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构,如图:

在这里插入图片描述

输入设备:键盘、鼠标、网卡、显卡等等
输出设备:显示器,打印机等等
中央处理器(CPU):运算器和控制器等

需要知道的是——冯.诺依曼体系结构是现代计算机的基础
现在大多计算机仍是冯.诺依曼计算机的组织结构,只是作了一些改进而已,并没有从根本上突破冯体系结构的束缚。

二、操作系统

计算机是各种硬件构成的,那么这些硬件就需要软件去操控。

概念

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

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

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

计算机软件和硬件之间的结构图如下:

在这里插入图片描述


一、进程介绍

概念

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

  • 内核观点:担当分配系统资源(CPU时间,内存)的实体
    (包含着程序代码 + 相关数据结构)

    首先,程序就是我们所写的代码也就是一堆文字符号,而真正想要运行,得要和计算机软件硬件联系起来。按照课本上的定义,被加载到内存中的程序就叫做进程。而这些进程都是由操作系统来管理的。比如去分配资源比如时间片等等去进行各种调度策略这里我们不做赘述想要了解的同学可以去查查资料。

进程控制块

我们知道进程是由操作系统管理的,它管理的方式就是先描述再组织。我们知道linux操作系统是由C语言编写的,那么描述进程的结构就用的是结构体。描述进程的结构体也叫做PCB。

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),在Linux操作系统下则是一个结构体task_struct。具体可参考task_struct结构体结构
  • 在linux系统下,描述进程的结构体是task_struct,是内核的一种数据结构,会被加载到RAM(内存中)并且保存着进程的信息。
  • task_struct内容:
  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
    状态: 任务状态,退出代码,退出信号等。
    优先级: 相对于其他进程的优先级。
    程序计数器: 程序中即将被执行的下一条指令的地址。
    内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
    上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
    I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
    记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
    其他信息
    在这里插入图片描述

小结:一个程序想要运行的时候就会以进程的形式存在,当进程生成的时候,OS会给进程自动创建一个对应的PCB来管理进程。曾经我们运行各种程序的本质就是在操作系统上建立进程!!!


上边说完了描述进程,接下来说说怎么组织进程

进程的组织方式一共有三种:

  1. 链接方式
  2. 索引方式
  3. 连接表方式
    具体参考进程的组织方式,只需了解一下,本篇文章不做重点阐述。

如下图所示,在内存中多个进程都有自己的进程号id,一个进程是包含他的代码段和数据段以及相关的数据结构的。linux下task_struct中数据会保存对应进程数据和代码地址,而每一个进程之间也可以相互通信。
当CPU调度的时候,只需要提供给CPU ,PCB相关数据就会找到对应的进程去调度。
在这里插入图片描述

并且所有运行在系统里的进程都以task_struct链表的形式储存在内核里。

查看进程

  • Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。
  • 而系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口
    在这里插入图片描述
  • 通过系统调用获取进程标示符
  • 进程id(PID)
    父进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 	printf("pid: %d\n", getpid());//打印该进程的id号
 	printf("ppid: %d\n", getppid());//打印该进程父进程的id号
 	return 0;
}

实践操作一下:

在这里插入图片描述

通过系统创建进程

  • fork函数
    fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。
    它不需要参数并返回一个整数值。下面是fork()返回的不同值。

负值:创建子进程失败。
零:返回到新创建的子进程。
正值:返回父进程或调用者。该值包含新创建的子进程的进程ID

在这里插入图片描述
就是好比细胞分裂,父亲和孩子从fork();语句开始共享同一份代码和数据,并且都向下执行。(相当于两个程序一起跑)
当然一个父进程也可以有多个子进程

这里要注意fork函数有两个返回值,一个是父进程的返回值,返回子进程的id。二是子进程的返回值,正常返回0,错误返回一个负值。
调用fork之后,数据、堆、栈有两份,代码仍然为一份但是这个代码段成为两个进程的共享代码段都从fork函数中返回,箭头表示各自的执行处。当父子进程有一个想要修改数据或者堆栈时,两个进程真正分裂。

引用一位网友的话来解释fork函数返回的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fork函数返回的值指向子进程的进程id, 因为子进程没有子进程,所以其fork函数返回的值为0.

具体参见fork百度百科

举例如下,用if语句判断fork函数返回值不同区别父子进程,来执行不同代码,可以看到最后父进程返回值是子进程的ID,子进程返回0.
在这里插入图片描述

二、进程状态

1.内核代码如下:

一个进程可以有几个状态(在linux内核下进程也可以叫任务)

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

总结

本篇文章带你了解进程初识,了解进程已经父子进程的概念。

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

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

相关文章

【数据结构】二叉树的遍历

目录☀️二叉树的构建☀️二叉树的遍历&#x1f33b;前序遍历&#x1f33b;中序遍历&#x1f33b;后序遍历☀️完整代码展示☀️二叉树的构建 便于理解二叉树的遍历&#xff0c;这里我们手动简单构建一个二叉树&#xff0c;当然&#xff0c;此处二叉树的构建并不是真正二叉树的…

C++类与对象(一)

目录 一、面向过程和面向对象认识 二、类的引入 三、类的定义 类的两种定义方式&#xff1a; 四、类的访问限定符及封装 4.1 访问限定符 4.2 封装 五、类的作用域 六、类的实例化 七、类对象模型 7.1 如何计算类对象的大小​​​​​ 7.2 类对象的存储方式 7.3 结…

SpringBoot+Mybaits搭建通用管理系统实例十一:数据缓存功能实现

一、本章内容 使用ehcache实现系统缓存功能,并配置实现mybatis的二级缓存,自定义分页缓存的key,识别实体类型,并根据实体属性的配置,组合生成key值用于标识缓存数据。 完整课程地址二、开发视频 SpringBoot+Mybaits搭建通用管理系统实例三:缓存管理功能实现 三、缓存配置 …

滚动吧,数字

朋友有个需求关于金币滚动效果&#xff0c;网上也有很多教程&#xff1b;但多不太符合他的需求&#xff0c;所有利用空余时间帮他做了一个通用组件。 效果图如下: 1、按照次数和速度进行&#xff0c;对应的滚动效果。 2、缓动效果可以根据自己的情况进行修改。 项目地址&#x…

windows安装VMware虚拟机(附带CentOS7部署)

软件下载 链接&#xff1a;https://pan.baidu.com/s/1Vw2Bilf9uf-EYR6_MR86aA?pwdd2qr 提取码&#xff1a;d2qr VMware安装 通你上述链接下载VMware安装包&#xff0c;没有特别选项&#xff0c;选安装位置无脑下一步安装&#xff0c;安装完成后会提示你输入激活码&#xf…

Java中的OpenCV-图像处理

我们将在本文中介绍以下高级图像处理操作&#xff1a;Canny 边缘检测轮廓和形状识别Canny 边缘检测&#xff1a;Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年开发的。它是一个多阶段算法&#xff0c;我们将按如下方式经历每个阶段&#xff1a;噪声…

Java与GitLab OpenAPI交互

通过Gitlab Open api代码来操作代码的合并及关闭&#xff0c;项目的模板生成........ 方式一&#xff1a; 使用java-gitlab-api(推荐) 接口文档Java Gitlab API Documentation <dependency> <groupId>org.gitlab</groupId> <art…

49 多个 classloader 加载的同类限定名的Class 在 jhat 中显示不全

前言 呵呵 这是在之前 排查一个 flink 的相关问题的时候 发现的一个问题 flink 默认的 job 隔离是基于 Classloader 来进行隔离的 直到 最近才有时间来看一下 这个问题的原因, 究其代码 也还是比较容易找到 大致记录一下 以下内容, 截图 基于 jdk8 测试用例 /*** …

要闻 | 人大金仓重磅亮相2022南京软博会

“软件赋能 数智转型”&#xff0c;2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会&#xff08;下称“南京软博会”&#xff09;于11月23至25日顺利举行。人大金仓重磅亮相本次展会&#xff0c;并受邀出席同期召开的2022中国&#xff08;南京&#xff…

【LeetCode每日一题】——37.解数独

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数组 二【题目难度】 困难 三【题目编号】 37.解数独 四【题目描述】 编写一个程序&#xff…

抢先看!阿里发布2023最新版分布式核心小册,GitHub标星破已千万

什么是分布式 一个分布式系统你可以看做是一组计算机系统一起工作&#xff0c;而在终端用户的视角看过去&#xff0c;就像一台计算机在工作一样 。 这组一起工作的计算机&#xff0c;拥有共享的状态 &#xff0c;他们同时运行&#xff0c;独立机器的故障不会影响整个系统的正常…

1、认识时间复杂度和简单的排序算法

目录时间复杂度选择排序冒泡排序异或交换解释案例综上插入排序二分查找拓展对数器时间复杂度 如果一个操作时间和数据量没有关系&#xff0c;则是常数时间的操作 比如一个数组arr[n]这就是算一个偏移量&#xff0c;然后找到这个位置的值&#xff0c;这就是常数时间&#xff0c…

力扣(LeetCode)882. 细分图中的可到达节点(C++)

spfa 将边细分成节点&#xff0c;如果一条边细分出 nnn 个结点&#xff0c;那么边的两个端点距离 n1n1n1 &#xff0c;边长 n1n1n1。提示中给出&#xff0c;一共 300030003000 个初始结点&#xff0c;无向边的数目小于等于 100001000010000 &#xff0c;这是提示我们最多有 20…

服务器怎么远程连接控制

服务器怎么远程连接控制 我是艾西&#xff0c;还是有很多小白同学问我服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程&#xff0c;让不懂的新手小白一看就会&#xff0c;分分钟上手教程 远程服务器需要一台电脑俗称“PC”就是我们自己平时经…

红外遥控视力自动检测系统的设计与实现

红外线视力检测系统的设计与实现 实现方法 分为两部分 上位机-------------串口通讯-------------下位机 上位机&#xff1a;使用LabVIEW软件编写窗口软件。 串口通讯&#xff1a;USB线进行链接通讯。 下位机&#xff1a;AT89C52单片机开发板 说明&#xff1a;Labvi…

46-pytest-分布式插件pytest-xdist使用

分布式插件pytest-xdist使用前言安装插件分布式用例设计原则使用示例测试报告按一定顺序执行前言 本篇来学习下在pytest中分布式执行测试用例&#xff0c;以节省测试时间。 安装插件 pip install pytest-xdist分布式用例设计原则 用例之间是独立的&#xff0c;用例之间没有…

学生护眼台灯哪个牌子最好?2022双十二4款儿童护眼写字灯推荐

现在的孩子学业压力越来越大了&#xff0c;眼睛也是长期高强度使用&#xff0c;不堪重负&#xff0c;如果不注意保护&#xff0c;加上年龄偏小身体器官尚未发育完全&#xff0c;极易出现各种眼睛问题。所以对于经常晚上看书写字的学生群体来说&#xff0c;有一个健康护眼的照明…

OpenGL ES 学习(二) -- 渲染模式和GLSL

上一章&#xff0c;我们学习了 OpenGL 的基本知识&#xff0c;这一章&#xff0c;一起学习OpenGL的渲染模式和渲染语言GLSL。 一. 渲染流程 OpenGL的渲染流程如下图所示&#xff1a; 从这里看出&#xff0c;OpenGL 需要使用顶点着色器&#xff0c;先绘制好轮廓&#xff0c;再…

Java面向对象之——多态

文章目录一、多态的概念二、多态的条件三、重写四、向上转型和向下转型1、向上转型2、向下转型五、再谈多态六、多态的优缺点总结一、多态的概念 多态是同一个行为具有多个不同表现形式或形态的能力。就比如人吃饭&#xff0c;对于中国人使用筷子吃饭&#xff0c;美国人使用刀…

C. Almost All Multiples(贪心 + 思维)

Problem - C - Codeforces 给定两个整数n和x&#xff0c;如果pi是i的倍数&#xff0c;所有1≤i≤n-1&#xff0c;pn1&#xff0c;且p1x&#xff0c;则长度为n的排列组合† p被称为搞笑。 找出最小的有趣的排列组合&#xff0c;或报告说不存在这样的排列组合。 † 长度为n的排…