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

进程

进程

  • 进程
    • 进程的含义
    • PCB块
    • 内存空间
    • 进程分类:
    • 进程的作用
    • 进程的状态进程已经准备好执行,所有的资源都已分配,只等待CPU时间
      • 进程的调度
    • 进程相关命6.查询进程相关命令
      • 1.ps aux
      • 2.top
      • 3.kill和killall发送一个信号
    • 函数
      • 1.fork();
      • 2.getpid
      • 3.getppid
      • 示例代码
      • 应用场合:
      • 父子进程关系
    • 进程的终止
    • 进程的退出
      • 1.exit
      • 2._exit
      • 3.atexit
    • 进程空间的回收
      • wait
      • waitpid
      • exec
    • system

进程

进程的含义

进程是一个程序执行的过程(也可以说是正在运行的程序),会去分配内存资源,cpu的调度,它是并发的

PCB块

PCB是一个结构体,全名是process control block/print circuit board;
一个程序运行就有一块pcb块,它记录着运行程序的所有信息和状态
pcb里包含着:
PID—进程标识符
chdir—当前工作路径
umask 0002
fds—进程打开的文件列表
signal—信号相关设置 处理异步io:
用户id,组id:
进程资源的上限(ulimit -a,显示资源上限);
进程和程序的区别
程序是静态
存储在硬盘中代码,数据的集合;
进程是动态
程序执行的过程,包括进程的创建、调度、消亡;
(1)程序是永存,进程是暂时的
(2)进程有程序状态的变化,程序没有
(3)进程可以并发,程序无并发
(4)进程与进程会存在竞争计算机的资源
(5)一个程序可以运行多次,变成多个进程;一个进程可以运行一个或多个程序

内存空间

32位内存空间分布图:
在这里插入图片描述
虚拟地址空间共4G:0~ 3G,是进程的空间,3G~4G是内核的空间
虚拟地址 :
映射表将虚拟内存的地址转换为物理内存的地址;
映射表通常由页表(Page Table)组成,它记录了虚拟地址到物理地址的映射关系;
一个页面大小通常为4k(4036字节);

进程分类:

1、交互式进程
2、批处理进程 (shell脚本)
3、 守护进程

进程的作用

并发性:允许多个进程同时运行,提高了CPU利用率和系统响应速度;
稳定性:如果一个进程发生错误,通常不会影响到其他进程,这提高了系统的稳定性;

进程的状态进程已经准备好执行,所有的资源都已分配,只等待CPU时间

基本操作系统三个操作状态:就绪→执行态→阻塞(等待,睡眠);
就绪状态:进程已经准备好执行,所有的资源都已分配,只等待CPU时间
执行
linux中的状态:运行态,睡眠态,僵尸,暂停态;
进程状态及转换关系

进程的调度

调度器的通过调度策略来决定哪个进程先运行;
进程上下文切换:就是值指调度器要切换CPU给另一个进程的时候,要保存当前进程的状态,然后加载打开一个新的进程这样的一个过程。
宏观并行:在一个时间段多个任务和进程是同时进行的
微观串行:在一个时间点只能一条一条指令执行

进程相关命6.查询进程相关命令

1.ps aux

查看进程相关信息:
就绪态、运行态 —— R
睡眠态、等待态
可唤醒等待态 ——S
不可唤醒等待态 ——D
停止态 ——T
僵尸态 ——Z

2.top

根据CPU占用率查看进程相关信息
PR NI 表示优先级
数字越小代表优先级越高

3.kill和killall发送一个信号

kill -2 PID 15
发送信号+PID对应的进程,默认接收者关闭

killall -9 进程名
发送信号 进程名对应的所有进程
killall a.out

函数

1.fork();

函数原型

pid_t fork()

一次调用,会返回两次。
子进程先运行和是父进程先进程,顺序不确定。
变量不共享。
子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
功能
通过该函数可以从当前进程中克隆一个同名新进程。
克隆的进程称为子进程,原有的进程称为 父进程。
子进程是父进程的完全拷贝。
子进程的执行过程是从fork函数之后执行。
子进程与父进程具有相同的代码逻辑。
返回值
int 类型的数字。
在父进程中:成功 返回值是子进程的pid号 >0
失败 返回-1;
在子进程中:成功 返回值 0
失败 无
举例问题:

一次fork生成几个进程?他们之间的关系是什么样的?
一次fork生成两个进程,父子关系。

如果两次fork同时前后执行,会生成几个进程?他们之间的关系如何表示,有多少个子进程,有没有孙进程?
会生成三个进程,父进程,子进程和孙进程。

2.getpid

函数原型

pid_t getpid(void);

功能:
获得调用该函数进程的pid
参数:
缺省
返回值:
进程的pid

3.getppid

函数原型

pid_t getppid(void);

功能:
获得调用该函数进程的父进程pid号
参数:
缺省
返回值:
返回父进程id号

示例代码

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <unistd.h>
int a = 20;
int main(int argc, char *argv[])
{pid_t ret = fork();if(ret>0){//fathersleep(3);printf("father is %d   pid %d ,ppid:%d  \n",a,getpid(),getppid());}else if(0 == ret){//childprintf("child a is %d\n",a);a+=10;printf("child a is %d pid:%d ppid:%d\n",a,getpid(),getppid());}else {perror("fork error\n");return 1;}printf("a is %d pid:%d\n",a,getpid());return 0;
}

应用场合:

1)一个进程希望复制自己,使父子进程同时执行同的代码段。网络服务中会比较多见。
2)一个进程需要执行一个不同的程序。fork+exec

父子进程关系

子进程是父进程的副本,子进程获得父进程数据段,堆、栈正文段共享;
区别:
fork的返回值 父的是大于0,子是等于0;
pid不同 子相对于父至少要加个1;

进程的终止

8种情况
1)main 中return
2)exit(), c库函数,会执行io库的清理工作,关闭所有 的流,以及所有打开的文件。已经清理函数(atexit)。
3)_exit,_Exit 会关闭所有的已经打开的文件,不执行清理函数。
4) 主线程退出
5)主线程调用pthread_exit 异常终止
6)abort() 越界报错
7)signal kill pid
8)最后一个线程被pthread_cancle

进程的退出

僵尸进程和孤儿进程
僵尸进程:进程执行结束但空间未被回收变成僵尸进程(pcb不释放会导致内存越来越小导致内存崩溃);
孤儿进程:父进程先消亡

1.exit

属于库函数
退出状态,终止的进程会通知父进程,自己使如何终止的。如果是正常结束(终止),则由exit传入的参数。如果是异常终止,则有内核通知异常终止原因的状态。任何情况下,负进程都能使用wait,waitpid获得这个状态,以及资源的回收。
函数原型

void exit(int status)
调用: 
exit(1);

功能:
让进程退出,并刷新缓存区
参数
status:进程退出的状态
返回值:
缺省
EXIT_SUCCESS 0
EXIT_FAILURE 1
相当于return
但当该关键字出现在main函数中时候可以结束进程
如果在其他函数中则表示结束该函函数;
示例代码

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{    FILE* fp = fopen("1.txt","w");char buf[512]="hello,123";fputs(buf,fp);exit(0);printf("aaaaaaaaaaa\n");return 0;
}

2._exit

属于系统调用
函数原型

void _exit(int status);

功能:
让进程退出,不刷新缓存区
参数:
status:进程退出状态
返回值:
缺省;
示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{FILE* fp = fopen("1.txt","w");char buf[512]="hello,123";fputs(buf,fp);_exit(0);// 不会刷新缓冲区  printf("aaaaaaaaaaa\n");return 0;
}

3.atexit

回调函数
函数原型

int atexit(void (*function)(void));

功能:
注册进程退出前执行的函数
参数:
function:函数指针
指向void返回值void参数的函数指针
返回值:
成功返回0
失败返回非0
当程序调用exit或者由main函数执行return时,所有用atexit
注册的退出函数,将会由注册时顺序倒序被调用
示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
char * p ; 
void clean(void)
{printf("clean func,p %s\n",p);free(p);
}
int main(int argc, char *argv[])
{atexit(clean);p = (char*)malloc(50);strcpy(p,"hello")printf("main p %s\n",p);exit(0);return 0;
}

进程空间的回收

wait/waitpid

wait

函数原型

pid_t wait(int *status);

功能
该函数可以阻塞等待任意子进程退出并回收该进程的状态。
一般用于父进程回收子进程状态。

参数
status 进程退出时候的状态:
如果不关心其退出状态一般用NULL表示;
如果要回收进程退出状态,则用WEXITSTATUS回收。

返回值
成功 回收的子进程pid
失败 -1;
WIFEXITED(status) 是不是正常结束
WEXITSTATUS(status) 使用这个宏去那返回值
WIFSIGNALED(status) 是不是收到了信号而终止的
WTERMSIG(status)如果是信号终止的,那么是几号信号。
注意wait
1)如果所有的子进程都在运行,在阻塞
2)如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,立刻返回。
3)如果没有子进程,则立即出错退出。

waitpid(-1,status,0)=wait(status);

waitpid

函数原型

pid_t waitpid(pid_t pid, int *status, int options);

pid
小于-1 回收指定进程组内的任意子进程;
等于-1 回收任意子进程,组内外;
等于0 回收和当前调用waitpid一个组的所有子进程,组内;
大于0 回收指定ID的子进程;
waitpid (-1,a,0) == wait(a);

status
子进程退出时候的状态,
如果不关注退出状态用NULL;

options 选项
0 表示回收过程会阻塞等待
WNOHANG 表示非阻塞模式回收资源。
返回值:成功 返回接收资源的子进程pid
失败 -1
0,

exec

execute
exec族

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建; 新进程,所以调用exec前后该进程的id并未改变。

其实有六种以exec开头的函数,统称exec函数:
函数原型

#include <unistd.h>
int execl(const char *path, const char *arg, ...);
int execv(const char *path, char *const argv[]);int execle(const char *path, const char *arg, ..., char *const envp[]);
int execle(const char *path, const char *arg, ..., char *const envp[]);int execve(const char*path,char*const argv[],char*const evnp[]);
int execlp(const char *file, const char *arg, ...);int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

区别
1)前4个使用路径名作为参数,后面两个使用文件名做参数
当filename中,含有/时视为路径名,否则就按PATH变量,在指定目录下查找可执行文件。
2)相关的参数表传递,l表示list,v表示vector;
execl,execlp,execle,需要将参数一个一个列出,并以NULL结尾。
execv,execvp,execve,需要构造一个参数指针数组,然后将数组的地址传入。
3)以e结尾的函数,可以传入一个指向环境字符串的指针数组的指针。其他未指定环境变量,使用父进程继承过来的。
execve 是真正的系统调用
这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回,如果调用出错;则返回-1,所以exec函数只有出错的返回值而没有成功的返回值。

system

函数原型

int system(const char *command); fork+exec 

功能
使用该函数可以将shell命令直接在代码中执行。
参数
command要执行的shell命令
返回值
成功 0
失败 -1

相关文章:

进程

进程 进程进程的含义PCB块内存空间进程分类&#xff1a;进程的作用进程的状态进程已经准备好执行&#xff0c;所有的资源都已分配&#xff0c;只等待CPU时间进程的调度 进程相关命6.查询进程相关命令1.ps aux2.top3.kill和killall发送一个信号 函数1.fork();2.getpid3.getppid示…...

10款好用的电脑监控软件推荐丨2024年干货整理,赶紧码住!

选择合适的电脑监控软件可以帮助企业和个人更好地管理和保护其计算机资源。以下是10款较为好用的电脑监控软件推荐。 1. 安企神 7天试用体验https://work.weixin.qq.com/ca/cawcde06a33907e60a 简介&#xff1a;安企神是一款专为企业设计的信息安全管理软件&#xff0c;提供…...

【MySQL-24】万字全面解析<索引>——【介绍&语法&性能分析&使用规则】

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…...

刷题记录(2)

1. HWOD机试 - 模拟消息队列(100) package com.yue.test;import org.junit.Test;import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List;/*** Author: 夜雨* Date: 2021-12-08-10:31* Description:* Version 1.0*/ public…...

JVM中的GC过程

堆内存结构&#xff1a;在详细讨论GC过程之前&#xff0c;需要了解JVM堆内存的结构。JVM堆内存通常被分为新生代&#xff08;Young Generation&#xff09;和老年代&#xff08;Old Generation&#xff09;&#xff0c;其中新生代又进一步细分为Eden区&#xff08;Eden Space&a…...

Python实战项目:天气数据爬取+数据可视化(完整代码)_python爬虫实战

一、选题的背景 随着人们对天气的关注逐渐增加&#xff0c;天气预报数据的获取与可视化成为了当今的热门话题&#xff0c;天气预报我们每天都会关注&#xff0c;天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…...

FFmpeg源码:compute_frame_duration函数分析

一、compute_frame_duration函数的定义 compute_frame_duration函数定义在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0.1&#xff09;的源文件libavformat/demux.c中&#xff1a; /*** Return the frame duration in seconds. Return 0 if not available.*/ stat…...

ARM 异常处理(21)

异常的流程&#xff1a; 首先&#xff1a; 在硬件上阶段&#xff1a; 这里是4大步3小步 然后是 异常处理&#xff1a; 这里主要是保存现场&#xff0c;进行异常处理 然后是 异常返回&#xff1a; 主要指 恢复现场&#xff0c; 再跳转回去。 首先硬件上&#xff…...

我开源了我的新闻网站项目

&#x1f389; 前言 暑假时写了一个Web项目&#xff0c;感觉做的还是有模有样的&#xff0c;不仅做了前端&#xff0c;还加了后端并连了数据库。最近也是将它开源了&#xff0c;一来是为了熟悉一下Github流程和Git使用命令&#xff0c;二来也是想和大家分享一下自己的成果&…...

LlamaIndex 使用 RouterOutputAgentWorkflow

LlamaIndex 中提供了一个 RouterOutputAgentWorkflow 功能&#xff0c;可以集成多个 QueryTool&#xff0c;根据用户的输入判断使用那个 QueryEngine&#xff0c;在做查询的时候&#xff0c;可以从不同的数据源进行查询&#xff0c;例如确定的数据从数据库查询&#xff0c;如果…...

设计模式学习-责任链模式

概念 使多个对象都有机会处理请求&#xff0c;从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有对象处理它为止. 代码编写 using UnityEngine; using System.Collections; public class ChainOfResp…...

【全网最全】2024年数学建模国赛B题31页完整建模过程+成品论文+matlab/python代码等(后续会更新

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 2024数学建模国赛B题 【全网最全】2024年数学建模国赛B题31页完整建模过程成品论文matlab/python代码等&#xff08;后续会更新「首先来看看目前已有的资料…...

第二十一届华为杯数学建模经验分享之资料分享篇

今天给大家分享一些数学建模的资料&#xff0c;通过这些资料的学习相信你们一定在比赛中获得好的成绩。今天分享的资料包括美赛和国赛的优秀论文集、研赛的优秀论文集、推荐数学建模的相关书籍、智能算法的学习PPT、python机器学习的书籍和数学建模经验分享与总结&#xff0c;其…...

使用 OpenSSL 创建自签名证书

mkdir -p /etc/nginx/conf.d/cert #2、创建私钥 openssl genrsa -des3 -out https.key 1024 提示输入字符&#xff1a; 输入字符&#xff1a;rancher [rootocean-app-1a-01 cert]# openssl genrsa -des3 -out https.key 1024 Generating RSA private key, 1024 bit long modulu…...

EmguCV学习笔记 VB.Net 9.1 VideoCapture类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…...

Rspack 1.0 发布了!

文章来源&#xff5c;Rspack Team 项目地址&#xff5c;https://github.com/web-infra-dev/rspack Rspack 是基于 Rust 编写的下一代 JavaScript 打包工具&#xff0c; 兼容 webpack 的 API 和生态&#xff0c;并提供 10 倍于 webpack 的构建性能。 在 18 个月前&#xff0c;我…...

【全网最全】2024年数学建模国赛E题超详细保奖思路+可视化图表+成品论文+matlab/python代码等(后续会更新

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年数学建模国赛E题成品论文超详细保奖思路可视化图表matlab/python代码等&#xff08;后续会更新「首先来看看目前已有的资料&#xff0c;还…...

数智转型,看JNPF如何成为企业的必备工具

随着数字化转型的浪潮席卷全球&#xff0c;企业面临着前所未有的挑战与机遇。在这一过程中&#xff0c;低代码开发平台作为一种创新的软件开发方式&#xff0c;正逐渐成为企业实现快速迭代和敏捷开发的关键工具。JNPF作为一款领先的低代码开发平台&#xff0c;凭借其强大的功能…...

ArcGIS Pro 发布松散型切片

使用ArcGIS Pro发布松散型切片问题&#xff0c;有时候会出现切片方案写了松散型&#xff0c;但是自动切片完成后依然是紧凑型的问题&#xff0c;这时候可以采用手动修改然后再切片的方式。 1. 发布切片服务 选择手动切片方式 2. 手动修改服务的切片方案文件 修改cache服务…...

奖项再+1!通义灵码智能编码助手通过可信 AI 智能编码工具评估,获当前最高等级

阿里云的通义灵码智能编码助手参与中国信通院组织的可信AI智能编码工具首轮评估&#xff0c;最终获得 4 级评级&#xff0c;成为国内首批通过该项评估并获得当前最高评级的企业之一。 此次评估以《智能化软件工程技术和应用要求 第 2 部分&#xff1a;智能开发能力》为依据&…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...