Day 1.进程的基本概念、相关命令、函数结口

news2024/11/19 4:26:18

进程基本概念

一、进程:

程序:存放在外存中的一段数据组成的文件

进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡

二、进程相关的命令

1.top

动态查看当前系统中所有的进程信息(根据CPU占用率排序)

  PID:唯一识别进程的ID号(>0)

  优先级:linux系统中数据低,优先级高(-20~19) Windows系统和中数值越高,优先级越高

  进程状态:

  R   运形态/就绪态

  S   睡眠态/可唤醒等待态

  D   不可唤醒等待态

  T   暂停态

  Z   僵尸态

  X   结束态

q退出查看进程

2.nice

以指定优先级开运行进程

示例:

  nice -n 优先级 要执行的集成任务

  renice:重新设定一个正在运行的进程的优先级

  示例:

    renice -n 优先级 进程PID

3.kill

杀死指定进程任务

示例:

  kill -9 进程PID

  killall

  杀死名对应的所有进程任务

  示例:

    killall -9 进程名

4.ps -ef

查看当前时刻所有的进程信息

PPID:父进程ID号

示例:
  ps -ef | grep a.out

5.pstree

查看进程树关系

6.ps -aux

查看当前时刻的进程信息

7../a.out &

就是将a.out任务放在后台执行

8.jobs

查看一个终端下后台执行的所有任务

9.fg

将后台任务放到前台执行

示例:

  fg 编号

三、进程的创建

32bits操作系统下

一个进程在运行时,操作系统会将进程分分配为0-4G虚拟内存空间分为文本段、数据段、系统数据段。

  文本段:

    也被称呼为文本区,存放代码和指令

  数据段:

    也称为数据区、可以细分为:

1)字符串常量区

2)为初始化的全局变量/静态变量

3)已初始化的全局白能量/静态变量

  系统数据段:包含堆区和栈区

四、进程中虚拟地址和物理地址大的关系 

1.0-4G虚拟内存空间只有一个

2.实际物理地址中每个进程空独立

3.通过MMU内存映射单元,单一个进程执行时,将物理地址之中的数据加载到虚拟地址中运行

五、进程的调度

1.常见的的调度算法

1)先来先执行,后来后执行

2)高优先级调度算法

3)时间片轮转调度算法

4)多级队列反馈调度算法

5)负载均衡调度算法

  时间片:CPU在一个任务中的运行时间称为一个时间片

2.宏观并行,微观串行

3.进程状态:

  R        运行态(CPU正在执行)、就绪态(等待调度)

  S         睡眠态/可唤醒等状态

  D         不可唤醒等待态(不能被打断/切换的任务)

  T          暂停态(程序运行在此停住,需手动执行)

  Z          僵尸态(代码已经结束,空间未回收)

  X          结束态(代码结束,空间回收)

六、进程相关的函数接口

1.进程的创建:fork

功能:

创建一个子进程,新创建按的进程被称为原来进程的子进程,原来的的进程被称为新进程的父进程

参数:void

返回值:

成功子进程返回0

父进程返回子进程的PID

失败返回-1

解释:父进程调用fork创建子进程,子进程拷贝父进程文本段、数据段、系统数据段

getpid (当前进程)

pid_t getpid(void);

功能:获得调用进程的PID号

getppid (父进程)

pid_t getppid(void);

功能:获得调用进程的PPID

#include "head.h"


int main(void)
{
	pid_t pid;
	pid = fork();

	if (pid == -1)
	{
		perror("fail to fork");
		return -1;
	}
	if (pid == 0)
	{
		printf("子进程 PID=%d,PPID=%d\n",getpid(),getppid());
	}else if (pid > 0)
	{
		printf("父进程 PID=%d,chinl PID=%d\n",getpid(),pid);
	}
	printf("hello world\n");

	while(1)
	{

	}

	return 0;
}
练习:

创建一个父进程的两个子进程,自进程中打印自己的PID和父进程的PID;父进程中打印自己的PID和两个子进程的PID

#include "head.h"

int main(void)
{
	pid_t pid1;
	pid_t pid2;
	pid1 = fork();

	if (pid1 == -1)
	{
		perror("fail to fork");
		return -1;
	}

	if (pid1 == 0)
	{
		printf("子进程1  PID=%d PPID=%d\n",getpid(),getppid());
	}else if (pid1 > 0)
	{
		pid2 = fork();
		if (pid2 == -1)
		{
			perror("fail to fork");
			return -1;
		}

		if (pid2 == 0)
		{
			printf("子进程2  PID1=%d PPID=%d\n",getpid(),getppid());
		}else if (pid2 > 0)
		{
			printf("父进程  PID=%d chinl PID1=%d chinl PID2=%d\n",getpid(),pid1,pid2);
		}
	}


	while(1)
	{

	}

	return 0;
}
linux@ubuntu:~/c/软件编程/进程$ ./a.out
父进程  PID=26204 chinl PID1=26205 chinl PID2=26206
子进程1  PID=26205 PPID=26204
子进程2  PID1=26206 PPID=26204
判断:打印出来Num的值
#include "head.h"

int main(void)
{
	pid_t pid;
	int Num = 0;

	pid = fork();
	if (-1 == pid)
	{
		perror("fail to fork");
		return -1;
	}
	if (0 == pid)
	{
		Num = 100;
	}
	else if (pid > 0)
	{
		sleep(5);
		printf("Num = %d\n", Num);
	}

	return 0;
}
判断:打印数组中的元素
#include "head.h"

char tmpbuff[1024] = {0};

int main(void)
{
	pid_t pid;

	pid = fork();
	if (-1 == pid)
	{
		perror("fail to fork");
		return -1;
	}
	if (0 == pid)
	{
		strcpy(tmpbuff, "hello world");	
	}
	else if (pid > 0)
	{
		sleep(5);
		printf("tmpbuff = %s\n", tmpbuff);
	}

	return 0;
}

结果:都打印不出来

解释:当执行到fork,创建出子进程,此时子进程将父进程的所有的文本段、数据段、系统数据段全部拷贝过来,此时两个进程的实际物理空间独立,所以互不影响。

2.结束进程:exit

void exit(int status);

功能:

让进程结束

参数:

status:进程结束的参数

返回值:缺省

    exit在主函数中使用和return效果一致

    exit会刷新缓存区

_exit

void _exit(int status);

功能:

  让进程直接结束 但是不会刷新缓存区

参数:

  status:进程结束的状态

返回值:缺省

#include "head.h"

void Fun(void)
{
	exit(0);
}

int main(void)
{
	printf("hello world");
	Fun();
	printf("how are you");

	return 0;
}
linux@ubuntu:~/c/软件编程/进程$ ./a.out
hello worllinux@ubuntu:~/c/软件编程/进程$ 

3.回收进程空间:wait

pid_t wait(int *wstatus);

功能:

  回收子进程空间

参数:

wstatus:存放子进程结束状态空间的首地址

返回值:

  成功返回回收到的子进程PID

  失败返回-1 

1)wait函数具有阻塞功能

2)wait函数具有同步功能

  WIFEXITED(wstatus)
  进程是否正常退出 

  WEXITSTATUS(wstatus)
  进程结束状态值

  WIFSIGNALED(wstatus)
  进程是否被信号杀死

  WTERMSIG(wstatus)
  获得杀死进程的信号编号

#include "head.h"

int main(void)
{
	pid_t pid;
	pid_t ret;
	int wstatus;

	pid = fork();
	if (-1 == pid)
	{
		perror("fail to fork");
		return -1;
	}
	if (0 == pid)
	{
		printf("子进程开始执行: PID:%d PPID:%d\n", getpid(), getppid());
		printf("子进程即将结束!\n");
		sleep(10);
		exit(10);
	}
	else if (pid > 0)
	{
		printf("父进程开始执行: PID:%d\n", getpid());
		ret = wait(&wstatus);
		if (-1 == ret)
		{
			perror("fail to wait");
			return -1;
		}
		
		printf("回收到 %d 子进程空间\n", ret);
	
		if (WIFEXITED(wstatus))
		{
			printf("正常结束,值为 %d\n", WEXITSTATUS(wstatus));
		}
		else if (WIFSIGNALED(wstatus))
		{
			printf("被 %d 号信号杀死\n", WTERMSIG(wstatus));
		}
	}

	return 0;
}
linux@ubuntu:~/c/软件编程/进程$ ./a.out
父进程开始执行: PID:26557
子进程开始执行: PID:26558 PPID:26557
子进程即将结束!
回收到 26558 子进程空间
正常结束,值为 10

七、进程的消亡

1.僵尸态:

进程代码结束,空间 没有被回收,称为僵尸进程

2.如何避免产生僵尸进程?

1)让父进程先结束

2)让父进程回收子进程空间

3.孤儿进程:

  进程的父进程先结束,此时该进程成为孤儿进程,被系统进程收养,进程在结束时,会被系统进程回收进程空间

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

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

相关文章

基于PostGIS的慢查询引起的空间索引提升实践

目录 前言 一、问题定位 1、前端接口定位 2、后台应用定位 3、找到问题所在 二、空间索引优化 1、数据库查询 2、创建空间索引 3、geography索引 4、再看前端响应 总结 前言 这是一个真实的案例,也是一个新入门的工程师很容易忽略的点。往往在设计数据库的…

项目管理:如何成功完成一个项目

项目管理是一项重要的技能,它可以帮助你成功地完成一个项目。以下是一些关键的步骤,可以帮助你实现这一目标: 1. 明确项目目标:在开始项目之前,你需要明确项目的目标。这将有助于你制定一个明确的计划,并确…

最长公共前缀【简单】

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例如下&#xff1a; 所给提示如下&#xff1a; 1 < strs.length < 2000 < strs[i].length < 200strs[i] 仅由小写英文字母组成 解题 根据…

iOS面试:4.多线程GCD

一、多线程基础知识 1.1 什么是进程&#xff1f; 进程是指在系统中正在运行的一个应用程序。对于电脑而已&#xff0c;你打开一个软件&#xff0c;就相当于开启了一个进程。对于手机而已&#xff0c;你打开了一个APP&#xff0c;就相当于开启了一个进程。 1.2 什么是线程&am…

反序列化字符串逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 $_SESSION是访客与整个网站交互过程中一直存在的公有变量 然后看extract()函数的功能&#xff1a; extract($_POST)就是将post的内容作为这个函数的参数。 extract() 函数从数组中将变量导入到当前的符号表(本题的作用是将_SESSION的两个函数变为post传参) function…

MySql-DQL-条件查询

目录 条件查询修改数据 查询 姓名 为 Name10 的员工查询 id小于等于5 的员工信息查询 没有分配职位 的员工信息查询 有职位 的员工信息查询 密码不等于 password1 的员工信息查询 入职日期 在 2000-01-01 (包含) 到 2010-01-01(包含) 之间的员工信息查询 入职时间 在 2000-01-0…

linux之权限管理(实施必会!!!!)

文章目录 一、什么是ACL二、操作步骤2.1. 添加测试目录&#xff0c;用户&#xff0c;组&#xff0c;并将用户添加到组2.2.查看组是否正常建立 cat /etc/group2.3设定权限2.4此时需要为临时用户进行权限&#xff1a; r-x 三、ACL中mask修改最大权限四、ACL权限的删除五、ACL权限…

pclpy KD-Tree K近邻搜索

pclpy KD-Tree K近邻搜索 一、算法原理1.KD-Tree 介绍2.原理 二、代码三、结果1.原点云2.k近邻点搜索后的点云 四、相关数据 一、算法原理 1.KD-Tree 介绍 kd 树或 k 维树是计算机科学中使用的一种数据结构&#xff0c;用于在具有 k 维的空间中组织一定数量的点。它是一个二叉…

MybatisPlus--03--IService、ServiceImpl

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. IService接口1.1 IService、ServiceImpl 接口的使用第一步&#xff1a;实现basemapper接口第二步&#xff1a;编写service类第三步&#xff1a;编写serviceImpl第…

【统计分析数学模型】判别分析(三):Bayes判别法

【统计分析数学模型】判别分析&#xff08;三&#xff09;&#xff1a;Bayes判别法 一、Bayes判别法二、R语言实现Bayes判别法1. 运行NaiveBayes()函数2. 绘制密度曲线3. 计算回判正确率 一、Bayes判别法 Bayes判别法假定对研究对象有一定的认识&#xff0c;这种认识用先验概率…

政安晨:【示例演绎机器学习】(四)—— 神经网络的标量回归问题示例 (价格预测)

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让小伙伴们一起学习、交流进步&#xff0c;不论是学业还是工…

高并发系统实战课个人总结(极客时间)

高并发系统实战课 场景 读多写少 我会以占比最高的“读多写少”系统带你入门&#xff0c;梳理和改造用户中心项目。这类系统的优化工作会聚焦于如何通过缓存分担数据库查询压力&#xff0c;所以我们的学习重点就是做好缓存&#xff0c;包括但不限于数据梳理、做数据缓存、加缓…

FairyGUI × Cocos Creator 3.x 场景切换

前言 前文提要&#xff1a; FariyGUI Cocos Creator 入门 FairyGUI Cocos Creator 3.x 使用方式 个人demo&#xff1a;https://gitcode.net/qq_36286039/fgui_cocos_demo_dust 个人demo可能会更新其他代码&#xff0c;还请读者阅读本文内容&#xff0c;自行理解并实现。 官…

云HIS系统源码,基于云计算技术的B/S架构的云HIS系统,二甲医院信息管理系统

云HIS系统源码&#xff0c;采用云端SaaS服务的方式提供 基于云计算技术的B/S架构的云HIS系统&#xff0c;采用云端SaaS服务的方式提供&#xff0c;使用用户通过浏览器即能访问&#xff0c;无需关注系统的部署、维护、升级等问题&#xff0c;系统充分考虑了模板化、配置化、智能…

邮件发送/接收过程分析、常见邮箱sport/dport列举、检测规则开发思路分析

一、邮件发送和接收过程分析 &#xff08;转载自&#xff1a;邮件的发送和接收过程——STMP、POP、IMAP、MIME_当收件人接收电子邮件时自己的邮件服务器通过什么收文件-CSDN博客&#xff09; 电子邮件发送协议 是一种基于“ 推 ”的协议&#xff0c;主要包括 SMTP &#xff1…

博客 cn 站搭建 v3 v3.1

1. 架构设计 v3.1 版本 2. v2.x 存在的痛点 在v2.x版本中&#xff0c;围绕 服务器 遇到了两个主要的问题&#xff1a; 服务器成本高&#xff1a;博客以静态页面为主&#xff0c;理论上可以实现无服务器部署&#xff0c;但是为了防止恶意攻击&#xff0c;不得不使用服务器进…

RT-Thread-快速入门-3-内存管理

内存管理 定义与作用 内存池管理 基础定义 内存池是一种管理固定大小内存块的机制&#xff0c;主要用于减少碎片化&#xff0c;提高内存分配效率。在 RT-Thread 中&#xff0c;内存池允许用户预分配一定数量的具有相同大小的内存块&#xff0c;应用程序可以从中快速分配和释放内…

【电子书】人工智能

资料 wx&#xff1a;1945423050&#xff0c;备注来源和目的 个人整理了一些互联网电子书 人工智能 Julia机器学习核心编程&#xff1a;人人可用的高性能科学计算.epubKeras深度学习实战.epubMATLAB图像与视频处理实用案例详解.epubMATLAB金融算法分析实战&#xff1a;基于机器…

Android 开发一个耳返程序(录音,实时播放)

本文目录 点击直达 Android 开发一个耳返程序程序编写1. 配置 AndroidManifast.xml2.编写耳返管理器3. 录音权限申请4. 使用注意 最后我还有一句话要说怕相思&#xff0c;已相思&#xff0c;轮到相思没处辞&#xff0c;眉间露一丝 Android 开发一个耳返程序 耳返程序是声音录入…

开源分子对接程序rDock的安装及使用流程

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 前言 本文介绍开源分子对接程序rDock在Linux Ubuntu 22.04系统上的conda安装、编译安装过程及程序使用流程。 一、rDock是什么&#xff1f; rDock来源 rDock是一个快速、多功能的开源对接程序&#xff0c;可用…