当前位置: 首页 > news >正文

进程(1)

1.什么是进程

要回答这个问题首先我们要解答什么是程序的问题。什么是程序呢?程序本质是就是存放在磁盘上的文件。我们要运行程序,首先必须要将其加载到内存中,这样才能与cpu交互,这是冯诺依曼体系架构所决定的。

程序运行起来后,就需要操作系统进行管理。管理的方法是先描述,再组织。

如何描述呢?就需要PCB(process control block)进程控制块来进行描述。具体上讲就是定义一个struct task_struct结构体,该结构体中包含该进程的所有属性。

如何组织呢?就需要我们学习的数据结构进行组织,常见的就是利用链表的数据结构,将我们的描述进程的结构体串起来。

这样操作系统对进程的管理就变成了对数据结构的维护。

这时我们来回答什么是进程? 

进程就是加载到内存中的程序。但是我更喜欢的定义是:进程 = 内核数据机构(PCB)+ 加载到内存中的磁盘上的代码。

2.在linux下的进程

2.1与进程有关的系统调用

程序运行起来时就是一个进程,我们可以调用getpid获取其proces id,我们可以调用getppid获取其parent process id。

 1 #include<iostream>2 #include<unistd.h>                                                                                 3 using namespace std;4 5 int main(){6 7   cout<<"this process,s pid is "<<getpid()<<"this process,s ppid is "<<getppid()<<endl;8 9   return 0;10 }

this process,s pid is 8476 this process,s ppid is 772。这是我们得到的输出结果。当我们while(1)持续运行起来时,我们可以新建一个窗口。利用ps -ajx | head -1 && ps -ajx| grep 8476 来查看我们的进程。

我们也可以在子目录下的/proc目录下查找当前进程的目录以获得进程的属性

2.2fork函数

fork是一个创建子进程的函数。在执行完这条语句后,会创建一个子进程。父进程和子进程都会执行后续的代码,会被父子进程共享。

fork也会有一个pid_t类型的返回值,父进程会获得子进程的pid,子进程会获得0.这样我们就能够分流出父子进程。

                                             1 #include<iostream>2 #include<sys/types.h>3 #include<unistd.h>4 5 6 int main(){7   pid_t id = fork();8 9   if(id == 0){10     std::cout<<"this is a child process:"<<getpid()<<"its parent process:"<<getppid()<<"returnval:    "<<id<<std::endl;11   }else{12     std::cout<<"this is a parend process: "<<getpid()<<"its parent process:"<<getppid()<<"returnva    l:"<<id<<std::endl;                                                                                13   }14   return 0;                                        15 }       

this is a parend process: 8900its parent process:7721returnval:8901
this is a child process:8901its parent process:8900returnval:0
这是我们输出的结果

这张图就详细的介绍了我们的进程的关系。可以看见我们打开的shell之后就会在linux云服务器的主进程下创建一个子进程,这样就不会影响我们的主进程正常运行。

3.进程状态 

我们下面介绍三种运行状态:运行 阻塞 挂起

3.1运行状态R

当程序加载到内存过后,需要cpu参与某些计算。但是一个核心的cpu在一个瞬间只能处理一个进程,那么我们的进程肯定有很多,此时我们该怎么办呢?

引入运行队列的概念,一个单核CPU有一个运行队列,操作系统会将需要cpu处理的进程的PCB进程控制块放入运行队列中,操作系统就会根据运行队列依次分配CPU的资源。

我们将在运行队列中的进程的状态称为运行状态。

3.2阻塞状态

进程不仅仅需要cpu的资源,有时还需要访问外设。一个外设在某个时刻也只能被一个进程访问,这时进程就会进入一个等待的队列中。

 由于外设的速度是很慢的,因此在外设的等待队列中的进程的pcb就会被标识上阻塞的状态。

3.3挂起状态 

当进程处于阻塞状态或者其他状态时,并不会被系统立马调度,如果此时内存不足,就会将进程的代码和数据临时的保存在磁盘上,这样就腾出内存给别人使用,当内存足够时再从磁盘载入到内存中。

当进程被临时保存到磁盘中时,其pcb的状态就是挂起状态。

综上,进程的不同状态实际上就是其PCB在不同的队列中等待某种资源

4.Linux下的进程状态

static const char* const task_struct_array[]={"R(ruuning)""S(sleeping)""D(disk sleep)""T(stopped)""t(tracing stop)""X(dead)""Z(zombie)"
}

4.1R(running)状态

R状态意味着进程控制块在cpu的运行队列中。并不意味着进程一定在运行。

4.2S(sleeping)状态

S状态意味着进程控制块在外设的等待队列中,等待访问外设资源。与我们将的阻塞状态相同。

4.3T(stopped)状态

T状态意味着进程被暂停执行,此时进程处于一种静止状态,不占用 CPU 资源,也不会继续向下执行代码。

当我们运行程序时,输入Ctrl+z就是触发程序暂停

4.4t(tracing stop)状态

t状态意味着程序正在被追踪暂停状态,常见我们调试的时候程序就会出现t状态

4.5D(disk sleep)状态

disk sleep 状态就是磁盘休眠状态,意味着程序不能被OS杀掉,只能通过断电或者程序自己醒来来解决。常见在高io的情况下,D状态是为了防止进程在等待外设资源时由于内存不足问题被OS杀掉。

4.6X(dead)状态

X状态意味着程序已经死亡,会被OS快速回收

4.7Z(zombie)状态

Z状态意味着程序进入僵尸(将死)状态,它的出现是为了让OS或者父进程知晓进程已经完成任务,让父进程或者OS来进行读取其状态。之后才会进入X状态等待OS或者父进程对其资源回收。

值得注意的是,z状态时进程已经死亡(exit),此时只剩下PCB进程控制块。如果z状态不能被读取,转换为x状态,进而被系统回收资源,就会导致资源泄漏。

5.孤儿进程

当我们使用fork创建子进程,但是父进程先比子进程退出,这个时候子进程就是孤儿进程。

此时的子进程会被一号进程即操作系统领养。如果不被领养,成为僵尸进程的时候就会没人读取,进而造成内存泄漏问题。

如果是前台进程创建的子进程,变为孤儿进程是就会成为后台进程,此时只能用kill -9 pid 杀死进程。

6.进程优先级

6.1优先级和权限的区别:

权限指的是能否获取某种资源,而优先级指的是获取某种资源的先后顺序。

6.2为什么存在优先级

原因是因为资源的有限性和任务的无限性之间的矛盾。这就意味着我们要用有限的资源办大事。

6.3Linux中的优先级

输入指令ps -l 

Linux中的优先级是依靠两个值priority值和nice值确定的。priority值大部分都是80,nice值位于-20到+19之间。计算得到的值越小则优先级越高。

我们可以使用sudo top指令,更改进程的nice值从而更改优先级。 

7.进程切换

一个单核cpu一个时刻只能运行一个进程,但是我们按照我们的常识我们能同时启动多人软件运行,这是为什么呢?这是因为进程切换。

CPU中存在着一套寄存器,用于存储进程的临时数据。进程在运行的时候并不是一直占有cpu,而是都有自己的时间片,在自己的时间片时,cpu会被自己占有资源。但当cpu切到下一个程序的时候就会对进程的上下文数据保护,当进程恢复运行的时候上下文数据又会恢复。这就叫做进程切换

在任何时刻,寄存器内的自己进程数据,只属于自己的进程。寄存器被共享,但是寄存器内的数据各自私有。

 

 

相关文章:

进程(1)

1.什么是进程 要回答这个问题首先我们要解答什么是程序的问题。什么是程序呢&#xff1f;程序本质是就是存放在磁盘上的文件。我们要运行程序&#xff0c;首先必须要将其加载到内存中&#xff0c;这样才能与cpu交互&#xff0c;这是冯诺依曼体系架构所决定的。 程序运行起来后…...

ChatGPT搜索免费开放:AI搜索引擎挑战谷歌霸主地位全面分析

引言 2025年2月6日&#xff0c;OpenAI宣布ChatGPT搜索功能向所有用户免费开放&#xff0c;且无需注册登录。这一重大举措在搜索引擎行业引发巨大反响&#xff0c;有观点认为"谷歌搜索时代即将结束"。本文将深入分析ChatGPT生成式AI搜索对谷歌搜索业务及全球搜索市场…...

hadoop之MapReduce:片和块

假如我现在500M这样的数据&#xff0c;如何存储&#xff1f; 500M 128M 128M 128M 116M 分为四个块进行存储。 计算的时候&#xff0c;是按照片儿计算的&#xff0c;而不是块儿。 块是物理概念&#xff0c;一个块就是128M ,妥妥的&#xff0c;毋庸置疑。 片是逻辑概念&…...

GitPuk快速安装配置教程(入门级)

GitPuk是一款国产开源免费的代码管理工具&#xff0c;工具简洁易用&#xff0c;开源免费&#xff0c;本文将讲解如何快速安装和配置GitPuk&#xff0c;以快速入门上手。 1、安装 支持 Windows、Mac、Linux、docker 等操作系统。 1.1 Linux安装&#xfeff; 以下以Centos7安装…...

在CT107D单片机综合训练平台上,8个数码管分别单独依次显示0~9的值,然后所有数码管一起同时显示0~F的值,如此往复。

题目&#xff1a;在CT107D单片机综合训练平台上&#xff0c;8个数码管分别单独依次显示0~9的值&#xff0c;然后所有数码管一起同时显示0~F的值&#xff0c;如此往复。 延时函数分析LED首先实现8个数码管单独依次显示0~9的数字所有数码管一起同时显示0~F的值&#xff0c;如此往…...

深入浅出Java数组:从基础到高阶应用

目录 引言 一、数组概述 1.什么是数组&#xff1f; 2.数组的分类&#xff1f; 3.Java数组存储元素的特点&#xff1f; 4.数组优点&#xff1f; 5.数组缺点&#xff1f; 二、一维数组 1. 静态初始化一维数组 2.增强 for 循环&#xff08;for-each 循环&#xff09; 3…...

基于 Nginx 的 CDN 基础实现

概览 本文是对基于Nginx的CDN网络的学习笔记&#xff0c;阅读的代码为&#xff1a;https://github.com/leandromoreira/cdn-up-and-running 其中&#xff0c;先确定CDN中的一些基础概念&#xff1a; Balancer&#xff1a;负载均衡&#xff0c;即请求数据的流量最开始打到Bal…...

讲人话的理解ai学习原理

通过把各种东西打上分数标签存起来。ai不花算力是不可能的&#xff0c;需要巨大的算力&#xff0c;需要要大量gpu芯片&#xff0c;如果大大降低成本&#xff0c;就需要蒸馏别人成果&#xff0c;把这些参数偷偷弄过来。 比如”猫睡在石头上感觉很凉快&#xff0c;很舒服&#x…...

Spring boot整合quartz方法

目录 1.定时任务 1.quartz说明 2.Quartz提供了不同的数据存储策略以管理作业调度信息&#xff1a; 1.Quartz引入依赖 2.开发定时任务 &#xff08;1&#xff09;更新定时任务 &#xff08;2&#xff09;停止定时任务 &#xff08;3&#xff09;唤醒定时任务 &#xff…...

网站改HTTPS方法

默认的网站建设好后打开的样子那看起来像是钓鱼网站&#xff0c;现在的浏览器特别只能&#xff0c;就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而&#xff0c;随着HTTPS的推出&#xff0c;传输协议通…...

数据中台是什么?:架构演进、业务整合、方向演进

文章目录 1. 引言2. 数据中台的概念与沿革2.1 概念定义2.2 历史沿革 3. 数据中台的架构组成与关键技术要素解析3.1 架构组成3.2 关键技术要素 4. 数据中台与其他平台的对比详细解析 5. 综合案例&#xff1a;金融行业数据中台落地实践5.1 背景5.2 解决方案5.3 成果与价值 6. 方向…...

Java Stream API:高效数据处理的利器引言

Java Stream API&#xff1a;高效数据处理的利器引言 在 Java 编程中&#xff0c;数据处理是一项极为常见且关键的任务。传统的 for 循环在处理数据集合时&#xff0c;往往会导致代码变得冗长、复杂&#xff0c;这不仅增加了代码的编写难度&#xff0c;还降低了代码的可读性和…...

qml之Text 组件显示当前时间

在 QML 中,显示时间的常用组件是 Text,结合 JavaScript 时间函数或者 Qt 的时间模块来实现动态时间显示。虽然 QML 没有专门用于显示时间的组件,但可以通过 Text 来显示格式化后的时间信息。 1. 使用 Text 组件显示当前时间 示例代码: import QtQuick 2.15 import QtQui…...

两栏布局、三栏布局、水平垂直居中

文章目录 1 两栏布局1.1 浮动 margin1.2 浮动 BFC1.3 flex布局1.4 左绝父相 margin1.5 右绝父相 方向定位 2 三栏布局2.1 子绝父相 margin2.2 flex布局2.3 浮动 margin2.4 圣杯布局2.5 双飞翼布局 3 水平垂直居中3.1 绝对定位 translate3.2 绝对定位 margin3.3 绝对定位…...

Hanoi ( 2022 ICPC Southeastern Europe Regional Contest )

Hanoi &#xff08; 2022 ICPC Southeastern Europe Regional Contest &#xff09; The original problem “Towers of Hanoi” is about moving n n n circular disks of distinct sizes between 3 3 3 rods. In one move, the player can move only the top disk from on…...

Matplotlib基础01( 基本绘图函数/多图布局/图形嵌套/绘图属性)

Matplotlib基础 Matplotlib是一个用于绘制静态、动态和交互式图表的Python库&#xff0c;广泛应用于数据可视化领域。它是Python中最常用的绘图库之一&#xff0c;提供了多种功能&#xff0c;可以生成高质量的图表。 Matplotlib是数据分析、机器学习等领域数据可视化的重要工…...

SMU寒假训练第二周周报

训练情况 本周是第二周&#xff0c;训练情况比第一周好一点点&#xff0c;也仅仅是好一点点&#xff0c;经过春节以及后遗症&#xff0c;牛客更是打的稀烂&#xff0c;还不如去年&#xff0c;都不知道自己在干嘛&#xff0c;训练赛情况也非常糟糕&#xff0c;还要去搞社会实践…...

解锁全新视界:一键畅享 360 度全景图与多格式转换

软件介绍 各位朋友&#xff0c;大家好&#xff01;今天要给大家引荐一款超实用的全景图转换“神器”——Pano2VR Pro 的最新版本。在当今这个追求极致视觉体验的时代&#xff0c;它宛如一把神奇的钥匙&#xff0c;能够解锁全新的视觉领域&#xff0c;将平平无奇的不同角度图像…...

python:面向对象案例烤鸡翅

自助烤鸡翅的需求&#xff1a; 1.烤鸡翅的时间和对应的状态&#xff1a; 0-4min :生的 4-7min:半生不熟 7-12min&#xff1a;熟了 12min以上&#xff1a;烤糊了 2.添加调料&#xff1a; 客户根据自己的需求添加 定义烤鸡翅的类、属性和方法&#xff0c;显示对象的信息 …...

游戏外挂原理解析:逆向分析与DLL注入实战(植物大战僵尸

目录 1.前言2.外挂类型3.前置知识4.CE查找基质4.1 逐步分析4.2 暴力搜索5.实现数值外挂6.dll导入表注入7.实现行为外挂(无敌类型)8.源码下载与外挂进阶本篇原文为:游戏外挂原理解析:逆向分析与DLL注入实战(植物大战僵尸)。 更多C++进阶、rust、python、逆向等等教程,可…...

【10.10】队列-设计自助结算系统

一、题目 请设计一个自助结账系统&#xff0c;该系统需要通过一个队列来模拟顾客通过购物车的结算过程&#xff0c;需要实现的功能有&#xff1a; get_max()&#xff1a;获取结算商品中的最高价格&#xff0c;如果队列为空&#xff0c;则返回 -1add(value)&#xff1a;将价格为…...

android的ViewModel和LiveData 简介

ViewModel ViewModel 的优势 ViewModel 的替代方案是保存要在界面中显示的数据的普通类。在 activity 或 Navigation 目的地之间导航时&#xff0c;这可能会造成问题。此时&#xff0c;如果您不利用保存实例状态机制存储相应数据&#xff0c;系统便会销毁相应数据。ViewModel…...

Linux系统之free命令的基本使用

Linux系统之free命令的基本使用 一、free命令介绍二、free命令的使用帮助2.1 free命令的帮助信息2.2 free命令帮助解释 三、free命令的基本使用3.1 显示内存使用情况3.2 新增总计条目3.3 显示内存详细信息 四、注意事项 一、free命令介绍 free 命令是 Linux 系统中用于显示系统…...

大模型赋能网络安全整体应用流程概述

一、四个阶段概述 安全大模型的应用大致可以分为四个阶段: 阶段一主要基于开源基础模型训练安全垂直领域的模型; 阶段二主要基于阶段一训练出来的安全大模型开展推理优化、蒸馏等工序,从而打造出不同安全场景的专家模型,比如数据安全领域、安全运营领域、调用邮件识别领…...

SpringCloud - Nacos注册/配置中心

前言 该博客为Nacos学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 一、简介 Nacos官网&#xff1a;https://nacos.io/docs/next/quickstart/quick-start/ Nacos /nɑ:kəʊ…...

面试准备——Java理论高级【笔试,面试的核心重点】

集合框架 Java集合框架是面试中的重中之重&#xff0c;尤其是对List、Set、Map的实现类及其底层原理的考察。 1. List ArrayList&#xff1a; 底层是动态数组&#xff0c;支持随机访问&#xff08;通过索引&#xff09;&#xff0c;时间复杂度为O(1)。插入和删除元素时&#…...

AI伴读-清华大学104页《DeepSeek:从入门到精通》

辅助工具&#xff1a;deepseek、豆包AI伴读 官网&#xff1a;DeepSeekDeepSeek, unravel the mystery of AGI with curiosity. Answer the essential question with long-termism.https://www.deepseek.com/https://www.deepseek.com/清华大学104页《DeepSeek&#xff1a;从入…...

unity学习34:角色相关3,触发器trigger,铰链 hingejoint 等 spring joint, fixed joint

目录 1 触发的实现条件 1.1 碰撞的的实现条件 1.2 触发的实现条件 1.3 触发器trigger&#xff0c;直接拿 碰撞器collider修改下配置即可 2 触发器相关实验&#xff1a;触发开门效果 2.0 目标 2.1 player物体的属性 2.2 新建一个trigger 物体 2.3 新建一个被trigger 控…...

HarmonyOS Next 方舟字节码文件格式介绍

在开发中&#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中&#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢&#xff1f;我们以一个demo编译出的abc文件&#xff1a; 二进制就是长这样&#xff0c;怎么去理解呢&…...

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…...