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调用,进入僵死状态,最终结束。

进程的作用
进程是操作系统管理计算机资源的基本单位之一,它在多任务处理和资源管理中扮演着重要角色。进程解决了以下几个关键问题:

  1. 资源管理
    进程帮助操作系统有效管理计算机的硬件资源(如CPU、内存、I/O设备等),确保不同进程之间的资源分配合理。通过进程,操作系统能够监控和分配资源,防止资源的浪费和冲突。
  2. 并发执行
    进程允许多个程序同时运行,提高了系统的效率和利用率。在多核CPU和多线程环境下,操作系统能够通过进程管理来实现真正的并行处理,从而加快计算速度。
  3. 隔离性和安全性
    进程提供了隔离性,使得一个进程的执行不会直接影响其他进程。每个进程都有独立的地址空间,这样可以防止一个进程错误或恶意操作对其他进程造成影响,提高了系统的安全性和稳定性。
  4. 异常处理
    进程可以通过独立的执行环境来处理错误和异常情况。当一个进程发生错误时,操作系统可以通过终止该进程而不影响其他进程的运行,提升了系统的容错能力。
  5. 上下文切换
    进程允许操作系统进行上下文切换,使得CPU可以在多个进程之间快速切换,给用户提供“同时执行”的感觉。操作系统通过调度算法来决定哪个进程在何时获得CPU的控制权,从而实现高效的资源利用。
  6. 状态管理
    进程具有不同的状态(如就绪、运行、等待、终止),操作系统通过管理这些状态来跟踪进程的生命周期,使得对进程的管理和调度更加灵活高效。
  7. 通信与协作
    进程间可以通过各种机制(如管道、消息队列、共享内存等)进行通信和协作,从而实现复杂的计算任务。通过这种进程间通信(IPC),多个进程可以共享数据和协调工作。
  8. 简化应用程序设计
    通过使用进程,开发者可以将复杂的应用程序划分为多个模块,每个模块可以在一个独立的进程中运行,简化了应用程序的设计和维护。
  9. 多用户支持
    操作系统通过进程来支持多用户环境,每个用户可以在自己的进程中运行应用程序,确保各个用户之间的操作不会相互干

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);
}

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

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

相关文章

从零开始讲PCIe(10)——事务层介绍

一、事务层概述 事务层在响应软件层的请求时&#xff0c;会生成出站数据包。同时&#xff0c;它也会检查入站数据包&#xff0c;并将其中包含的信息传递到软件层。事务层支持非发布事务的分割事务协议&#xff0c;能够将入站的完成数据包与之前传输的非发布请求相关联。该层处理…

After-kaoyan

知乎 - 安全中心 有态度&#xff0c;有回应&#xff0c;有温度&#xff0c;是跟双鱼相处的基础 我今天跟大家泄漏一个秘密&#xff0c;这个秘密也很简单&#xff0c;就是我每次遇到困难险阻时候我从不退缩&#xff0c;我也不会想着&#xff1a;“算了吧&#xff0c;我做不到&a…

C/C++/EasyX——入门图形编程(5)

【说明】友友们好&#xff0c;今天来讲一下键盘消息函数。&#xff08;其实这个本来准备和鼠标消息函数放在一起的&#xff0c;但是上一篇三个放在一起&#xff0c;内容就有点多了&#xff0c;只写一个又太单调了&#xff0c;所以键盘消息函数的内容就放在这一篇了 (^&#xff…

用manim实现Gram-Schmidt正交化过程

在线性代数中&#xff0c;正交基有许多美丽的性质。例如&#xff0c;由正交列向量组成的矩阵(又称正交矩阵)可以通过矩阵的转置很容易地进行反转。此外&#xff0c;例如&#xff1a;在由彼此正交的向量张成的子空间上投影向量也更容易。Gram-Schmidt过程是一个重要的算法&#…

Oracle 表空间异构传输

已经有了表空间的数据文件&#xff0c;和元数据dump文件&#xff0c;如何把这个表空间传输到异构表空间中&#xff1f; 查询异构传输平台信息&#xff1a; COLUMN PLATFORM_NAME FORMAT A40 SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM O…

LLM大模型:开源RAG框架汇总

前言 本文搜集了一些开源的基于LLM的RAG&#xff08;Retrieval-Augmented Generation&#xff09;框架&#xff0c;旨在吸纳业界最新的RAG应用方法与思路。如有错误或者意见可以提出&#xff0c;同时也欢迎大家把自己常用而这里未列出的框架贡献出来&#xff0c;感谢~ RAG应用…

【Python】数据可视化之聚类图

目录 clustermap 主要参数 参考实现 clustermap sns.clustermap是Seaborn库中用于创建聚类热图的函数&#xff0c;该函数能够将数据集中的样本按照相似性进行聚类&#xff0c;并将聚类结果以矩阵的形式展示出来。 sns.clustermap主要用于绘制聚类热图&#xff0c;该热图通…

训练验证器解决数学应用题

人工智能咨询培训老师叶梓 转载标明出处 数学问题解决不仅要求模型能够理解问题的语言表述&#xff0c;还要求其能够准确地执行一系列数学运算&#xff0c;每一步的准确性都至关重要。遗憾的是&#xff0c;现有的语言模型在这一领域的性能远远未能达到人类的水平&#xff0c;它…

[C#]使用onnxruntime部署yolov11-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 在C#中使用ONNX Runtime部署YOLOv11-ONNX实例分割模型&#xff0c;涉及到模型的加载、数据预处理、模型推理和后处理几个关键步骤。 首先&#xff0c;需要确保已经安装了ONNX Runtime的NuGe…

站岗放哨树形dp

前言&#xff1a;好久没有写树上dp了&#xff0c;这儿题目还是挺有意思的 题目地址 #include<bits/stdc.h> #include<iostream> using namespace std;//#define int long long int n; const int N (int)1e510; int e[N],ne[N],h[N],idx 0; int dp[2][N];void add…

FLUX1.1PRO震撼来袭:蓝莓揭开神秘面纱,4网站体验,6倍卓越速率和更高质量,竞技场角逐超越所有模型,Elo最高分

大家好我是安琪&#xff01;&#xff01;&#xff01; FLUX 1.1 PRO震撼来袭&#xff1a;蓝莓揭开神秘面纱&#xff0c;4网站体验&#xff0c;6倍卓越速率和更高质量&#xff0c;竞技场角逐超越所有模型&#xff0c;Elo最高分 在人工智能领域&#xff0c;图像生成与反推技术的…

登 Nature 子刊!论文一作详解蛋白质语言模型的小样本学习方法,解决湿实验数据匮乏难题

在「Meet AI4S」系列直播第三期中&#xff0c;我们有幸邀请到了上海交通大学自然科学研究院 & 上海国家应用数学中心博士后周子宜&#xff0c; 他所在的上海交通大学洪亮课题组研究方向主要为 AI 蛋白和药物设计、分子生物物理。该课题组研究成果颇丰&#xff0c;截止目前共…

Steamdeck SteamOs 安装单机版冒险岛079

Steamdeck SteamOs 安装单机版冒险岛079 复制资源到SteamDeck添加游戏到Steamdeck![请添加图片描述](https://i-blog.csdnimg.cn/direct/4e18b0e9b6a84a07851c7d75c452a048.png) 复制资源到SteamDeck 链接&#xff1a;https://pan.baidu.com/s/1CGCthOcfbYRS6y150HAuzw?pwdap…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接&#xff1a; 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化&#xff0c;这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输&#xff08;技术层面&#xff09;&…

从0到1:企事业单位知识竞赛答题小程序迭代开发笔记一

背景调研 企事业单位知识竞赛答题小程序&#xff0c;在信息技术迅猛发展的时代&#xff0c;企业和事业单位在提升员工素质和知识水平方面面临着新的挑战。为了增强员工的学习积极性、提高团队凝聚力和整体素质&#xff0c;越来越多的单位开始组织知识竞赛活动。传统的知识竞赛…

【全球顶级域名后缀】

数据时间: 2024.10.6 广告: 五分钟申请SSL证书 (手机电脑都能用) ["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac"…

GemFilter:基于早期层压缩加速长文本LLM推理

GemFilter 是一种用于加速长文本输入的 LLM 推理并降低内存消耗的新型 AI 方法&#xff0c;其利用 LLM 早期层识别关键信息的能力&#xff0c;从而显著压缩输入序列&#xff0c;并在保持性能的同时&#xff0c;实现高达 2.4 倍的加速和 30% 的内存使用减少。 论文介绍 大型语…

从代码到语言:CoreGen 助力自动化提交信息生成

1.概述 源代码与自然语言之间的语义鸿沟是生成高质量代码提交信息的一个重大挑战。代码提交信息对于开发者来说非常重要&#xff0c;因为它们简明扼要地描述了代码更改的高层次意图&#xff0c;帮助开发人员无需深入了解具体实现即可掌握软件的演变过程。手动编写高质量的提交信…

融资、投流、造血,大模型「新星」开启变现竞速

被称为“AI大模型应用元年”的2024年已过半&#xff0c;行业变化太快&#xff0c;充斥着各种声音。 原本漫长的技术发展周期&#xff0c;在大模型身上被装上了加速键。从卷参数、到卷应用&#xff0c;短短两年时间&#xff0c;玩家“百模大战”、资本烈火烹油&#xff0c;都在…

模型 SECI(知识的创造)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。知识创造的螺旋转化模型。 1 SECI的应用 1.1 Tech Innovations移动应用创新 Tech Innovations是一家软件开发公司&#xff0c;致力于开发创新的移动应用程序。为了提升团队的知识共享和创新能力&…