Linux 基础入门操作-实验七 进程的介绍

news2024/10/6 17:19:47

实验七 进程的介绍

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;                      //定义该结构保存子进程PID
	  int 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());           //输出子进程PID
	printf("父进程PID是%d\n",getppid());          //输出父进程PID
	write(fd,buf,strlen(buf));
	close(fd);
	exit(0);
}
else{
	printf("父进程正在工作:");	
	printf("父进程PID是%d\n",getpid());//输出父进程PID
	printf("子进程PID是%d\n",cld_pid);            //输出子进程PID
	write(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.coloradmin.cn/o/2192458.html

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

相关文章

一款基于 Java 的可视化 HTTP API 接口快速开发框架,干掉 CRUD,效率爆炸(带私活源码)

平常我们经常需要编写 API&#xff0c;但其实常常只是一些简单的增删改查&#xff0c;写这些代码非常枯燥无趣。 今天给大家带来的是一款基于 Java 的可视化 HTTP API 接口快速开发框架&#xff0c;通过 UI 界面编写接口&#xff0c;无需定义 Controller、Service、Dao 等 Jav…

使用 Python 进行大规模数据处理

在 Python 中&#xff0c;处理大量数据时&#xff0c;效率是非常重要的。当你有一个包含 100 万个元素的列表&#xff0c;每个元素都是一个字典&#xff0c;并且需要将它们转换为 DataFrame 时&#xff0c;Pandas 是一个很好的工具。Pandas 是 Python 数据处理和分析的强大库&a…

一键生成PPT的AI工具-Kimi!

一键生成PPT的AI工具-Kimi&#xff01; 前言介绍Kimi为什么选择Kimi如何使用Kimi在线编辑PPT下载生成的PPT自己编辑 结语 &#x1f600;大家好&#xff01;我是向阳&#x1f31e;&#xff0c;一个想成为优秀全栈开发工程师的有志青年&#xff01; &#x1f4d4;今天不来讨论前后…

yolov5-7.0模型DNN加载函数及参数详解(重要)

yolov5-7.0模型DNN加载函数及参数详解&#xff08;重要&#xff09; 引言yolov5&#xff08;v7.0&#xff09;1&#xff0c;yolov5.h(加载对应模型里面的相关参数要更改)2&#xff0c;main主程序&#xff08;1&#xff09;加载网络&#xff08;2&#xff09;检测推理&#xff0…

超酷!任务栏美化 给任务栏添加一个好看的时钟

如何给任务栏美化&#xff1f;今天我们这个主题就是帮大家美化任务栏&#xff0c;估计很多伙伴都用过任务栏美化工具。任务栏美化是非常有个性化的功能&#xff0c;不但可以让你的任务栏变得漂亮&#xff0c;还可以增加一些非常有创意的功能&#xff0c;比如今天小编要给大家带…

文件共享软件推荐,哪些工具最实用?

预计到2025年文档共享市场将增长至近100亿美金。文件共享软件助力跨区域协作&#xff0c;推荐ZohoWorkDrive、GoogleDrive、DropboxBusiness。软件设计直观&#xff0c;上手易&#xff0c;可保障数据安全&#xff0c;选择时需考虑企业规模、需求及预算。 一、什么是文件共享软件…

linux部署NFS和autofs自动挂载

目录 &#xff08;一&#xff09;NFS&#xff1a; 1. 什么是NFS 2. NFS守护进程 3. RPC服务 4. 原理 5. 部署 5.1 安装NFS服务 5.2 配置防火墙 5.3 创建服务端共享目录 5.4 修改服务端配置文件 (1). /etc/exports (2). nfs.conf 5.5 启动nfs并加入自启 5.6 客户端…

陀螺仪LSM6DSV16X与AI集成(14)----上报匿名上位机

陀螺仪LSM6DSV16X与AI集成.14--上报匿名上位机 概述视频教学样品申请源码下载硬件准备上位机通讯陀螺仪工作方式欧拉角数据的转换数据帧填充校验和计算数据发送演示开启INT中断中断读取传感器数据主程序演示 概述 本文介绍了如何将 LSM6DSV16X 传感器的姿态数据通过匿名通信协…

【Android】Handler消息机制

文章目录 前言概述核心组件概述Android消息机制概述 Android消息机制分析ThreadLocal的工作原理ThreadLocal基础ThreadLocal实现原理 MessageQueueLooperHandler的工作原理总结 前言 本文用于记录Android的消息机制&#xff0c;主要是指Handler的运行机制。部分内容参考自《An…

产品经理都会的ComfyUI搭建指南

最近准备参加一个ComfyUI的活动&#xff0c;发现还没有上手过ComfyUI&#xff0c;于是先部署起来。ComfyUI是一个基于Stable Diffusion开发的UI。比起WebUI表单式交互的简单&#xff0c;ComfyUI主打灵活&#xff0c;Diffusion Model管线中的各个模块如&#xff1a;VAE、Control…

DINOv2: Learning Robust Visual Featureswithout Supervision

Abstract 在自然语言处理方面的模型&#xff0c;可以产生通用视觉特征&#xff08;即无需微调即可跨图像分布和任务工作的特征&#xff09;来极大地简化任何系统中图像的使用。这些模型能够提取出一些可以在不同类型的图像和任务中通用的视觉特征。这意味着不管图像的来源&…

电脑断网或者经常断网怎么办?

1、首先&#xff0c;按一下键盘的win R &#xff0c; 在打开的运行框内输入&#xff1a;cmd 然后按一下回车 或者 点击一下【确定】 2、在命令窗口输入&#xff1a;ipconfig/release , 然后按一下回车 作用&#xff1a;IP释放&#xff0c;相当于把网线拔了重新插上 3、接着…

【D3.js in Action 3 精译_029】3.5 给 D3 条形图加注图表标签(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

C++11之线程

编译环境&#xff1a;Qt join&#xff1a;阻塞当前线程&#xff0c;直到线程函数退出 detach&#xff1a;将线程对象与线程函数分离&#xff0c;线程不依赖线程对象管理 注&#xff1a;join和detach两者必选其一&#xff0c;否则线程对象的回收会影响线程的回收&#xff0c;导致…

MATLAB下的RSSI定位程序,二维平面上的定位,基站数量可自适应

文章目录 引言程序概述程序代码运行结果待定位点、锚点、计算结果显示待定位点和计算结果坐标 引言 随着无线通信技术的发展&#xff0c;基于 R S S I RSSI RSSI&#xff08;接收信号强度指示&#xff09;的方法在定位系统中变得越来越流行。 R S S I RSSI RSSI定位技术特别适…

Vue 插槽全攻略:重塑组件灵活性

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 目录 什么是slot插槽 默认插槽 编译作用域 后备内容 具名插槽 作用域插槽 应…

医药行业的智能合同审查:大模型与AI赋能合规管理

随着医药行业的快速发展&#xff0c;尤其是在全球化背景下&#xff0c;企业在业务拓展、合作协议签订中需要处理大量复杂的合同。合同不仅是业务的法律保障&#xff0c;更是风险管理的重要工具。医药行业合同审查的复杂性源于其严格的合规性要求&#xff0c;包括与政府机构、研…

学会这几个简单的bat代码,轻松在朋友面前装一波13[通俗易懂]

大家好&#xff0c;又见面了&#xff0c;我是你们的朋友全栈君。 这个标题是干什么用的? 最近看晚上某些人耍cmd耍的十分开心&#xff0c;还自称为“黑客”&#xff0c;着实比较搞笑.他们那些花里胡哨的东西在外行看来十分nb,但只要略懂一些&#xff0c;就会发现他们的那些十…

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(三),单表查询

前言 Navicat Premium 17 数据表需要经常清缓存&#xff0c;不然之前的自增的数据可能会一直存在&#xff0c;所以把之前的表删除重新创建是对练习数据库最简单的办法。新建数据库的命令如下&#xff1a; /* 创建有 自增主键的属性id&#xff0c;非空的属性name&#xff0c;唯…

如何使用ssm实现基于BS的超市商品管理系统的设计与实现+vue

TOC ssm787基于BS的超市商品管理系统的设计与实现vue 研究背景与现状 时代的进步使人们的生活实现了部分自动化&#xff0c;由最初的全手动办公已转向手动自动相结合的方式。比如各种办公系统、智能电子电器的出现&#xff0c;都为人们生活的享受提供帮助。采用新型的自动化…