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

进程基本概念

一、进程:

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

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

二、进程相关的命令

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://xiahunao.cn/news/2804376.html

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

相关文章

Nginx网络服务二-----(虚拟机和location)

一、HTTP设置 1.设置虚拟主机 1.1Nginx 基于域名---虚拟主机 include /apps/nginx/conf.d/*.conf; 1.2Nginx 基于端口---虚拟主机 在做了域名的基础上,按照以下步骤继续 1.3Nginx 基于IP---虚拟主机 2.server下的root root路径格式 指定文件的路径 url …

Visual Paradigm 工具使用思考

大型项目的管理与实施,需要有高效的管理工具,VP算是不错的,美中不足是界面太死板,使用不便利,对于小型项目按照这个模式来,相当麻烦。 当然肯定会有人觉得不错,需要的,联系我

面试经典150题 -- 二叉树 (总结)

总的地址 : 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台 104 . 二叉树的最大深度 104 . 二叉树的最大深度 递归 : 直接用递归访问 , 访问左孩子 和 右孩子 , 如果 存在 , 深度就1 &…

vue-router 三级路由,路由跳转页面异常白屏或404,或刷新三级路由页面后一级和二级路由菜单丢失

问题描述 情况1. vue-router 定义三级路由,路由跳转了,页面404或者白屏情况2. 点击菜单三级路由后,刷新页面后一级和二级路由菜单丢失 解决方案: 某些时候是因为二级和三级的路由共用router-view,可以使用router-vi…

基于springboot+vue的大创管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【Android 性能优化:内存篇】——ExoPlayer 释放后内存没有恢复问题探索

背景 最近笔者承接项目的内存优化指标,在内存调研的过程中发现项目中视频播放结束后,内存没有恢复到播放前到水平。项目中用的 EXO 版本为2.19.1,并且笔者自己也写了个简单的 Demo,发现也是如此。虽然有一些偏门方法可以优化&…

阶段四python编程第四章循环

一级目录循环的基本使用 循环的作用:让指定的代码重复执行 while循环最常用的应用场景就是让执行的代码按照指定的次数重复执行 while基本语法: 如果要输出的是100个hello world,该怎么做? 死循环: 程序应该避免出现死循环 whi…

nginx 具体介绍

一,nginx 介绍 (一)nginx 与apache 1, Apache event 模型 相对于 prefork 模式 可以同时处理更多的请求 相对于 worker 模式 解决了keepalive场景下,长期被占用的线程的资源浪费问题 因为有监听线程&#…

stm32——hal库学习笔记(IIC)

一、IIC总线协议介绍(掌握) 二、AT24C02介绍(了解) 三、AT24C02读写时序(掌握) 四、AT24C02驱动步骤(掌握) 五、编程实战(掌握) myiic.c #include "./B…

C++ 基础算法 双指针 数组元素的目标和

给定两个升序排序的有序数组 A 和 B ,以及一个目标值 x 。 数组下标从 0 开始。 请你求出满足 A[i]B[j]x 的数对 (i,j) 。 数据保证有唯一解。 输入格式 第一行包含三个整数 n,m,x ,分别表示 A 的长度,B 的长度以及目标值 x 。 第二行包…

在UE5中制作UI环形进度条

在日常开发中,经常会有环形进度条UI的效果,例如技能CD时间、加载动画等,本文将通过材质球节点实现该效果,相较于准备美术素材,这样的做法更为方便,效果如下: 1.制作环状效果材质函数 在内容面…

Vue3 + Ts (使用lodash)

安装 npm i --save lodash使用 import _ from lodash⚠️报警告:!!! 此时还需要安装ts声明文件库 npm install types/lodash -D安装之后重启Vscode还是会提示上面的警告,此时还需在tsconfig.ts里面配置 {"c…

Leetcode 209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输入&…

城市白模:裸眼3D下的未来都市构想

随着科技的飞速发展,城市规划与建设已经迈入了一个全新的时代。在这个时代里,“城市白模”成为了设计师、建筑师、城市规划者乃至普通市民的热门话题。那么,什么是“城市白模”?它又如何改变我们对城市的认知与期待呢?…

后端程序员入门react笔记(四)-综合运用,写一个小demo

样式模块化 有时候我们会遇到这样的问题,有两个css对一个class声明了样式,这样的话后引入的css会覆盖前面的css样式,导致样式冲突,那么我们怎么解决这种问题呢,我们可以使用样式的模块化,我们起名一个inde…

百度百科词条在网络推广中的六大作用

也许很多网友都发现了,在网上查资料,百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台,另一方面就是因为百科信息权威,网友认可度高。所以企业开展网络营销,百科营销是一块重要阵地。 也有的企业认为百科…

笔试题讲解(C语言进阶)

目录 前言 1、题目 2、答案 3、解析 结语 前言 “纸上得来终觉浅&#xff0c;绝知此事要躬行”。本篇通过对指针实际案例的分析&#xff0c;由浅入深&#xff0c;来加强我们对指针的理解。 1、题目 这是一道难题&#xff0c;小心哦。 #include <stdio.h> int main(…

数字化转型导师坚鹏:政府数字化转型社会管理类案例研究

政府数字化转型社会管理类案例研究 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚直辖市政府数字化转型的社会管理类成功案例 不清楚地级市政府数字化转型的社会管理类成功案例 不清楚县区级政府数字化转型的社会管理类成功案例 课程特色&#x…

【LeetCode每日一题】 单调栈的案例84 柱状图中最大的矩形

84 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释…

实验室预约|实验室预约小程序|基于微信小程序的实验室预约管理系统设计与实现(源码+数据库+文档)

实验室预约小程序目录 目录 基于微信小程序的实验室预约管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;管理员登录 &#xff08;2&#xff09;实验室管理 &#xff08;3&#xff09;公告信息…