进程(详解)

进程

  • 进程
    • PCB
    • 进程的定义
    • 进程的组成
    • 进程模式
    • 进程的状态
    • 进程的运行
    • 进程的创建
    • 进程的结束
      • 孤儿进程
      • 僵尸进程
      • 僵尸进程的危害
  • 进程的创建
    • pid
    • fork
    • wait
      • 案例

进程

PCB

从操作系统理解进程概念-------先描述,后组织
为了使参与并发执行的程序能独立的运行,必须为之配置一个专门的数据结构-----task_struct,称为进程控制块(PCB)。进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程(也就是组织)进程。
相应地,由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)。所谓创建进程,实质上是创建进程映像中的PCB;而撤销进程,实质上是撤销进程的PCB。值得注意的是,进程映像是静态的,进程则是动态的。

进程的定义

进程的定义:一个运行中的程序
例如:
源程序文件 ----> 可执行文件

狭义定义:进程就是一段程序的执行过程。
 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元

内存最小的单位:bit(位)
内存最小的管理单位:字节

进程的组成

进程由三部分组成,代码段,数据段,堆栈段
也就是程序,数据,进程控制块
数据:全局变量,静态变量(已初始化,未初始化),只读变量,局部变量

代码:进程的源代码
堆栈:变量,手动内存分配(malloc new)

进程模式

程序在运行的时候,一般为2种模式

1.内核模式:内核上的程序
2.用户模式:用户自己写的程序,应用程序正常运行

进程的状态

用来显示进程信息可以用
top命令,或者 ps -aut
pstree 进程数命令

进程的状态:
1.R(running) : 运行态
2.S(sleep):睡眠态
3.
4.
5.
6.
7.

进程的运行

1.手动运行,命令以及执行可执行程序
2. 调读
nice , renice: 控制进程是否让步
kill
crontab
bg

进程的创建

  1. system:在程序中执行命令
  2. fork, vfork : 创建子进程
  3. exe

进程的结束

1.自然结束
2.被动结束:
os 结束 被内核进程结束
被本进程或者其他进程干掉

孤儿进程

父进程结束,子进程还在运行的子进程被称为孤儿进程。
一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为1)所收养,并由
init 进程对它们完成状态收集工作

僵尸进程

一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。

3.提防僵尸进程产生(占用的资源不会被释放掉)
首先你要理解,进程本身占用的资源以及进程运行时占用的资源

进程运行时占用的资源:会释放
进程本身占用的资源:不会被释放

僵尸进程产生的原因:
子进程结束了,父进程没有回收它的资源
(也就是父进程先于子进程结束,没有回收子进程的资源)

怎么防止僵尸进程
1.父进程结束前,子进程结束,父进程回收子进程的资源
2.父进程结束后,子进程被父进程的父进程收养,爷爷进程回收子进程的资源。

僵尸进程的危害

僵尸进程虽然不占有任何内存空间,但如果父进程不调用 wait() / waitpid() 的话,那么保留的信息就不会释放,其进程号就会一直被占用,而系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程,此即为僵尸进程的危害

进程的创建

在Linux中,所有的进程都可以看做是init()进程的子进程,孙子进程,重孙进程等。

pid

,每个进程在系统中都有一个唯一·的非负整数表示的进程ID,用getpid() 获取进程pid, getppid(), 获取当前进程的父进程的pid
每一个进程都有对应的目录在/proc目录下

用kill()函数
在这里插入图片描述
注意:
kill函数的第一个参数是pid_t的数据类型
pid_t 实际上是一个int类型

fork

在这里插入图片描述

没有参数,有一个返回值
fork: 用克隆的方式,创建一个进程,创建成功,返回这个进程的id

克隆:全盘复制,包括这个进程的上下全文
子进程拷贝了父进程的上下文

进程的上下文:进程运行这个位置的地方(数据,时间,状态)
fork实际上,创建的是子进程

调用fork的进程, 是父进程
fork创建的进程, 是子进程

wait

在这里插入图片描述

wait()函数,是用来防止僵尸进程,
作用:让父进程结束的在子进程之后,如果父进程结束的早,用了wait(),可以起到延迟效果,等子进程结束,父进程才结束

注意:这里有个waitpid()函数,
可以指定进程

案例

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{if(fork()){printf("father = %d\n ", getpid());}else{for(int i = 0; i < 3; i++){printf("son = %d\n ", getpid());}}printf("end = %d\n", getpid());return 0;
}

在这里插入图片描述

由运行结果可知,
father 为父进程
son为子进程
end 都被执行了2次
因为用了fork函数之后,
子进程被创建,子进程拷贝的父进程的上下文(fork函数的原理)
注意:这里是父进程先结束,子进程的资源没有被回收,造成的僵尸进程

用wait()函数,避免僵尸进程

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>int main()
{if(fork()){printf("father = %d\n ", getpid());wait(0); //避免僵尸进程的出现}else{for(int i = 0; i < 3; i++){printf("son = %d\n ", getpid());}}printf("end = %d\n", getpid());return 0;
}

在这里插入图片描述

这里就是子进程比父进程先结束

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

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

相关文章

H5游戏源码分享-接苹果游戏拼手速

H5游戏源码分享-接苹果游戏拼手速 看看在20秒内能接多少个苹果 <html> <head><title>我是你的小苹果</title><meta charset"utf-8"/><meta name"viewport" content"initial-scale1, user-scalableno, minimum-scale…

【ARM 嵌入式 C 入门及渐进 10 -- 冒泡排序 选择排序 插入排序 快速排序 归并排序 堆排序 比较介绍】

文章目录 排序算法小结排序算法C实现 排序算法小结 C语言中常用的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。下面我们来一一介绍&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;&#xff1a;冒泡排序是通过比较相邻元素的大小进行排…

本机spark 通idea连接Oracle的坑

1. 报错&#xff1a;Exception in thread "main" java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)V 查询网上资料&#xff0c;是idea引入的scala运行环境版本与idea默认的scala版本不一样 也就是写的项目中的pom的spark版本与idea默认的版本不…

【设计模式】第4节:创建型模式之“单例模式”

一、介绍 采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法。 不使用单例模式的UML类图&#xff1a; 使用单例模式的UML类图&#xff1a; 使用场景&#xff1a; 需要频繁创建或销毁的对象…

H5游戏分享-烟花效果

<!DOCTYPE html> <html dir"ltr" lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width" /> <title>点击夜空欣赏烟花</title> <sc…

Zabbix监控oxidized备份状态

Zabbix监控oxidized备份状态 原理是利用oxidized的hooks功能调用zabbix_sender推送数据给zabbix_server 参考 https://cloud.tencent.com/developer/article/1657025 https://github.com/clontarfx/zabbix-template-oxidized https://github.com/ytti/oxidized/blob/master/…

Python 日期和时间处理教程:datetime 模块的使用

Python 中的日期不是独立的数据类型&#xff0c;但我们可以导入一个名为 datetime 的模块来使用日期作为日期对象。 示例&#xff1a;导入 datetime 模块并显示当前日期&#xff1a; import datetimex datetime.datetime.now() print(x)日期输出 当我们执行上面示例中的代码…

如何确保PCIe Gen3通道的信号质量

PCIe 3.0设计面对的挑战 PCIe由PCI-SIG协会研发和维护的一个高速标准接口&#xff0c;PCIe3.0是其开发的第三代接口高速差分接口&#xff0c;其单个差分对信号速率可到达8.0Gbps&#xff0c;目前其以广泛的应用于计算机服务器等设备领域。 下图显示的是一个典型的PCIe Gen3的…

天气数据可视化平台-计算机毕业设计vue

天气变幻无常&#xff0c;影响着我们生活的方方面面&#xff0c;应用天气预报信息可以及时了解天气的趋势&#xff0c;给人们的工作、生活等带来便利&#xff0c;也可以为我们为未来的事情做安排和打算&#xff0c;所以一个精准的、易读 通过利用 程序对气象网站大量的气象信息…

ArcGIS笔记13_利用ArcGIS制作岸线与水深地形数据?建立水动力模型之前的数据收集与处理?

本文目录 前言Step 1 岸线数据Step 2 水深地形数据Step 3 其他数据及资料 前言 在利用MIKE建立水动力模型&#xff08;详见【MIKE水动力笔记】系列&#xff09;之前&#xff0c;需要收集、处理和制作诸多数据和资料&#xff0c;主要有岸线数据、水深地形数据、开边界潮位驱动数…

【C++】STL容器——探究不同 [ 迭代器 ] 种类&在STL中的使用方式(15)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 引言&#xff1a;一.查看STL使用文档时…

Java-API简析_java.io.FilterOutputStream类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/134106510 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

【蓝桥每日一题]-前缀和与差分(保姆级教程 篇3)#涂国旗 #重新排序

目录 题目&#xff1a;涂国旗 思路&#xff1a; 题目&#xff1a;重新排序 思路&#xff1a; 题目&#xff1a;涂国旗 思路&#xff1a; 乍一看好像没啥思路&#xff0c;但是我们需要涂最少的格子&#xff0c;所以要都尝试一下才行&#xff0c;也就是从上面开始白至少一行&am…

selenium测试框架快速搭建(ui自动化测试)

一、介绍 selenium目前主流的web自动化测试框架&#xff1b;支持多种编程语言Java、pythan、go、js等&#xff1b;selenium 提供一系列的api 供我们使用&#xff0c;因此在web测试时我们要点页面中的某一个按钮&#xff0c;那么我们只需要获取页面&#xff0c;然后根据id或者n…

【DevChat】智能编程助手 - 使用评测

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

如何监听/抓取两个设备/芯片之间“UART串口”通信数据--监视TXD和RXD

案例背景&#xff1a;全网仅此一篇&#xff01;&#xff01;&#xff01; 两个设备/芯片之间采用UART串口通信。我们如何实现芯片1 TXD – > 芯片2 RXD&#xff0c;芯片2 TXD --> 芯片1 RXD两个单线链路上的数据抓取和监听&#xff1f;这篇博客将告诉您。 目录 1 什么是…

Mybatis延迟加载(缓存)

延迟加载 分步查询的优点&#xff1a;可以实现延迟加载&#xff0c;但是必须在核心配置文件中设置全局配置信息&#xff1a;lazyLoadingEnabled&#xff1a;延迟加载的全局开关。当开启时&#xff0c;所有关联对象都会延迟加载 aggressiveLazyLoading&#xff1a;当开启时&…

VSCode编写Unity代码自动补全配置

1.下载并安装.NET 7.0&#xff08;C#插件需要&#xff09;和.NET Framework 4.7.1&#xff08;Unity需要&#xff09; .NET 7.0下载链接&#xff1a;https://dotnet.microsoft.com/en-us/download .NET Framework 4.7.1下载链接&#xff1a;https://dotnet.microsoft.com/en-…

灯光布置和场景模拟软件:Set A Light 3D Studio

Set A Light 3D Studio是一款专业的灯光模拟软件&#xff0c;旨在帮助摄影师和电影制片人在电脑上进行虚拟灯光布置和场景模拟&#xff0c;以实现更加精准和高质量的拍摄效果。该软件提供了丰富的灯光和场景模型&#xff0c;支持灵活调整光源位置、强度、颜色和效果等参数&…

数据类型与运算符-java

数据类型与运算符 1、变量和类型 1.1、整形变量 基本语法格式&#xff1a; int 变量名 初始值;代码示例&#xff1a; int num 10 //定义一个整型变量 System.out.println(num);注意&#xff1a; 1&#xff09;java中&#xff0c;一个int变量占4个字节&#xff0c;和操作…