一、进程的基本概念

在给进程下定义之前,我们先了解一下进程:

我们在编写完代码并运行起来时,在我们的磁盘中会形成一个可执行文件,当我们双击这个可执行文件时(程序时),这个程序会加载到内存中,而这个时候我们不能把它叫做程序了,应该叫做进程。所以说,只要把程序(运行起来)加载到内存中,就称之为进程。

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

二、进程描述—PCB

PCB:进程控制块(结构体)
当一个程序加载到内存中,操作系统要为刚刚加载到内存的程序创建一个结构体(PCB),进程信息被放在这个结构体中(PCB),可以理解为PCB是进程的属性的集合。

在Linux操作系统下的PCB是:task_struct
task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息
在进程执行时,任意时间内,进程对应的PCB都要以下内容:

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

优先级的理解:
由于CPU只要一个,进程可以有多个,所以CPU的资源有限,操作系统在调度进程到CPU时会根据进程的优先级来判断。
程序计数器的理解:
CPU跑一个进程时,要执行它的代码,而代码是自上往下执行的(if、else、循环等除外),CPU先要取指令,然后分析指令,再然后执行指令。取完一个指令后,CPU中的寄存器(EIP指令寄存器)会保存当前指令的下一条指令的地址,方便下次取下一个指令。
所谓的函数跳转、分支判断、循环等,都是修改EIP完成的。
上下文数据的理解:
CPU在跑一个进程时,没有跑完就开始切换其他进程,为了下次继续跑完这个进程,会保留这个进程的上下文数据,当这个进程回来时,会把上下文数据移动到CPU内部继续执行。

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

#include<stdio.h>
#include<unistd.h>
int main()
{while(1){printf("i am process...pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}
return 0;}           

通过ps aux | grep 文件名来找
其中getpid()是找进程的标示符,getppid()找父进程的标示符

四、通过系统调用创建进程——fork

fork函数可以创建一个子进程

#include<stdio.h>
#include<unistd.h>
int main()
{pid_t id=fork();//创建子进程while(1){if(id==0){printf("i am process...child---pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}else if(id>0){printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}else{;}}return 0;                                                                                  
}

我们可以得出:这段代码有两个进程,并且它们的关系是父子关系。

什么是fork函数:在调用fork函数之前,只有一个进程(父进程),当这个进程调用fork函数之后,fork函数会复制一个进程(子进程),区别是PID不同,它们的关系是父子关系。

fork函数会返回两次值:
——给父进程返回子进程的pid。
——给子进程返回0。
——失败时,在父进程中返回-1,不创建子进程,并且errno被适当地设置。

五、进程的状态

操作系统存在着五种状态模型:

  • 新建态:刚刚创建的进程,操作系统还没有把它加入可执行进程组中。
  • 就绪态:进程已经做好准备,只有有机会就会开始执行。
  • 运行态:该进程正在执行。
  • 阻塞态:进程在某些事件发生前不能执行,如I/O操作完成。
  • 退出态:操作系统从可执行进程组中释放出进程,或者自身停止,或者是因为某些原因被取消。

R 可执行状态

通过命令 ps aux 可以查看进程的状态

【注意】此可执行状态并非上面的运行态。
进程中的R状态不代表正在运行,代表的可被调度,此运行相当于上面的就绪态。

操作系统会把进程中R状态的进程全放在调度队列中,方便调度。

S 睡眠状态

(1)创建一个可执行态

#include<stdio.h>
#include<unistd.h>
int main() 
{while(1);return 0;
}

(2)创建休眠态进程

#include<stdio.h>
#include<unistd.h>
int main() 
{while(1)sleep(10);return 0;
}

S状态是浅度睡眠,随时可以被唤醒,也可以被杀掉。

D 磁盘休眠状态

可以表示为深度睡眠,该进程不会被杀掉,即使你是操作系统,除非我自动唤醒,才可以恢复。

这种状态(D)的进程杀不死。

T 暂停状态

向进程发送SIGSTOP信号,该进程会响应该信号进入暂停状态,
向该进程发送SIGCONT信号,该进程会从暂停状态恢复到可执行状态。

X 死亡状态 & Z 僵尸状态

僵尸状态:一个处于僵尸状态的进程,会等待它的父进程或操作系统对它的信息进行读取,之后才会被释放。

通过代码来模拟僵尸状态的进程:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int main()
{pid_t id=fork();int count=5;while(1){if(id==0){while(count){printf("i am process..child---.pid:%d,ppid:%d\n,count: %d",getpid(),getppi    d(),--count);sleep(1);}printf("child quit....\n");exit(1);}else if(id>0){printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}}return 0;}

 while :; do ps aux |head -1&&ps aux|grep a.out; echo "#######################";sleep 1;done 来监控进程的状态。

死亡状态:进程被操作系统释放了或者自己退出了

六、僵尸进程

当一个进程变为僵尸状态的时候,该进程就变成了僵尸进程。

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

僵尸进程的危害

七、孤儿进程

在Linux中,进程的关系主要是父子关系。

一对父子进程中的父进程退出了,子进程还在运行,就会形成孤儿进程。
如果没有进程来回收该子进程的信息,那么会变成僵尸状态,会存在内存泄漏的问题。

为了解决这个问题,该子进程会立即被1号init进程领养。

通过代码来模拟孤儿状态的进程

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>int main()
{pid_t id=fork();int count=5;while(1){if(id==0){while(1){printf("i am process..child---.pid:%d,ppid:%d\n,count: %d",getpid(),getppid(),--count);sleep(1);}printf("child quit....\n");exit(1);}else if(id>0){while(count){printf("i am process..father---pid:%d,ppid:%d\n",getpid(),getppid()); count--;sleep(1);}exit(0);}}return 0;}

用 while :; do ps axj |head -1 && ps axj | grep a.out;echo "#######################";sleep 1;done 来监控进程的状态。

观察子进程的PPID

通过查看该子进程的信息,可以得知该进程被1号init进程领养。

八、进程优先级

基本概念

CPU中的资源是有限的,不可能多个进程一起在CPU上运行,利用优先级把进程有效的先后排好,改善了系统的性能。

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)
  • 优先权高的有优先执行权。

查看进程优先级

用 ps -l 可以查看到进程的优先级

PRI:表示这个进程被执行的优先级,其值越小越早执行
NI:表示这个进程的nice值

PIR and NI

nice值表示进程可被执行的优先级的修正值。
PIR=PIR(old)+nice。
当nice为负值时,那么该进程的优先级值会变小,优先级会变高,进程越快被执行。

当然,nice也是有范围的,-20~19,一共40个级别。

用top命令更改已存在的进程的nice

top命令

接着按r然后输入进程的PID输入nice

其他

  • 竞争性:系统进程数目多,而CPU的资源有限,所以进程之间是具有竞争属性的。为了高效完成任务,更合理的竞争相关资源,便有了优先级
  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

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

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

相关文章

动手学深度学习6.3 填充和步幅-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;填充和步幅_哔哩哔哩_bilibili 代码实现_哔哩哔哩_bilibili 本节教材地址&#xff1a;6.3. 填充和…

如何在 Ubuntu 14.04 服务器上使用 Nginx 安装和保护 phpMyAdmin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 像 MySQL 这样的关系型数据库管理系统在许多网站和应用程序中都是必不可少的。然而&#xff0c;并非所有用户都习惯通过命令行来管…

oracle数据库,怎么分页查询

项目场景&#xff1a; 使用oracle数据库&#xff0c;怎么分页查询 问题描述 平常使用的最多的是MySQL DB, 用的是 limit 语句&#xff1b;Oracle DB, 没有 limit 语句&#xff1b; 原因分析&#xff1a; 解决方案&#xff1a; SELECT * FROM (SELECT t.*, ROWNUM rn FROM…

java算法day16

java算法day16 112 路径总和404 左叶子之和513 找树左下角的值 112 路径总和 题型判定为自顶向下类型&#xff0c;并且为路径和类型。 那就套模板。 自顶向下就是从上到下处理&#xff0c;那么就是前序遍历的思想。 class Solution {boolean res false;public boolean hasP…

自建Web网站部署——案例分析

作者主页: 知孤云出岫 目录 作者主页:如何自建一个Web网站一、引言二、需求分析三、技术选型四、开发步骤1. 项目初始化初始化前端初始化后端 2. 前端开发目录结构示例代码App.jsHome.js 3. 后端开发目录结构示例代码app.jsproductRoutes.jsProduct.js 4. 前后端连接安装axio…

泛微e-cology WorkflowServiceXml SQL注入漏洞(POC)

漏洞描述&#xff1a; 泛微 e-cology 是泛微公司开发的协同管理应用平台。泛微 e-cology v10.64.1的/services/接口默认对内网暴露&#xff0c;用于服务调用&#xff0c;未经身份认证的攻击者可向 /services/WorkflowServiceXml 接口发送恶意的SOAP请求进行SQL注入&#xff0c;…

语音合成新篇章:Transformer模型的革新应用

语音合成新篇章&#xff1a;Transformer模型的革新应用 语音合成技术&#xff0c;又称文本到语音&#xff08;Text-to-Speech, TTS&#xff09;技术&#xff0c;一直是人工智能领域的重要组成部分。随着深度学习技术的飞速发展&#xff0c;Transformer模型凭借其卓越的处理序列…

飘雪的冬天,命运的交织

北风呼啸,天空中飘着鹅毛般的大雪,这又是一个飘雪的冬天。京都医院洁白的病床上躺着一个年轻女孩,她的脸上没有一丝血色,眼睛深深地凹了进去,看上去已经病入膏肓。病房的窗口边,一位身心俱疲的年轻男孩,望着病房外满天飞舞的雪花,思绪不由回到了三年前的林州市…… 一…

使用JS和CSS制作的小案例(day二)

一、写在开头 本项目是从github上摘取&#xff0c;自己练习使用后分享&#xff0c;方便登录github的小伙伴可以看本篇文章 50项目50天​编辑https://github.com/bradtraversy/50projects50dayshttps://github.com/bradtraversy/50projects50days有兴趣的小伙伴可以自己去gith…

面向对象七大原则

学习目标 了解面向对象七大原则基本概念。 在之后实践应用中&#xff0c;要给予七大原则去设计程序。 为什么有七大原则 七大原则总体要实现的目标是&#xff1a; 高内聚、低耦合。 使程序模块的可重复性、移植性增强。 高内聚低耦合 从类角度来看&#xff0c;高内聚低…

如何在Linux上部署Ruby on Rails应用程序

在Linux上部署Ruby on Rails应用程序是一个相对复杂的过程&#xff0c;需要按照一系列步骤进行。下面是一个基本的部署过程&#xff0c;涵盖了从安装所需软件到部署应用程序的所有步骤。 安装必要的软件 在部署Ruby on Rails应用程序之前&#xff0c;需要确保Linux系统上安装了…

android 嵌套webview,软键盘遮挡输入框

实际项目中&#xff0c;android需要加载h5&#xff0c;经常遇到软键盘遮盖输入框的情况&#xff0c;h5测试的时候&#xff0c;是没问题的&#xff0c;但是在APP中是不能把页面推上去。经测试完美解决了这个问题。 1. oncreate *************************** try {web();layout…

掌握Xcode Storyboard:iOS UI设计的可视化之旅

掌握Xcode Storyboard&#xff1a;iOS UI设计的可视化之旅 在iOS应用程序开发的世界中&#xff0c;用户界面&#xff08;UI&#xff09;设计是吸引用户的关键。Xcode的Storyboard功能为开发者提供了一个强大的可视化工具&#xff0c;通过拖放的方式快速构建和管理UI。本文将深…

AI网络爬虫023:用deepseek批量提取天工AI的智能体数据

文章目录 一、介绍二、输入内容三、输出内容一、介绍 天工AI的智能体首页: F12查看真实网址和响应数据: 翻页规律: https://work.tiangong.cn/agents_api/square/sq_list_by_category?category_id=7&offset=0 https://work.tiangong.cn/agents_api/square/sq_list_b…

08 模型演化根本 深度学习推荐算法的五大范式

易经》“九三&#xff1a;君于终日乾乾&#xff1b;夕惕若&#xff0c;厉无咎”。九三是指阳爻在卦中处于第三位&#xff0c;已经到达中位&#xff0c;惕龙指这个阶段逐渐理性&#xff0c;德才已经显现&#xff0c;会引人注目&#xff1b;但要反思自己的不足&#xff0c;努力不…

基于 SSH 的任务调度系统的设计与实现

点击下载源码 基于SSH的任务调度系统的设计与实现 摘 要 随着科学技术的飞速发展和各行各业的分工愈发明细化&#xff0c;对于改革传统的人工任务调度方式的呼声越来越大。得益于快速发展的计算机技术&#xff0c;我们看到了改革的方向。本系统是针对企业或者事业单位甚至一个…

Golang | Leetcode Golang题解之第234题回文链表

题目&#xff1a; 题解&#xff1a; func reverseList(head *ListNode) *ListNode {var prev, cur *ListNode nil, headfor cur ! nil {nextTmp : cur.Nextcur.Next prevprev curcur nextTmp}return prev }func endOfFirstHalf(head *ListNode) *ListNode {fast : headslo…

camtasia怎么剪掉不用的部分 屏幕录制的视频怎么裁剪上下不要的部分 camtasia studio怎么裁剪视频时长 camtasia怎么剪辑视频教程

有时我们录制的屏幕内容&#xff0c;并不一定全部需要。那么&#xff0c;屏幕录制的视频怎么裁剪上下不要的部分&#xff1f;可以使用视频剪辑软件&#xff0c;或者微课制作工具来进行裁剪。屏幕录制的视频怎么旋转&#xff1f;录制视频的旋转也是一样的&#xff0c;均在编辑步…

万字长文之分库分表里如何优化分页查询?【后端面试题 | 中间件 | 数据库 | MySQL | 分库分表 | 分页查询】

分库分表的一般做法 一般会使用三种算法&#xff1a; 哈希分库分表&#xff1a;根据分库分表键算出一个哈希值&#xff0c;根据这个哈希值选择一个数据库。最常见的就是数字类型的字段作为分库分表键&#xff0c;然后取余。比如在订单表里&#xff0c;可以按照买家的ID除以8的…

【Flutter】 webview_flutter避坑

webview_flutter webview_flutter没有SSL Error接口&#xff0c;也就是说等你的网页出现SSL 错误的时候这个插件无法捕捉处理&#xff0c;除非你改它的源码。 下面这段是webview_flutter官网的例子&#xff0c;它有onHttpError、onWebResourceError、但没有任何捕捉 SSL 错误…