[Linux] 进程入门

在这里插入图片描述

💻文章目录

  • 📄前言
  • 计算机的结构体系与概念
    • 冯诺依曼体系结构
    • 操作系统
      • 概念
      • 目的与定位
  • 进程
    • 概念
    • 描述进程-PCB
    • task_struct
    • 检查进程
    • 利用fork创建子进程
  • 进程状态
    • 进程状态查看
    • 僵尸进程
    • 孤儿进程
  • 📓总结


📄前言

作为一名程序员,我们天天都在与代码打交道,但你是否有了解过我们的程序是如何在操作系统中运行与调度的呢?如果你对进程与计算机不甚了解,那么本文将带领你走向操作系统进程的第一步。

计算机的结构体系与概念

在了解进程的相关知识前,我们需要先了解以下计算机的组成体系及其概念。

冯诺依曼体系结构

冯诺依曼体系结构是一种计算机的组成方案,因为使用其体系构造的计算机性价比很高,所以我们日常生活中使用的计算机,如笔记本、服务器等大部分都遵守着冯诺依曼体系结构。

冯诺依曼体系结构规定了计算机由五个部分组成,控制器、运算器、储存器、输入设备、输出设备。

在这里插入图片描述
注意:

  • 这里的储存器指的是内存
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
  • 外设(输入或射出设备)要输入或输出数据,只能写入内存或从内存中读取
  • 总的来说,所有设备都只能直接和内存打交道

操作系统

概念

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

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

目的与定位

操作系统是纯正用于管理的软件,操作系统与硬件交互,管理所有的软硬件资源。

在这里插入图片描述

进程

概念

如果你没有学习过系统知识,可能会以为进程就是把二进制程序拷贝执行而已,但其实进程指的是PCB(process control block)+ 可执行程序

描述进程-PCB

PCB又名进程控制块,这是一个进程属性的集合体,用于描述进程,在linux内核是一种链式结构(task_struct),它会被装载到内存中。

task_struct

在Linux里面描述进程的结构体就叫做task_struct,其内容分为:

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

检查进程

进程的信息可以通过linux目录中的/proc文件夹来查看
在这里插入图片描述
或者你也可以用top / ps 等指令工具来获取

利用fork创建子进程

在Linux平台下,C语言可以用fork函数来创建子进程,一般通过fork的返回值来进行分流,父子进程代码共享,变量数据等使用写实拷贝,当数据没被修改时,数据共用。

#include <stdli.h>
#include <sys/types.h>
#include <unistd.h>int main() {//fork如果创建子进程成功则返回0,失败返回-1。pid_t id = fork();	if(id == 0){printf("我是子进程\n");}else{printf("我是父进程\n");}return 0;
}

进程状态

在Linux中进程拥有多种状态,一个进程可以有多个状态。让我们来看看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 磁盘休眠状态:又名不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T 停止状态:通过发送 SIGSTOP 信号来给进程停止,这个被停止的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X 死亡状态:这个状态只是一个返回状态,你不会在任务列表看到这个状态。

进程状态查看

我们可以通过top指令或ps指令来检查进程
在这里插入图片描述

僵尸进程

僵尸进程是一种比较特殊的状态,当子进程退出,而父进程没有读取到子进程的返回码时就会产生僵尸进程。因为僵尸进程还没被系统清理其开辟的空间,所以僵尸进程还会导致内存泄漏。

C语言创建僵尸进程:

#include <stdio.h>
#include <stdlib.h>int main()
{pid_t id = fork();if(!id){	//C语言可以通过getpid指令来获取进程的idprintf("child[%d] is return....\n", getpid());sleep(2);exit(EXIT_SUCCESS);}else {printf("parent[%d] is sleeping...\n",getpid());sleep(10);}return 0;
}

在这里插入图片描述

孤儿进程

孤儿进程和僵尸进程恰好相反,如果父进程先退出,子进程继续运行,那么子进程就会成为孤儿进程。成为孤儿进程后,就被交给pid为1的进程管理,也就是系统。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{pid_t id = fork();int i = 0;if (id == 0){	//childwhile(i++ < 10){printf("[%d] : child_pid[%d] : parent_pid[%d]\n", getpid(), getppid());sleep(1);}	}else{	//parentprintf("parent[%d], is exit\n", getpid());exit(0);}return 0;
}

在这里插入图片描述

📓总结

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

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

相关文章

RTI-DDS在VS+QT使用记录

在VSQt平台中使用RTI-DDS6.1.1和RTI-DDS7.2.0在VS中使用有所区别 重点表现在VS预处理器定义中&#xff0c; 6.1.1版本需要定义以下内容 DEBUG版本 _DEBUG RTI_STATIC _CONSOLE WIN32 RTI_WIN32 _SCL_SECURE_NO_WARNINGS而7.2.0需要定义以下内容 _DEBUG RTI_STATIC _CONSOLE W…

Python 跨文件夹导入自定义包

一、问题再现 有时我们自己编写一些模块时&#xff0c;跨文件夹调用会出现ModuleNotFoundError: No module named XXX 二、解决方案 只需要在下层文件夹中的__init__.py文件中&#xff0c;添加如下代码即可&#xff1a; import sys from os import path sys.path.append(pa…

单链表OJ题——11.随机链表的复制

11.随机链表的复制 138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 此题可以分三步进行&#xff1a; 1.拷贝链表的每一个节点&#xff0c;拷贝的节点先链接到被拷贝节点的后面 2.复制随机指针的链接&#xff1a;拷贝节点的随机指针指向…

什么是EVM?以太坊EVM合约交互

目录 什么是EVM? 为什么 EVM 很重要? 结论 虚拟机引擎 以太坊虚拟机

板块概念相关(五)

5-板块概念相关 文章目录 5-板块概念相关一. 查询所有的版块列表二. 查询所有的概念列表三. 查询所有的地域列表四. 查询所有的版块资金支持的类型五. 查询某个版块历史记录列表,形成图表形式六. 查询某个版块历史记录列表七. 查询某个版块今日资金,形成图表形式八. 查询该板块…

【Python爬虫】8大模块md文档集合从0到scrapy高手,第7篇:selenium 数据提取详解

本文主要学习一下关于爬虫的相关前置知识和一些理论性的知识&#xff0c;通过本文我们能够知道什么是爬虫&#xff0c;都有那些分类&#xff0c;爬虫能干什么等&#xff0c;同时还会站在爬虫的角度复习一下http协议。 爬虫全套笔记地址&#xff1a; 请移步这里 共 8 章&#x…

Python学习:自动生成Mysql建表语句

Python&Mysql 一、生成建表语句二、执行建表语句 一、生成建表语句 使用Python批量自动生成Mysql中已有表的建表语句 import osdef generate_create_table_sql(cursor,file_path,table_name,schema):# 获取表的列信息cursor.execute(f"SHOW FULL COLUMNS FROM {tabl…

11.21假设检验,第一第二类错误

两类错误 做假设的时候&#xff0c;首选假设都是已知的参数。 备选假设是不确定的。 要验证的是已知的可能的参数&#xff0c;也就是说是在这样一组数据下的分布&#xff0c;的概率&#xff0c;是不是落在拒绝域里&#xff0c;如果落在拒绝域里就说明当下的假设不成立&#…

Vue 响应式数据的判断

isRef&#xff1a;检查一个值是否为一个 ref 对象。 isReactive&#xff1a;检查一个对象是否由 reactive 创建的响应式数据。 isReadonly&#xff1a;检查一个对象是否由 readonly 创建的只读数据。 isProxy&#xff1a;检查一个对象是否由 reactive 或者 readonly 创建的数…

单链表OJ题——10.环形链表2

10.环形链表2 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 如果链表存在环&#xff0c;则fast和slow会在环内相遇&#xff0c;定义相遇点到入口点的距离为X,定义环的长度为C,定义头到入口的距离为L,fast在slow进入环之后一圈内追上slow…

【攻防世界-misc】simple_transfer

1.下载并打开文件&#xff0c; 2.这个文件是一个pcap文件&#xff0c; 用wireshark打开&#xff0c;并按上图步骤操作&#xff0c; 会自动定位到有flag的这个信息行&#xff0c;这时需要右键追踪该信息的tcp流即可。 向下查找时&#xff0c;可以看到有一个pdf文件在这个里面&…

【Java基础】Java导Excel攻略

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【开源】基于Vue和SpringBoot的教学过程管理系统

项目编号&#xff1a; S 054 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S054&#xff0c;文末获取源码。} 项目编号&#xff1a;S054&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

8 个有效的安卓数据恢复软件——可让丢失的文件起死回生!

所有数字设备最终都会失败。安卓设备也不例外&#xff0c;无论您使用的是 Android 手机还是平板电脑。由于缺乏备份、意外删除、存储卡问题、生根错误等&#xff0c;您可能会丢失一些宝贵的数据。 如果发生这种情况&#xff0c;最好的选择之一是使用安卓数据恢复软件——这可能…

Xilinx Zynq-7000系列FPGA任意尺寸图像缩放,提供两套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐FPGA图像处理方案FPGA图像缩放方案 3、设计思路详解HLS 图像缩放介绍 4、工程代码1&#xff1a;图像缩放 HDMI 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设计 5、工程代码2&#xff1a;图像缩放 LCD 输出PL 端 FPGA 逻辑设计PS 端 SDK 软件设…

移动端适配-(postcss-pxtorem)

基于vuevant的移动端适配(rem) 1.下载lib-flexible --save npm i lib-flexible --save2.在main.js中引入lib-flexible main.js import lib-flexible/flexible3.设置meta标签 <meta name"viewport" content"widthdevice-width, initial-scale1, maximum-s…

Java面试题08

1.jsp 和 servlet 有什么区别&#xff1f; JSP&#xff08;JavaServer Pages&#xff09;是一种在HTML中嵌入Java代码的技术&#xff0c;适合用于生成动态内容&#xff1b; Servlet是Java编写的服务器端程序&#xff0c;用于处理HTTP请求和响应。 JSP (Java Server Pages) 和 …

漏洞检测与EPSS评分

EPSS (利用预测评分系统)是为了测量特定的漏洞在野外被利用的可能性。EPSS 得分范围从0% (最低的利用概率)到100% (最高的利用概率)。此外&#xff0c;由于仅从概率得分很难推断出真正的意义&#xff0c;EPSS 还提供百分位排名; 百分位排名衡量 EPSS 概率相对于所有其他 EPSS 得…

Qt无边框设计

//指定窗口为无边框 this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);重写鼠标事件&#xff1a; void mousePressEvent(QMouseEvent* event) override;