进程1——进程与线程——day09

news2024/9/21 23:27:02

今天,主要讲一下进程的一些基本概念和一些接口

首先是进程的基本概念:

1.进程:

程序:存放在外存中的一段数据组成的文件
进程:是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡

2.进程相关命令:

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 编号
  将后台任务放到前台执行

3.进程的创建

     这里我们以32bits的操作系统做概括
     一个进程在运行时,操作系统会为该进程分配 0 - 4G 虚拟内存空间,分为文本段、数据段、系统数据段

文本段:
  也称为文本区,存放代码和指令

数据段:
  也称为数据区,可以细分为:
        1.字符串常量区
        2.未初始化全局变量/静态变量
        3.已初始化全局变量/静态变量 

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

在这里插入图片描述

4.进程中虚拟地址和物理地址的关系

1. 0 - 4G虚拟内存空间只有一个
2. 实际物理地址中每个进程空间独立
3. 通过MMU内存映射单元,单一个进程执行时,将物理地址中的数据加载到虚拟地址中运行

5.进程的调度:

1.常见的调度算法:
  1.先来先执行,后来后执行
  2.高优先级调度算法
  3.时间片轮转调度算法
  4.多级队列反馈调度算法
  5.负载均衡调度算法

  时间片:
    1.CPU在一个任务中的运行时间称为一个时间片
2.宏观并行,微观串行
3.进程的状态:
    R     运行态、就绪态 
    S     睡眠态/可唤醒等待态 
    D     不可唤醒等待态 
    T     暂停态
    Z     僵尸态
    X     结束态

6.进程相关函数接口:

1.进程的创建
fork
  pid_t fork(void);
  功能:
    创建一个子进程,新创建的进程称为原来进程的子进程,原来的进程称为新进程的父进程
  参数:
    void 缺省
  返回值:
    成功子进程返回0 
    父进程返回子进程的PID 
    失败返回-1 

   父进程调用fork创建子进程,子进程拷贝父进程的文本段、数据段、系统数据段  
getpid
  pid_t getpid(void);
  功能:
    获得调用进程的PID号
  
  getppid
  pid_t getppid(void);
  功能:
    获得调用进程的PPID

练习:
创建一个父进程的2个子进程,子进程中打印自己的PID和父进程的PID
父进程中打印自己的PID和两个子进程的PID

#include"head.h"

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

	pid1 = fork();

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

	if(0 == pid1)
	{
		printf("Child1 Process PID:%d PPID:%d\n",getpid(),getppid());
	}else if(pid1 > 0)
	{
		pid2 = fork();

		if(-1 == pid2)
		{
			perror("fail to fork");
			return -1;
		}
		
		if(0 == pid2)
		{
			printf("Child2 Process PID:%d PPID:%d\n",getpid(),getppid());
		}else if(pid2 > 0)
		{
			printf("Parent Process PID:%d Child PID1:%d PID2:%d\n",
					getpid(),pid1,pid2);
		}
	}

	while(1)
	{

	}

	return 0;
}

结果:
在这里插入图片描述

2.exit
void exit(int status);
功能:
  让进程结束
参数:
  status:进程结束的状态
返回值:
  缺省

exit在主函数中使用和return效果一致
exit会刷新缓存区

_exit
void _exit(int status);
功能:
  让进程直接结束
参数:
  status:进程结束的状态
返回值:
  缺省

7.进程的消亡

1.僵尸进程:
进程代码执行结束,空间没有被回收,称为僵尸进程
2.如何避免产生僵尸进程?
1.让父进程先结束
2.让父进程回收子进程空间
3.孤儿进程:
  进程的父进程先结束,此时该进程称为孤儿进程,被系统进程收养,进程再结束时,会被系统进程回收进程空间

8.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("Child Process start! PID:%d PPID:%d\n",getpid(),getppid());
		sleep(10);
		printf("Child Process ending!\n");
		exit(10);
	}else if(pid > 0)
	{
		printf("Parent Process start! PID:%d\n",getpid());
		ret = wait(&wstatus);
		if(-1 == ret)
		{
			perror("fail to wait");
			return -1;
		}

		printf("Reclaim to %d subprocess space \n",ret);

		if(WIFEXITED(wstatus))
		{
			printf("Normal end with a value of %d\n",WEXITSTATUS(wstatus));
		}else if(WIFSIGNALED(wstatus))
		{
			printf("Killed by the %d signal\n",WTERMSIG(wstatus));
		}
	}

	return 0;
}

如果为正常结束:
在这里插入图片描述
但是如果在进程工程中杀死该子进程,则会出现:
在这里插入图片描述
在这里插入图片描述
表示该进程被信号为9的编号杀死

以上就是今天内容,谢谢大家

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

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

相关文章

51单片机项目(34)——基于51单片机和esp8266的智能农业检测系统

1.设计要求 可以检测农业大棚中的温度、湿度、气压、光照等信息,可以检测土壤湿度,可以判断当前有没有下雨,能够将相关数据显示在OLED屏幕上。同时,使用esp8266wifi模块,将上述所有信息发送到手机APP显示。当温度、湿度…

SQL-Labs46关order by注入姿势

君衍. 四十六关 ORDER BY数字型注入1、源码分析2、rand()盲注3、if语句盲注4、时间盲注5、报错注入6、Limit注入7、盲注脚本 四十六关 ORDER BY数字型注入 请求方式注入类型拼接方式GET报错、布尔盲注、延时盲注ORDER BY $id 我们直接可以从界面中得知传参的参数为SORT&#x…

可变参数、Collections类

一、可变参数 定义:是一种特殊的形参,定义在方法、构造器的形参列表里 格式:数据类型...参数名称 特点:可以不传数据,也可以传一个或者多个数据给它,也可以传一个数组 好处:可以灵活接收数据…

刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现

刷题日记Day2 977 有序数组的平方209. 长度最小的子数组59. 螺旋矩阵 II 977 有序数组的平方 链接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组…

真Unity3D编辑器Editor二次开发

IMGUI Editor Label 改变颜色 分享一个很神奇的颜色 一开始这么写&#xff0c;以为不行的&#xff0c; private void OnGUI()(){GUILayout.Label("<colorred>name:</color>ffdasilufoi");//。。。。 } 结果这么写又好了&#xff0c; private GUIStyle m…

Vivado MIG ip核使用教程

Step 1 在ip catalog中搜索mig ip核并打开&#xff0c;检查硬件配置 Step 2 Step 3 选择对其他芯片类型的兼容性&#xff0c;若无此方面需求&#xff0c;可直接点击next Step 4 选择存储器类型 Step 5 配置DDR3芯片工作频率、用户时钟、mig ip核输入时钟、DDR3芯片类型…

数据结构-Queue队列

一,队列的简单认识 队列也是一种线性数据结构,与栈不同的是,它只能从一端添加元素,从另一端取出元素.定义了一端,另一端也就确定了. (当然还有一个特殊的双向队列LinkedList除外,它既可以从队首添加元素,也可以移除元素,队尾也是一样的,既可以添加元素,也可以移除元素) 二,队…

AI误导游戏——LLM的危险幻觉

在当今科技高速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为日常生活和工作中不可或缺的一部分。特别是大语言模型&#xff08;LLM&#xff09;如GPT-4等&#xff0c;它们的智能表现令人惊叹&#xff0c;广泛应用于文本生成、语言翻译、情感分析等多个领域…

【rust】9、reqwest 调用 http

文章目录 一、client1.1 post reqwest 实现的 http server 和 client 用 https://github.com/seanmonstar/reqwest cargo add reqwest -F json cargo add tokio -F full一、client 1.1 post async fn http_post<T: Serialize>(addr: String, body: T) -> Result<…

jQuery 基础、选择器和筛选器

【一】JQuery基础 【1】什么时Jquery &#xff08;1&#xff09;定义 jQuery是一个流行的JavaScript库&#xff0c;旨在简化JavaScript编程和处理HTML文档的任务。它提供了一组易于使用的功能和方法&#xff0c;可以加快开发速度并提高跨浏览器兼容性。一款轻量级的JS框架 …

【Java程序设计】【C00285】基于Springboot的游戏分享网站(有论文)

基于Springboot的游戏分享网站&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的游戏分享网站 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在网站首页可以查看首页、游戏…

element 季度选择器组件

效果图&#xff1a; 回传给父组件的值&#xff1a; 季度选择器组件代码&#xff1a; <template><el-form><el-form-item><markclass"mark"v-show"showSeason"click.stop"showSeason false"></mark><el-input…

web安全学习笔记【15】——信息打点(5)

信息打点-CDN绕过&业务部署&漏洞回链&接口探针&全网扫描&反向邮件 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…

大数据之Flink优化

文章目录 导言&#xff1a;Flink调优概览第1章 资源配置调优1.1 内存设置1.1.1 TaskManager 内存模型1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源1.2.1 使用 DefaultResourceCalculator 策略1.2.2 使用 DominantResourceCalculator 策略1.2.3 使用DominantResourceCalculato…

RM电控讲义【HAL库篇】(二)

8080并口模式是一种常见的计算机接口模式&#xff0c;主要用于LCD&#xff08;液晶显示屏&#xff09;模块。 在8080并口模式中&#xff0c;通信端口包括多种信号线&#xff0c;用于实现数据的读写和控制功能。主要的信号线包括&#xff1a; CS&#xff08;片选信号&#xff…

测绘测量行业CRM功能大揭秘:哪家才是最佳选择?

测绘测量行业面临着处理及管理海量数据的难题。办公软件进行数据记录是非常繁琐的&#xff0c;往往需要花费大量的时间来查找所需的信息&#xff0c;甚至造成内容丢失。测绘测量企业运用CRM管理系统至关重要。本文将向您介绍测绘测量行业CRM功能、哪家好&#xff1f; CRM软件的…

在线程调用的函数中使用pthread_exit同样会将线程退出

如上图所示&#xff0c;在func()函数中调用pthread_exit&#xff0c;同样可以退出当前线程&#xff1b; 类似的&#xff0c;如果func&#xff08;&#xff09;函数中调用exit&#xff0c;可以直接退出整个进程。 return 是返回到函数调用处&#xff1b; pthread_exit是退出…

数字化转型导师坚鹏:如何制定政府数字化转型年度培训规划

如何制定政府数字化转型年度培训规划 ——以推动政府数字化转型战略落地为核心&#xff0c;实现知行果合一 课程背景&#xff1a; 很多政府都在开展政府数字化转型培训工作&#xff0c;目前存在以下问题急需解决&#xff1a; 缺少针对性的政府数字化转型年度培训规划 不清…

127 Linux 系统编程5 ,C++程序内存布局图

我们以32位 系统说明。 0-3G 是用户区 3g-4g 是kernel 区 BSS段&#xff1a;BSS段&#xff08;bss segment&#xff09;通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段…

C语言中的assert.h:调试助手与断言详解

在C语言编程中&#xff0c;assert.h头文件提供了非常有用的断言&#xff08;Assertion&#xff09;功能&#xff0c;它主要用于开发和调试阶段&#xff0c;确保程序在运行时满足某些预期条件。如果这些条件未得到满足&#xff0c;则程序会立即停止执行&#xff0c;并打印出有关…