操作系统:进程1

一.进程

1.什么是进程

一个进程创建,他会生成几块:

  • 代码段:进程执行的程序代码
  • 数据段:全局变量,静态变量,在进程生命周期中是动态可变的
  • 堆:动态分配的内存区域,malloc、calloc、realloc等函数进行开辟
  • 栈:用于存储局部变量、函数参数和返回地址
  • PCB进程控制块:包含进程ID(PID),进程状态,程序计数器(吓一条指令的位置),进程优先级等等

进程是资源分配和调度的基本单位

进程是资源分配的最小单位

线程是最小的调度单位

2.进程中的三态模型

  • 阻塞态:这个进程需要相应的资源,而现在需要等待相应的资源,那么这个进程就进入到阻塞态,CPU会将这个进程给拿下CPU,去执行就绪在就绪队列中的第一个进程。
  • 就绪态:一个进程需要运行,并且他所有的需求都满足了,就等待CPU去执行,那么这个进程会在这个就绪队列中进行排队,等待CPU的调度执行
  • 运行态:这个进程在CPU上执行

挂起

  • 挂起:在挂起这个进程时,会将这些运行在内存上的内容给写入到磁盘中或交换区中,然后释放内存,在记录上下文(记录上下文的作用就是,为了让你回到在你挂起这个进程前那个状态,和玩游戏存档的意思差不多)
  • 唤醒:将刚刚写入到磁盘的内容,又写入到内存中,到达就绪态,等待操作系统的调度

进程详细的五态

对于3态模型,只多了创建态和终止态。

3.进程的控制 

如何实现的原子性?

在原语时,执行关中断指令,将中断关闭掉,这样CPU就不会中断这个原语的执行,在执行完成原语后,执行开中断指令,将中断打开。这样就实现了原语的原子性,在执行原语的过程中就不会被中断。

4.调度的基本概念

        为什么需要了解如何进行调度?

        当有一堆任务需要处理,但由于资源有限,这些事情没有同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是”调度“研究”的问题

        能否进行调度切换进程的情况:

        进行切换是有代价的,如果过度频繁进行调度、切换,会使系统的效率降低。

 调度算法:

1.时间片轮转算法

        给每个进入到就绪队列中的进程分配一个时间片,这个时间片的大小需要写程序的我们来决定,不能太短,也不能太长。然后每个程序在CPU上执行的时间就是时间片的大小,如果执行完成可以先退出然后让出CPU,如果没有在时间片规定的时间完成,那么也要让出CPU让就绪队列中下一个进程进行执行,然后让出CPU后又到就绪队列中进行排队,等待下一次的CPU调度执行。

2.优先级调度算法

 优先级调度算法分为:

  • 静态:进程在创建时就确定了优先级,这个进程在生命周期中优先级不会改变
  • 动态:在创建时确定了一个优先级,在生命周期的过程中,操作系统会通过规定进行对应的优先级改变
3.多级反馈队列调度算法

  • 特点:进程可以在不同优先级队列之间移动。新进程进入高优先级队列,如果未能在规定时间完成则降级。
  • 优点:兼顾响应时间和吞吐量,适应性强。
  • 缺点:配置参数(如队列数量、时间片等)复杂。
4.短作业优先
  • 特点:优先调度运行时间最短的进程。
  • 优点:可以最小化平均等待时间。
  • 缺点:难以准确预测每个进程的运行时间;可能导致长作业得不到及时处理(即“饥饿”)。
5.最短剩余时间优先
  • 特点:是SJF的抢占式版本。每次调度时选择剩余执行时间最短的进程。
  • 优点:可以进一步减少平均等待时间。
  • 缺点:和SJF一样,难以预测执行时间,并且会导致频繁的上下文切换。

  对比短作业优先就是,假如P1进程需要执行时间是10s,P2执行时间是20S,现在执行P1已近5s了,来了一个新进程P3执行是减是3S,那么CPU会将P1给拿下放入到就绪队列中,来执行P3。短作业优先就是P1执行完成了才执行P3

6.先来先服务
  • 特点:按进程到达就绪队列的顺序进行调度,先到达的进程先调度。
  • 优点:简单易实现。
  • 缺点:可能导致“等待时间长”的问题(即“队头阻塞”)。

5.进程拷贝

        进程拷贝时,他们会共享物理内存页面,但是这些内存页面现在是只读的。

        其中一个进程需要堆这个内存页面进行写入时,那么就会创建该内存页的副本,然后给该进程附上可写的权限。

        这样可以节省系统资源,防止创建一个子进程就立刻复制整个地址空间,减少不必要的空间。        

6.创建进程

fork函数
#include <sys/types.h>
#include <unistd.h>pid_t fork(void);

fork函数创建子进程的关键点:

  • 共享资源:子进程继承了父进程的大部分资源,包括打开的文件描述符、环境变量、优先级、控制终端等。
  • 独立地址空间:虽然子进程最初共享父进程的地址空间,但它们有独立的地址空间,修改内存不会影响对方。
  • 执行路径fork() 返回值用于区分父子进程。子进程返回 0,父进程返回子进程的 PID。
  • 进程调度:子进程和父进程是并行执行的,具体谁先执行由操作系统调度决定。

例子:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main() {int n;//创建子进程pid_t child_pid = fork();if (child_pid < 0) {perror("fork");exit(1);}//当child_pid为04时说明是子进程if (child_pid == 0) {n = 6;while (n > 0) {printf("child self = %d, parent = %d\n", getpid(), getppid());n--;}} //不为0说明是父进程else {n = 3;while (n > 0) {printf("parent self = %d, parent = %d\n", getpid(), getppid());n--;}}return 0;
}

       你会发现每次输出的结果都是不一样的。

 孤儿进程 

        那么像这种情况就是父进程先执行完成了,子进程还在执行,但是没有父进程为子进程收尸(回收资源),那么这个子进程就叫做孤儿进程,那么谁会为他收尸呢,也就是我们系统最初的那个进程0号进程。也叫做init进程(或者现代系统的systemd)接管,我们也可以称它为孤儿院。

僵尸进程

        当一个进程终止后,其父进程还没有读取它的退出状态,这个进程就被称为僵尸进程。

        如何处理我们调用wait()或者waitpid()来读取子进程的状态,来等待子进程的退出状态,这样就可以为子进程进行收尸。

wait和waitpid()
pid_t wait(int *status);pid_t waitpid(pid_t pid, int *status, int options);

wait:

  • 功能wait 阻塞调用进程,直到其某个子进程终止。如果一个子进程已经终止,那么 wait 会立即返回。
  • 参数status 是一个指向整数的指针,用于存储子进程的退出状态。如果 statusNULL,则退出状态会被丢弃。
  • 返回值:返回终止的子进程的进程 ID。如果调用出错(例如,没有子进程),则返回 -1 并设置 errno

waitpid:

  • 功能waitpid 提供了比 wait 更细粒度的控制,允许父进程等待特定的子进程终止,或者以非阻塞方式等待。
  • 参数
    • pid:指定要等待的子进程 ID。如果 pid 为 -1,则等待任何子进程(等同于 wait)。
    • status:同 wait,用于存储子进程的退出状态。
    • options:提供额外的选项控制,如 WNOHANG(非阻塞方式)和 WUNTRACED(也会返回已停止的子进程)。
  • 返回值:成功时返回子进程的 PID,失败时返回 -1 并设置 errno

        如何获取退出状态,可以在Linux系统中的man手册查看。

接着上面那个例子来进行优化:
 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <wait.h>int main() {int n;int state;//创建子进程//在子进程中child_pid 为0//父进程为fork的返回值pid_t child_pid = fork();if (child_pid < 0) {perror("fork");exit(1);}//当child_pid为04时说明是子进程if (child_pid == 0) {n = 6;while (n > 0) {printf("child self = %d, parent = %d\n", getpid(), getppid());n--;}} //不为0说明是父进程else {n = 3;while (n > 0) {printf("parent self = %d, parent = %d\n", getpid(), getppid());n--;}int ret = wait(&state);if (ret < 0) {perror("wait error");exit(1);}//看通过stata判断子进程是否正常退出if (WIFEXITED(state)) {//正常退出输出子进程PID和退出状态printf("child process %d is sucess exit %d\n", child_pid, WEXITSTATUS(state));} else {//不正常输出子进程PIDprintf("child process %d is not sucess exit\n", child_pid);}}return 0;
}

 

 

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

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

相关文章

html实现酷炫美观的可视化大屏(十种风格示例,附源码)

文章目录 完整效果演示1.蓝色流线风的可视化大屏1.1 大屏效果1.2 大屏代码1.3 大屏下载 2.地图模块风的可视化大屏2.1 大屏效果2.2 大屏代码2.3 大屏下载 3.科技轮动风的可视化大屏3.1 大屏效果3.2 大屏代码3.3 大屏下载 4.蓝色海洋风的可视化大屏4.1 大屏效果4.2 大屏代码4.3 …

快速介绍git(Linux)

git 1、安装2、版本控制3、git vs gitee&&GitHub(git故事)4、git的操作 1、安装 很简单&#xff0c;直接 sudo yum install -y git2、版本控制 故事介绍&#xff1a;你是一个大学生&#xff0c;你上课需要交一分实验报告&#xff0c;教你的老师比较负责&#xff0c;…

手把手教你集成GraphRag.Net:打造智能图谱搜索系统

在人工智能和大数据发展的背景下&#xff0c;我们常常需要在项目中实现知识图谱的应用&#xff0c;以便快速、准确地检索和使用信息。 今天&#xff0c;我将向大家详细介绍如何在一个新的.NET项目中集成GraphRag.Net&#xff0c;这是一个参考GraphRag实现的.NET版本&#xff0c…

Linux_make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

探索LLM世界:新手小白的学习路线图

随着人工智能的发展&#xff0c;语言模型&#xff08;Language Models, LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的应用越来越广泛。对于新手小白来说&#xff0c;学习LLM不仅能提升技术水平&#xff0c;还能为职业发展带来巨大的机遇。那么&#xff0c;…

Linux(虚拟机)的介绍

Linux介绍 常见的操作系统 Windows&#xff1a;微软公司开发的一款桌面操作系统&#xff08;闭源系统&#xff09;。版本有dos&#xff0c;win98&#xff0c;win NT&#xff0c;win XP , win7, win vista. win8, win10&#xff0c;win11。服务器操作系统&#xff1a;winserve…

conda issue

Conda 是一个跨平台、通用的二进制包管理器。它是 Anaconda 安装使用的包管理器&#xff0c;但它也可能用于其他系统。Conda 完全用 Python 编写&#xff0c;并且是 BSD 许可的开源。通用意味着大部分的包都可以用它进行管理&#xff0c;很像一个跨平台版本的apt或者yum&#x…

vue3 父组件 props 异步传值,子组件接收不到或接收错误

1. 使用场景 我们在子组件中通常需要调用父组件的数据&#xff0c;此时需要使用 vue3 的 props 进行父子组件通信传值。 2. 问题描述 那么此时问题来了&#xff0c;在使用 props 进行父子组件通信时&#xff0c;因为数据传递是异步的&#xff0c;导致子组件无法成功获取数据…

汇川CodeSysPLC教程03-2-6 ModBus TCP

什么是ModBus TCP&#xff1f; ModBus TCP是一种基于TCP/IP协议的工业网络通信协议&#xff0c;常用于工业自动化和控制系统。它是ModBus协议的一个变种&#xff0c;ModBus协议最初由Modicon&#xff08;现在是施耐德电气的一部分&#xff09;在1979年开发。 以下是ModBus TC…

数据治理之“财务一张表”

前言 信息技术的发展&#xff0c;伴随企业业务系统的纷纷建设&#xff0c;提升业务处理效率的同时&#xff0c;也将企业的整体主价值链流程分成了一段一段的业务子流程&#xff0c;很多情况下存在数据上报延迟、业务协作不顺畅、计划反馈不及时、库存积压占资多……都可以从数据…

【Android】linux

android系统就是跑在linux上的系统。Linux层里面包含系统和硬件驱动等一些本地代码的环境。 linux的目录 mount: 用于查看哪个模块输入只读&#xff0c;一般显示为&#xff1a; [rootlocalhost ~]# mount /dev/cciss/c0d0p2 on / type ext3 (rw) proc on /proc type proc (…

Spring AI (五) Message 消息

5.Message 消息 在Spring AI提供的接口中&#xff0c;每条信息的角色总共分为三类&#xff1a; SystemMessage&#xff1a;系统限制信息&#xff0c;这种信息在对话中的权重很大&#xff0c;AI会优先依据SystemMessage里的内容进行回复&#xff1b; UserMessage&#xff1a;用…

PlatformIO+ESP32S3学习:驱动WS2812矩阵彩灯显示FFT音律拾音灯

本文继承自之前的彩灯驱动文章&#xff1a;https://blog.csdn.net/qq_51930953/article/details/140736628 本文完成的效果&#xff1a; 1. 硬件准备 1.1. WS2812矩阵彩灯 购买地址&#xff1a;WS2812B全彩软像素屏8X8 8X32 16X16幻彩5V显示可编程像素软屏 1.2. 麦克风模块 购…

Ip2region - 基于xdb离线库的Java IP查询工具提供给脚本调用

文章目录 Pre效果实现git clone编译测试程序将ip2region.xdb放到指定目录使用改进最终效果 Pre OpenSource - Ip2region 离线IP地址定位库和IP定位数据管理框架 Ip2region - xdb java 查询客户端实现 效果 最终效果 实现 git clone git clone https://github.com/lionsou…

YOLOV8源码解读-C2f模块-以及总结c2模块、Bottleneck

c2f模块是对c2模块的改进 c2模块图解解读 先给出YOLOV8中卷积的定义模块一键三连-卷积-BN-激活函数 def autopad(k, pNone, d1): # kernel, padding, dilation"""Pad to same shape outputs."""if d > 1:k d * (k - 1) 1 if isinstance…

Linux:进程信号(二.信号的保存与处理、递达、volatile关键字、SIGCHLD信号)

上次介绍了&#xff1a;(Linux&#xff1a;进程信号&#xff08;一.认识信号、信号的产生及深层理解、Term与Core&#xff09;)[https://blog.csdn.net/qq_74415153/article/details/140624810] 文章目录 1.信号保存1.1递达、未决、阻塞等概念1.2再次理解信号产生与保存1.3信号…

Pytorch深度学习实践(9)卷积神经网络

卷积神经网络 全连接神经网络 神经网络中全部是线性模型&#xff0c;是由线性模型串联起来的 全连接网络又叫全连接层 卷积神经网络 在全连接神经网络中&#xff0c;由于输入必须是一维向量&#xff0c;因此在处理图像时必须要对图像矩阵进行拉伸成一维的形式&#xff0c;…

【算法】布隆过滤器

一、引言 在现实世界的计算机科学问题中&#xff0c;我们经常需要判断一个元素是否属于一个集合。传统的做法是使用哈希表或者直接遍历集合&#xff0c;但这些方法在数据量较大时效率低下。布隆过滤器&#xff08;Bloom Filter&#xff09;是一种空间效率极高的概率型数据结构&…

【NPU 系列专栏 2.8 -- 特斯拉 FDS NPU 详细介绍 】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 特斯拉 NPU 芯片介绍FSD(Full Self-Driving)芯片 简介FSD主要特点FSD 详细参数FSD 应用场景特斯拉 Hardware 3.0 芯片 简介Hardware 3.0主要特点Hardware 3.0 详细参数Hardware 3.0应用场景特斯拉自研 NPU 的优势优化设计高度…

【数学建模】——matplotlib简单应用

目录 1.绘制带有中文标签和图例的正弦和余弦曲线 2. 绘制散点图 1.修改散点符号与大小 2.修改颜色 3.绘制饼状图 4.在图例中显示公式 5.多个图形单独显示 6.绘制有描边和填充效果的柱状图 7.使用雷达图展示学生成绩 8.绘制三维曲面 9.绘制三维曲线 10.设置…