进程(详解)

news2024/11/23 14:21:30

进程

  • 进程
    • 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.coloradmin.cn/o/1145166.html

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

相关文章

经常遇到的问题

一个前端经常会遇到的问题 例如&#xff0c;我想要在一个项目里&#xff0c;监听所有的fetch请求&#xff0c;应该怎么办&#xff1f;又或者说&#xff0c;我想用别人封装好的方法&#xff0c;但是在它之前&#xff0c;需要经过一层处理、判断&#xff0c;然后再看情况是否调用…

如何隐藏woocommerce 后台header,woocommerce-layout__header

如何隐藏woocommerce 后台header&#xff0c;woocommerce-layout__header WooCommerce |Products Store Activity| Inbox| Orders| Stock| Reviews| Notices| breadcrumbs 在 functions.php 里添加如下代码即可&#xff1a; // Disable WooCommerce Header in WordPress Admi…

开启CETOS 裸奔了一年的服务器开启firewall防火墙

记录一下关于firewall&#xff0c;博主非运维专家或服务器专家。 背景 客户有一台裸奔运行了一年多的系统有公网但发现没有开防火墙&#xff0c;iptables和firewall均是关闭状态&#xff0c;通过扫描发现很多漏洞。根据客户要求对端口进行重新梳理且关闭不必要或有潜在风险的…

kubeadmin部署k8s1.27.4

kubeadmin部署k8s1.27.4 环境介绍 IP主机名资源配置系统版本192.168.117.170k8s-master2c2g200gCentos7.9192.168.117.171k8s-node12c2g200gCentos7.9192.168.117.172k8s-node22c2g200gCentos7.9 编辑本地解析且修改主机名 三台主机都要做 vim /etc/hosts配置主机名 mast…

软考系列(系统架构师)- 2013年系统架构师软考案例分析考点

试题一 软件架构&#xff08;根据描述填表、ESB 定义和功能&#xff09; 【问题1】&#xff08;10分&#xff09; 服务建模是对Ramp Coordination信息系统进行集成的首要工作&#xff0c;公司的架构师首先对Ramp Coordination信息系统进行服务建模&#xff0c;识别出系统中的两…

lesson2(补充)关于>>运算符和<<运算符重载

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; cout和cin我们在使用时需要包含iostream头文件&#xff0c;我们可以知道的是cout是写在ostream类里的&#xff0c;cin是写在istream类里的&#xff0c;他们都是定义出的对象&#xff0c;而<< 和 >…

猴子吃桃问题--C语言

问题描述&#xff1a; 猴子第1天摘下若干个桃子&#xff0c;当即吃了一半&#xff0c;还不过瘾&#xff0c;又多吃了一个。第2天早 上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天 早上想再吃时&#xff0c;就只剩一…

【AD9361 数字接口CMOS LVDSSPI】B 并行数据之CMOS 续

续【AD9361 数字接口CMOS &LVDS&SPI】B 并行数据之CMOS 数据总线空闲和周转周期 &#xff08;CMOS&#xff09; P0_D[11&#xff1a;0]和P1_D[11&#xff1a;0]总线信号通常由BBP或AD9361有源驱动。在任何空闲期间&#xff0c;两个组件都会忽略数据总线值。但是&…

抢占式调度是如何发生的

最常见的现象就是一个进程执行时间太长了&#xff0c;是时候切换到另一个进程了。那怎么衡量一个进程的运行时间呢&#xff1f;在计算机里面有一个时钟&#xff0c;会过一段时间触发一次时钟中断&#xff0c;通知操作系统&#xff0c;时间又过去一个时钟周期&#xff0c;这是个…

039-第三代软件开发-PDF阅读器

第三代软件开发-PDF阅读器 文章目录 第三代软件开发-PDF阅读器项目介绍PDF阅读器1 初始化PDF view2 qml 中使用3 创建模块 关键字&#xff1a; Qt、 Qml、 pdf、 LTDev、 本地 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Met…

NNDL:作业五

习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢. 证明&#xff1a; 激活函数以sigmoid为例。 神经元&#xff1a;有两层&#xff0c;线性层和激活层&#xff1a;yw*xb,然后y‘sigmoid(y)&#xff0c;也就是。 梯度…

[C++]——带你学习类和对象

类和对象——上 目录&#xff1a;一、面向过程和面向对象二、类的概念三、类的访问限定符和封装3.1 访问限定符3.2 封装 四、类的作用域五、类的实例化六、类的对象大小的计算七、类成员函数this指针7.1 this指针的引用7.2 this 指针的特性 目录&#xff1a; 类和对象是很重要…

Vue3问题:如何实现密码加密登录?前后端!

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约3400字&#xff0c;整篇阅读大约需要6分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

Python--练习:报数字(数7)

案例&#xff1a; 一些同学从1开始报数&#xff0c;当需要报出的数字尾数是7或者该数字是7的倍数时&#xff0c;则该同学跳过这个数字&#xff0c;不进行报数。所有同学都参与游戏后&#xff0c;游戏结束。如输入学生数量为50&#xff0c;游戏结束后&#xff0c;报数的同学数量…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)

由于之前哔站作者整理的LUNA16数据处理方式过于的繁琐&#xff0c;于是&#xff0c;本文就对LUNA16数据做一个新的整理&#xff0c;最终得到的数据和形式是差不多的。但是&#xff0c;主要不同的是代码逻辑比较的简单&#xff0c;便于理解。 对于数据集的学习&#xff0c;可以…

pg 数据库,在新增的数据的时候,根据字段唯一性去更新数据

目录 1 问题2 实现 1 问题 在使用pg 数据库的时候&#xff0c;我们新增数据&#xff0c;希望如果有几个字段和数据库的一样&#xff0c;那么就更新数据&#xff0c;也就是在新增的时候&#xff0c;自动判断是否数据库有这个数据&#xff0c;有就更新&#xff0c;没有就新增 2…

StripedFly恶意软件框架感染了100万台Windows和Linux主机

导语 近日&#xff0c;一款名为StripedFly的恶意软件框架在网络安全研究人员的监视之外悄然感染了超过100万台Windows和Linux系统。这款跨平台的恶意软件平台在过去的五年中一直未被察觉。在去年&#xff0c;卡巴斯基实验室发现了这个恶意框架的真实本质&#xff0c;并发现其活…

网络流学习笔记

网络流基础 基本概念 源点&#xff08;source&#xff09; s s s&#xff0c;汇点 t t t。 容量&#xff1a;约等于边权。不存在的边流量可视为 0 0 0。 ( u , v ) (u,v) (u,v) 的流量通常记为 c ( u , v ) c(u,v) c(u,v)&#xff08;capacity&#xff09;。 流&#xff…

SDK 控件

目录 控件 控件创建 控件的消息处理 总代码 本篇文章对控件的学习&#xff0c;只是对基础的部分&#xff0c;简单的使用&#xff0c;包括消息的处理上&#xff0c;并不涉及深入的内容。 控件 区分控件&#xff0c;资源&#xff1a; SDK通常提供了一系列常用的用户界面控件…

san.js源码解读之模版解析(parseTemplate)篇——readIdent函数

一、源码分析 /*** 读取ident* 这里的 ident 指标识符(identifier)&#xff0c;也就是通常意义上的变量名* 这里默认的变量名规则为&#xff1a;由美元符号($)、数字、字母或者下划线(_)构成的字符串** inner* param {Walker} walker 源码读取对象* return {string}*/ functio…