前驱图,程序执行和进程状态

目录

前驱图

 程序的执行

顺序执行

并发执行

进程的定义

进程的状态

总结


前驱图

        现在有两个任务分别为p1,p2; 只有执行了p1,才可以执行p2,此时可以称p1为p2的前驱。通过符号语言表示如下:

p1->p2

 程序的执行

下面引进一段代码来理解进程的概念,代码语句编号

编号

代码

1

printf("The process id = %d\n", pid);

2

printf("Hello from child process: %d\n", getpid());

3

printf("Hello from father process: %d\n", getpid());

fork()

Clone the calling process, creating an exact copy.

Return -1 for errors, 0 to the new process,

and the process ID of the new process to the old process.

 

顺序执行

2/single_process.c

#include "stdio.h"

#include "unistd.h"

void main() {

   

    int pid = getpid();

    printf("The process id = %d\n", pid);

    if(pid == -1) {

        perror("fork error!");

    } else if(pid == 0){

        printf("Hello from child process: %d\n", getpid());

    } else {

        printf("Hello from father process: %d\n", getpid());

    }

}

The process id = 62148

Hello from father process: 62148

由于是顺序执行,且只有一个进程,进程的执行过程为:

进程前驱图

p主->p1

代码语句前驱图

A1->A3

注:单个进程的代码中,调用或者说进入这个进程的前一个进程成为p主,本进程标记为p1,用A来表示。

并发执行


2/multiple_process.c



#include "stdio.h"

#include "unistd.h"

void main() {

   

    int pid = getpid();

    printf("The process id = %d\n", pid);

    if(pid == -1) {

        perror("fork error!");

    } else if(pid == 0){

        printf("Hello from child process: %d\n", getpid());

    } else {

        printf("Hello from father process: %d\n", getpid());

    }

}

The process id = 62397

Hello from father process: 62386

The process id = 0

Hello from child process: 62397

进程的执行顺序为:

进程前驱图

p主->p1->p2->p1->p0->p2

代码语句前驱图

A1->A3->B1->B2

进程的定义

程序的一次执行

struct task_struct{
...
unsigned short uid;
int pid;
int processor;
...
volatile long state;
long prority;
unsighed long rt_prority;
long counter;
unsigned long flags;
unsigned long policy;
...
Struct task_struct *next_task, *prev_task;
Struct task_struct *next_run,*prev_run;
Struct task_struct *p_opptr,*p_pptr,*p_cptr,*pysptr,*p_ptr;
...
};

Linux系统的PCB包括很多参数,每个PCB约占1KB多的内存空间。用于表示PCB的结构task_struct简要描述如下:

下面对部分数据成员进行说明:
(1)unsigned short pid 为用户标识
(2)int pid 为进程标识
(3)int processor标识用户正在使用的CPU,以支持对称多处理机方式;
(4)volatile long state 标识进程的状态,可为下列六种状态之一:
可运行状态(TASK-RUNING);
可中断阻塞状态(TASK-UBERRUPTIBLE)
不可中断阻塞状态(TASK-UNINTERRUPTIBLE)
僵死状态(TASK-ZOMBLE)
暂停态(TASK_STOPPED)
交换态(TASK_SWAPPING)
(5)long prority表示进程的优先级
(6)unsigned long rt_prority 表示实时进程的优先级,对于普通进程无效
(7)long counter 为进程动态优先级计数器,用于进程轮转调度算法
(8)unsigned long policy 表示进程调度策略,其值为下列三种情况之一:
SCHED_OTHER(值为0)对应普通进程优先级轮转法(round robin)
SCHED_FIFO(值为1)对应实时进程先来先服务算法;
SCHED_RR(值为2)对应实时进程优先级轮转法
(9)struct task_struct *next_task,*prev_task为进程PCB双向链表的前后项指针
(10)struct task_struct *next_run,*prev_run为就绪队列双向链表的前后项指针
(11)struct task_struct *p_opptr,*p_pptr,*p_cptr,*p_ysptr,*p_ptr指明进程家族间的关系,分别为指向祖父进程、父进程、子进程以及新老进程的指针。

进程的状态

(4)volatile long state

标识进程的状态,可为下列六种状态之一:

可运行状态

TASK-RUNING

执行

可中断阻塞状态

TASK-UBERRUPTIBLE

中断

不可中断阻塞状态

TASK-UNINTERRUPTIBLE

中断

僵死状态

TASK-ZOMBLE

终止

暂停态

TASK_STOPPED

就绪

交换态

TASK_SWAPPING

创建

2/single_process.c

#include "stdio.h"

#include "unistd.h"

void main() {

   

    int pid = getpid();

    printf("The process id = %d\n", pid);

    if(pid == -1) {

        perror("fork error!");

    } else if(pid == 0){

        printf("Hello from child process: %d\n", getpid());

    } else {

        printf("Hello from father process: %d\n", getpid());

}

return;

}

以以上代码为例,printf一次可以看作一次I/O请求。

那这段程序执行的过程的进程状态改变如下:

编号

代码

创建->就绪

执行

int pid = getpid();

阻塞

printf("The process id = %d\n", pid);

就绪

执行

if(pid == -1) {

终止

return;


总结

本文从进程的执行,进程的定义和进程的状态三个方面通过程序来阐述了一些概念。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 学习之 疑难杂症系列

IDEA 学习之 疑难杂症系列 1. Mapstruct 编译空指针问题 1.1. 现象 NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifest1.2. 原因 MapStruct 在 IDEA 2020.3 版本编译 NPE 问题 1.3. 解决办法 2. IDEA 学习之 编译内…

什么牌子的开放式耳机质量好?2024超强实力派品牌推荐!

耳机对于一个音乐人有重要这个不必多说,我朋友是个音乐编辑,他经常需要长时间佩戴耳机进行音频编辑和混音工作。在尝试过多款开放式耳机后,都没找到合适的。今天,我将从专业角度为大家带来几款热门开放式耳机的测评报告&#xff0…

Python 高级数据类型

列表List 定义列表 可以将不同的基本数据类型或者列表装到一个列表里 my_list [1,2,3,4,5] print(my_list) # [1, 2, 3, 4, 5] 直接打印出列表的内容 print(type(my_list)) # <class list>my_list ["1","2","3","4","…

MYSQL之安装

一&#xff0c;下载仓库包 wget -i -c https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm二&#xff0c;安装仓库 yum -y install mysql80-community-release-el7-3.noarch.rpmsed -i s/gpgcheck1/gpgcheck0/g mysql-community.repo三&#xff0c;安装MY…

免费SSL证书的安全性与获取指南

SSL证书是一种数字凭证&#xff0c;用于加密用户与网站之间的信息交换&#xff0c;以确保传输的数据不被第三方窃取。它像是一个数字版的密封印章&#xff0c;为数据的传输过程提供了一层保护膜。 免费的SSL证书通常由CA机构提供&#xff0c;它们同样可以提供基础数据的加密服…

瑞吉外卖项目整体介绍

黑马程序员瑞吉外卖 文章目录 一、项目介绍二、产品原型展示三、技术选型四、功能架构五、角色 一、项目介绍 二、产品原型展示 产品原型&#xff0c;就是一款韩品成型之前的一个简单的框架&#xff0c;就是将页面的排版布局展现出来&#xff0c;使产品的初步构思有一个可视化…

跟着大佬学RE(一)

学了一个 map&#xff08;&#xff09;函数的使用 import base64rawData "e3nifIH9b_CndH" target list(map(ord, rawData)) # map 函数将 rawData 中的每个字符传递给 ord 函数。ord 函数返回给定字符的 Unicode 码点 print(target) # 打印 map 对象的内存地址&…

Prism 入门02,区域介绍

一.区域概念和使用方式 什么是区域(Region)?区域,在Prism 框架中,区域是模块化的核心功能之一,其主要作用是降低应用程序和模块之间的耦合度 。使用方式:在应用程序的界面中,划分出某块区域,并为这个区域定义一个唯一的区域名称。那么通过这个区域名称,应用程序就可以…

Android Display Graphics #1 整体框架介绍一

软件基础 Android的framework层提供了一系列的图像渲染API&#xff0c;可绘制2D和3D。简单理解就是上层开发APP的小伙伴提供了接口&#xff0c;开发者可以直接显示对应的自己内容。但如果掌握了Display底层逻辑再写上层app&#xff0c;会有掌控力&#xff0c;出问题可以根据lo…

【Mybatis】源码分析-自定义框架

1、自定义持久层框架 1.1、分析JDBC操作问题 package blnp.net.cn.jvm.demos;import java.sql.*;/*** <p></p>** author lyb 2045165565qq.com* createDate 2024/5/24 14:24*/ public class JdbcTest {public static void main(String[] args) {Connection conne…

大模型+RAG,全面介绍!

1 介绍 大型语言模型&#xff08;LLMs&#xff09;在处理特定领域或高度专业化的查询时存在局限性**&#xff0c;如生成不正确信息或“幻觉”。**缓解这些限制的一种有前途的方法是检索增强生成&#xff08;RAG&#xff09;&#xff0c;RAG就像是一个外挂&#xff0c;将外部数…

环路检测00

题目链接 环路检测 题目描述 注意点 返回环路的开头节点 解答思路 快慢指针确认链表中是否有环&#xff0c;如果无环则快指针最终会到达链表尾部&#xff0c;如果有环则快慢指针会相遇&#xff0c;当快慢指针相遇&#xff0c;此时新的节点node从head开始出发&#xff0c;与…

探索数据结构:便捷的双向链表

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​​ 前言 前面我们学习了单链表&#xff0c;它解…

微服务中feign远程调用相关的各种超时问题

1. 引言 在spring cloud微服中&#xff0c;feign远程调用可能是大家每天都接触到东西&#xff0c;但很多同学却没咋搞清楚这里边的各种超时问题&#xff0c;生产环境可能会蹦出各种奇怪的问题。 首先说下结论&#xff1a; 1)只使用feign组件&#xff0c;不使用ribbion组件&…

FuTalk设计周刊-Vol.045

#AI漫谈 热点捕手 1、新模型 Stable Diffusion 3 与 Stable Cascade 全面解析 最近 Stability AI 又接连推出了 2 个新的模型&#xff1a;Stable Diffusion 3 和 Stable Cascade&#xff0c;在图像生成效率和质量上比半年前推出的 SDXL 1.0 有了明显提升&#xff0c;今天就为…

PyQt5学习系列之ui转py报错问题

PyQt5学习系列之ui转py报错问题 前言解决步骤一步骤二步骤三 总结 前言 设计好的界面出现ui转py问题&#xff0c;一直出现报错。 一开始通过pycharm进行转化&#xff0c;采用tool工具&#xff0c;一直报错。后用vscode进行转化&#xff0c;转化成功。最终发现问题是语句问题。…

关于恶意软件、行为透明度和移动恶意软件的最新审核变动

关于隐私权、欺骗行为和设备滥用这块,谷歌官方政策一直在改动,最新政策更新出来了,2024 年 8 月 31 日才会进行实施,希望在这期间,开发者们能早点修改重新提包,避免过期后被扫荡下架。 目录 变动新增关于 - 敏感信息访问权限和 API修改范围拒审解决变动新增 关于 - 敏感…

Linux 僵尸进程和孤儿进程

一.Z(zombie)-僵尸进程 1.僵死状态&#xff08;Zombies&#xff09;是一个比较特殊的状态。当进程退出并且父进程&#xff08;使用wait()系统调用后&#xff09;没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 2.僵死进程会以终止状态保持在进程表中&#xff0c;并且会…

二进制文件(.bin等文件)转C语言数组形式hex文件(.c等文件)

使用python脚本把二进制文件&#xff08;.bin等文件&#xff09;转C语言数组形式hex文件&#xff08;.c等文件&#xff09;&#xff0c;具体代码如下&#xff1a; &#xff08;1&#xff09;读取.bin文件数据 &#xff08;2&#xff09;生成C语言数组定义 &#xff08;3&…

中国高分辨率土壤质地数据(1KM)

土壤中各粒级占土壤重量的百分比组合&#xff0c;叫做土壤质地。土壤质地是土壤的最基本物理性质之一&#xff0c;对土壤的各种性状&#xff0c;如土壤的通透性、保蓄性、耕性以及养分含量等都有很大的影响是评价土壤肥力和作物适宜性的重要依据。 中国土壤质地空间分布数据是根…