Linux 基础入门操作-实验七 进程的介绍
实验七 进程的介绍
7.1 进程基础概念
Linux进程在内存中包含三部分数据:码段、堆栈段和数据段。代码段存放了程序的代码。代码段可以为机器中运行同一程序的数个进程共享。堆栈段存放的是子程序的返回地址、子程序的参数及程序的局部变量。而数据段则存放程序的全局变量、常数以及动态数据分配的数据空间,如用malloc函数申请的内存。与代码段不同,如果系统中同时运行多个相同的程序,它们不能使用同一堆栈段和数据段。
Linux进程主要有如下几种状态:
1用户状态:用户状态下运行的状态;
2内核状态:进程在内核状态下运行的状态;
3内存中就绪:进程没有执行,但处于就绪状态,只要内核调度它,就可以执行;
4内存中睡眠:进程正在睡眠并且处于内存中,没有被交换到SWAP设备:
5就绪且换出:进程处于就绪状态,但是必须把它换入内存,内核才能再次调度它进行运行:
6睡眠且换出:进程正在睡眠,且被换出内存,
7被抢先:进程从内核状态返回用户状态时,内核抢先于它,做了上下文切换,调度了另一个进程,原先这个进程就处于被抢先状态;
8创建状态:进程刚被创建,该进程存在,但既不是就绪状态,也不是睡眠状态,这个状态是除了进程0以外的所有进程的最初状态;
9僵死状态:进程调用exit结束,进程不再存在,但在进程表项中仍有记录,该记录可由父进程收集。
Linux进程状态从创建到消亡的整个过程:
1进程被父进程通过系统调用fork创建而处于创建态
2 fork调用为子进程配置好内核数据结构和子进程私有数据结构后,子进程进入就绪态,或者在内存中就绪,或者因为内存不够而在SWAP设备中就绪。
3若进程在内存中就绪,进程可以被内核调度程序调度到CPU运行。
4内核调度该进程进入内核状态,再由内核状态返回用户状态执行。该进程在用户状态运行一定时间后又会被调度程序所调度而进入内核状态,由此转入就绪态。有时进程在用户状态运行时,也会因为需要内核服务,使用系统调用而进入内核状态,服务完毕,会由内核状态转回用户状态。要注意的是进程在从内核状态向用户状态返回时可能被抢占,这是由于有优先级更高的进程急需使用CPU,不能等到下一次调度时机,从而造成抢占。
5进程执行exit调用,进入僵死状态,最终结束。
进程的作用
进程是操作系统管理计算机资源的基本单位之一,它在多任务处理和资源管理中扮演着重要角色。进程解决了以下几个关键问题:
- 资源管理
进程帮助操作系统有效管理计算机的硬件资源(如CPU、内存、I/O设备等),确保不同进程之间的资源分配合理。通过进程,操作系统能够监控和分配资源,防止资源的浪费和冲突。 - 并发执行
进程允许多个程序同时运行,提高了系统的效率和利用率。在多核CPU和多线程环境下,操作系统能够通过进程管理来实现真正的并行处理,从而加快计算速度。 - 隔离性和安全性
进程提供了隔离性,使得一个进程的执行不会直接影响其他进程。每个进程都有独立的地址空间,这样可以防止一个进程错误或恶意操作对其他进程造成影响,提高了系统的安全性和稳定性。 - 异常处理
进程可以通过独立的执行环境来处理错误和异常情况。当一个进程发生错误时,操作系统可以通过终止该进程而不影响其他进程的运行,提升了系统的容错能力。 - 上下文切换
进程允许操作系统进行上下文切换,使得CPU可以在多个进程之间快速切换,给用户提供“同时执行”的感觉。操作系统通过调度算法来决定哪个进程在何时获得CPU的控制权,从而实现高效的资源利用。 - 状态管理
进程具有不同的状态(如就绪、运行、等待、终止),操作系统通过管理这些状态来跟踪进程的生命周期,使得对进程的管理和调度更加灵活高效。 - 通信与协作
进程间可以通过各种机制(如管道、消息队列、共享内存等)进行通信和协作,从而实现复杂的计算任务。通过这种进程间通信(IPC),多个进程可以共享数据和协调工作。 - 简化应用程序设计
通过使用进程,开发者可以将复杂的应用程序划分为多个模块,每个模块可以在一个独立的进程中运行,简化了应用程序的设计和维护。 - 多用户支持
操作系统通过进程来支持多用户环境,每个用户可以在自己的进程中运行应用程序,确保各个用户之间的操作不会相互干
7.2 常见的API函数
所在头<unistd.h>
7.2.1 fork系统调用
#include <unistd.h>
pid_t fork(void)
pid_t是用来保存进程PID信息的结构体,当调用执行成功时候,该调用对父进程返回子进程的PID,对子进程返回0,调用失败返回-1,子进程没有创建。
7.2.2 wait函数调用
当子进程由于父进程退出时候,如果父进程没有调用wait函数,子进程就会陷入僵尸的状态,如果父进程调用wait函数,就不会使子进程变为僵尸进程,wait函数声明如下:
pid_t wait ( int *statloc)
wait函数使父进程暂时停止执行,直到他的一个子进程结束为止,该函数返回值是终止运行的PID,参数statloc所指向的变量存放在子进程的退出码。
7.3 运行案例
#include <sys/types.h>//该头文件提供系统调用的标志
#include <sys/stat.h> //提供系统状态信息和相关函数
#include <sys/uio.h> //提供进程I/O操作相关函数
#include <unistd.h> //标准函数库
#include <fcntl.h> //文件操作函数
#include <string.h> //字符操作库
#include <sys/wait.h> //wait调用库
#include <stdio.h> //标准输入输出库
#include <stdlib.h> //常用工具库
int main ()
{char buf[100]={0}; //定义缓存区pid_t cld_pid; //定义该结构保存子进程PIDint fd;int status; //用于wait函数调用参数if ((fd=open("temp",O_CREAT | O_RDWR | O_TRUNC, 0664))== -1){ //打开或者新建文件perror("创建文件");exit(1);}strcpy(buf,"父进程数据");if ((cld_pid = fork())==0){strcpy(buf,"子进程数据");printf("子进程正在工作:");printf("子进程PID是%d\n",getpid()); //输出子进程PIDprintf("父进程PID是%d\n",getppid()); //输出父进程PIDwrite(fd,buf,strlen(buf));close(fd);exit(0);
}
else{printf("父进程正在工作:"); printf("父进程PID是%d\n",getpid());//输出父进程PIDprintf("子进程PID是%d\n",cld_pid); //输出子进程PIDwrite(fd,buf,strlen(buf));
}wait(&status); //等待子进程结束return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
pid_t pid;
char *msg;
int k;
int exit_code; //子进程退出代码
printf("Study how to get exit code\n");
pid = fork(); //创建进程
switch(pid) //观察进程是否创建成功
{
case 0:
msg = "Child process is running"; //代表进程创建成功
k=5;
exit_code=37;
break;
case -1: //进程创建不成功
perror("Process creation failed\n");
exit(1);
default:
exit_code = 0;
break;
}
if(pid !=0) //父子进程都会执行这段代码,子进程PID为0,父进程PID为子进程PID
{ // 父进程等待子进程结束
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("Child procee has exited, pid = %d\n",child_pid);
if(WIFEXITED(stat_val))
printf("Child exited with code %d\n",WEXITSTATUS(stat_val));
else
printf("Child exited abnormally\n");
}
else{ //子进程暂停5秒,在这个过程中运行命令ps aux查看父进程状态
while(k-->0)
{
puts(msg);
sleep(1);
}
}
exit(exit_code);
}
相关文章:

Linux 基础入门操作-实验七 进程的介绍
实验七 进程的介绍 7.1 进程基础概念 Linux进程在内存中包含三部分数据:码段、堆栈段和数据段。代码段存放了程序的代码。代码段可以为机器中运行同一程序的数个进程共享。堆栈段存放的是子程序的返回地址、子程序的参数及程序的局部变量。而数据段则存放程序的全…...

SQL进阶技巧:SQL中的正则表达式应用?
目录 0 引言 1. 正则表达式函数 1.1 regexp_extract 1.2 regexp_replace 1.3 regexp_like 2. 在WHERE子句中使用正则表达式 3. 在GROUP BY中使用正则表达式 4. 性能考虑 5. 高级正则表达式技巧 5.1 使用正则表达式进行数据清洗 5.2 使用正则表达式处理JSON 6. 正则…...

算法数组面试理论
数组是存放在连续内存空间内的相同类型数据的集合 (所以在删除添加元素的时候需要移动其他的元素的地址) 数组的元素是不能删除的,只能覆盖。(因为内存地址是连续的,所以不能删除。或者可以这么理解:在一…...

ASP.NET Zero是什么?适合哪些业务场景?
一、ASP.NET Zero是什么? ASP.NET Zero 是一个基于 ASP.NET Boilerplate (ABP) 框架的模板项目,它提供了预建的页面和强大的基础设施架构,以便开发者能够快速开发应用层。它的特点包括但不限于: 多合一解决方案:提供多…...

获取期货股票分钟级别数据以及均线策略
【数据获取】 银河金融数据库(yinhedata.com) 能够获取国内外金融股票、期货历史行情数据,包含各分钟级别。 【搭建策略】 均线策略作为一种广泛应用于股票、期货等市场的技术分析方法,凭借其简单易懂、操作性强等特点…...

入门篇-1 数据结构简介
数据结构简介 在计算机科学中,数据结构是指组织、存储和管理数据的方式,它使得数据可以被高效地访问和修改。数据结构是计算机程序设计和算法分析中的一个重要概念,因为它们直接影响到程序的执行效率和内存使用。 1. 什么是数据结构&#x…...

Anaconda安装
1.进入Anaconda官网 2.填写邮箱信息 3.在邮箱消息中获取下载链接 4.进入下载页面,选择合适版本下载 5.进入Anaconda安装界面 6.点击“I agree” 7.选择个人即可“Just Me” 8.选择文件安装路径 9.允许创建快捷方式 10.等待下载 11.完成安装...

Elasticsearch学习笔记(六)使用集群令牌将新加点加入集群
随着业务的增长,陆续会有新的节点需要加入集群。当我们在集群中的某个节点上使用命令生成令牌时会出现报错信息。 # 生成令牌 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node出现报错信息: Unable to create enrollment…...

项目建设方案,软件技术方案,整体技术方案,软件建设文档编制(word原件)
1 引言 1.1 编写目的 1.2 项目概述 1.3 名词解释 2 项目背景 3 业务分析 3.1 业务需求 3.2 业务需求分析与解决思路 3.3 数据需求分析【可选】 4 项目建设总体规划【可选】 4.1 系统定位【可选】 4.2 系统建设规划 5 建设目标 5.1 总体目标 5.2 分阶段目标【可选】 5.2.1 业务目…...

vue3定义组件
在Vue 3中,定义组件有多种方式,包括使用单文件组件(Single File Components, SFC)、使用JavaScript对象定义组件、以及使用组合式API(Composition API)。 1. 单文件组件(SFC) 这是…...

BOM常见操作方法汇总
BOM(Browser Object Model,浏览器对象模型)提供了与浏览器窗口交互的方法和属性。BOM 包括了许多对象,如 window、location、history、navigator 等,这些对象提供了与浏览器窗口相关的各种功能。 以下是一些常见的 BO…...

Python+whisper/vosk实现语音识别
目录 一、Whisper 1、Whisper介绍 2、安装Whisper 3、使用Whisper-base模型 4、使用Whisper-large-v3-turbo模型 二、vosk 1、Vosk介绍 2、vosk安装 3、使用vosk 三、总结 一、Whisper 1、Whisper介绍 Whisper 是一个由 OpenAI 开发的人工智能语音识别模型…...

如何在算家云搭建LivePortrait(视频生成)
一、LivePortrait简介 LivePortrait 是一个可控人像视频生成框架,能够准确、实时地将驱动视频的表情、姿态迁移到静态或动态人像视频上,生成极具表现力的视频结果。 该项目的模型产生了定性肖像动画。只要输入一张静态的肖像图像,我们的模型…...

CSS 命名规范及 BEM 在前端开发中的实践
一:CSS命名规范的重要性 1、提高代码可读性 对于开发者自身来说,遵循规范的命名可以让你在日后回顾代码时,快速理解每个样式类的用途。例如,使用 “.header-logo” 这样的命名,一眼就能看出是头部的 logo 元素的样式,而不是一些无意义的命名如 “.box1”。当团队协作开发…...

SwiftUI 6.0(iOS 18)新增的网格渐变色 MeshGradient 解惑
概述 在 SwiftUI 中,我们可以借助渐变色(Gradient)来实现更加灵动多彩的着色效果。从 SwiftUI 6.0 开始,苹果增加了全新的网格渐变色让我们对其有了更自由的定制度。 因为 gif 格式图片自身的显示能力有限,所以上面的…...

【计算机网络】详谈TCP协议确认应答机制捎带应答机制超市重传机制连接管理机制流量管理机制滑动窗口拥塞控制延迟应答
一、TCP 协议段格式 1.1、4位首部长度 4位首部长度的基本单位是4字节,也就是说如果4位首部长度填6,那报头长度就是24字节。报头长度的取值范围为[0,60]字节,也就是说选项的最大长度为40字节。 二、确认应答机制 发送数据和发送应答&#x…...

rk3566开发之rknn npu 部署
目录 NPU使用 RKNN 模型 非 RKNN 模型 RKNN-Toolkit2工具 RKNN NPU 测试代码如下 main.cc ssd.cc 调用 ssd模型进行目标检测测试 ssd.h qt 中调用 rknn npu 接口 NPU使用 RK3566 内置 NPU 模块。使用该NPU需要下载RKNN SDK,RKNN SDK 为带有 NPU 的 RK3566/RK3568 芯片…...

项目生产经理需要具备哪些技能和素质
一、专业技能 1、技术知识 熟悉项目所涉及的工程领域专业知识,包括施工工艺、技术规范、质量标准等。能够准确理解设计图纸,指导施工人员进行正确的施工操作。掌握工程测量、材料检验、工程试验等基本技能,确保工程质量符合要求。 利用进度猫…...

Java数据类型常量
目录 一、数据类型 1.1分类 1.2关键字&内存占用&范围 1.3包装类 1.4说明 1.5类型转换 1.6类型提升 二、常量 2.1java中的常量 2.2定义常量 2.3分类 一、数据类型 1.1分类 1.2关键字&内存占用&范围 数据类型关键字内存占用范围字节型byte1字节-128…...

如何提高浮点类型计算的精度
把下面这篇文章的表达方式改成像正常的人类作者写的,而不是AI写的。 —————— 如何提高浮点类型计算的精度 在后端开发中,浮点数的计算一直一个常见难题,特别是在需要与GPU协作进行复杂计算时,浮点精度的偏差可能带来预期之…...

RabbitMQ简介及安装类
RabbitMQ概述-MQ介绍 RabbitMQ是一个开源的消息代理和队列服务器,它支持多种消息协议,并且可以轻松地与多种编程语言和框架集成。RabbitMQ是使用Erlang语言编写的,因此它具有高并发和高可用性的特点。以下是RabbitMQ的一些关键特性和概念 消息…...

游戏服务器防御策略:防止玩家因DDoS攻击而掉线
在网络游戏环境中,玩家体验至关重要。然而,DDoS(分布式拒绝服务)攻击是导致玩家在游戏中频繁掉线的一个重要原因。本文将探讨如何通过一系列技术和策略来减轻DDoS攻击的影响,保障玩家的游戏体验。 一、引言 DDoS攻击是…...

Django学习笔记二:数据库操作详解
Django框架提供了一个功能强大的ORM(对象关系映射)系统,使得开发者可以使用Python代码来操作数据库,而无需编写复杂的SQL语句。以下是Django数据库操作的一些基本概念和方法: 模型定义 在Django中,模型是…...

Spring Boot 应用开发案例:在线书籍管理系统
Spring Boot 应用开发案例,涵盖从项目搭建到具体实现,包括常用的数据库操作、Restful API 开发、Spring Security 安全认证以及前后端分离架构。这个案例将以开发一个简单的“在线书籍管理系统”为例,介绍如何从头开始搭建项目、实现增删改查功能,并通过 JWT 进行用户认证。…...

阿里140滑块-滑块验证码逆向分析思路学习
一、声明! 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 文章中所有内容仅供学习交流使用,不用于其他任何目的,均已做脱敏处…...

使用 Linux 搭建并配置一个 NFS 服务器
目录 1. 安装相关软件包2. 启动并启用相关服务3. NFS 配置文件3.1 /etc/exports 文件3.2 共享目录3.3 客户端列表3.4 参数选项3.4.1 访问权限选项3.4.2 数据写入硬盘模式3.4.3 root 用户权限3.4.4 子树检查3.4.5 匿名用户3.4.6 安全性(特权端口)3.4.7 网络传输3.4.x 更多 (More…...

python发包
Python 中我们经常会用到第三方的包,默认情况下,用到的第三方工具包基本都是从 Pypi.org 里面下载。这些第三方的包都是开发者们发布的自己的库。我们有自己的想法,或者有一些常用的方法想要分享出去,就可以发布自己的库ÿ…...

农行1面:说说 final,finally,finalize的区别
你好,我是猿java。 在 Java中,“final”、“finally”和“finalize”是三个不同的关键字或方法,尽管它们的名字相似,但在功能和用途上却有显著的区别,这篇文章我们继续分析一篇农行1面的题目:说说 final&a…...

ChatGPT实时语音将于本周向免费用户推出:OpenAI DevDay 2024详细解读
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...

一个月学会Java 第7天 字符串与键盘输入
Day7 字符串与键盘输入 字符串作为所有程序都很重要的东西,这个东西必须好好的学习,在Java中String会比较好学习,比起C和C里面会更加的简单, 在Java之中也是很好理解的,因为底层已经封装好了char数组,也就是…...