波奇学Linux:父子进程和进程状态

vim编辑器,编写一个程序模拟进程

 在vim中查看sleep函数

底行模式输入

 写个Makefile自动运行波奇学Linux:yum和vim-CSDN博客

运行程序

 PID和PPID

查看进程目录信息

实际有过滤出来有两个,一个进程本身一个是grep程序,通过 -v grep过滤走含grep的进程。

 目录中的PID相当于进程的唯一标识符。就是给进程分配一个号码,这个数字和进程之间是一一对应的。

PID是进程的属性,那么PID是在 struct task_struct结构体中。

task_struct(波奇学Linux:冯诺依曼和进程-CSDN博客)

 ​​​​​​​

 ps ajx本质是就是遍历双向链表。

 而PPID是该进程的父进程的编号

查看父进程信息,可知父进程是-bash命令行

当xhell打开时会运行bash进程,而每个命令行command都是bash的子进程 。

因此当make 时命令行会创建子进程来启动程序。

kill 指令 关闭进程

输入指令kill -9 PID 关闭进程

 

 getpid()和getppid()返回进程的PID和PPID,证明PID确实是进程PCB的属性

查看函数信息可以用命令行!man查看

PID和PPID刚好吻合 

 

fork创建子进程

 

编写程序

第二号的after line打印两遍的原因是fork创建了一个子线程,子线程运行了一遍printf("after line\n"); 

fork会返回两次,创建子进程成功,返回子进程的PID给父进程,返回0给子进程

 

说明确实父子进程同时运行 。

初步理解fork的原理

代码的执行流是从上往下的,遇到fork函数时一份为二。

 fork函数内部构拷贝一份父线程的task_struct,子线程指向父线程的代码,因此子父线程共享代码。

子父线程相对独立,不共享数据。因此父线程写时拷贝数据给子线程。当子线程要修改父线程的变量时,会把变量拷贝一份,开辟空间给子线程。既避免了浪费空间还避免子线程修改父线程的变量。

fork return两次,因此一般fork下要分流,分出父子线程。

父进程和子进程谁先运行是由调度器决定的。

bash创建子进程,底层调用了fork

进程状态:运行,阻塞,挂起

运行

运行一个进程会把进程放入一个运行队列 runqueue 

通过控制task_struct指针来控制进程的运行先后,每个进程都有一个时间片的概念

并且有个时间片如10ms,比如这个进程一可能运行10ms。

并发执行:在一段时间内所有的在队列中的进程都会运行。

处于运行队列的进程为R态:随时被调度。
把进程从cpu上拿下来或者放上去,进程切换。

阻塞:离开运行队列,进程进入等待队列。

某个进程(比如含有scanf的语句)必须从外设从获取 数据输入时,才能继续运行,那么他就进入阻塞状态,如果同时有其他进程也要获得数据,他们会从运行队列中脱离出来进入等待队列中,知道获取数据。阻塞就是暂停,直到某个条件达成后再继续运行。

等待队列的进程处于阻塞状态,阻塞队列有n个,运行队列只能有一个(1个cpu)

唤醒:就是从阻塞状态转为R态,重新进入运行队列。

挂起:数据暂时进入磁盘中

阻塞挂起:当操作系统内存严重不足时,处于等待队列的进程会把数据从内存加载到磁盘,只留下pcb。此时进程被挂起,当进程唤醒时。又从磁盘加载数据到内存。

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

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

相关文章

新版Android Studio 正则表达式匹配代码注释,删除注释,删除全部注释,IntelliJ IDEA 正则表达式匹配代码注释

正则表达式匹配代码注释 完整表达式拼接Android Studio 搜索匹配【IntelliJ IDEA 也是一样的】 完整表达式拼接 (/*{1,2}[\s\S]?*/)|(//[\x{4e00}-\x{9fa5}].)|(<!-[\s\S]?–>)|(^\s\n)|(System.out.println.*) 表达式拆解&#xff0c;可以根据自己需求自由组合&#x…

Mybatis、Mybatis整合Spring的流程图

Mybatis 注意MapperProxy里面有invoke方法&#xff0c;当进到invoker方法会拿到 二、mybatis整合Spring 1、当我们的拿到的【Dao】其实就是【MapperProxy】&#xff0c;执行Dao的方法时&#xff0c;会被MapperProxy的【Invoke方法拦截】 2、图上已经标注了MapperProxy包含哪些…

力扣:200. 岛屿数量(Python3)

题目&#xff1a; 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假…

STM32-TIM定时器中断

目录 一、TIM&#xff08;Timer&#xff09;定时器简介 二、定时器类型 2.1基本定时器结构 2.2通用定时器结构 2.3高级定时器结构 三、定时中断基本结构 四、时序图分析 4.1 预分频器时序 4.2 计数器时序 4.3 计数器无预装时序&#xff08;无影子寄存器&#xff09; …

C#的线程技术及操作

每个正在操作系统上运行的应用程序都是一个进程&#xff0c;一个进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元&#xff0c;在进程中可以有多个线程同时执行代码。每个线程都维护异常处理程序、调度优先级和一组系统用于在调度该线程前保存线程上下文的…

PyQt6 水平布局Horizontal Layout (QHBoxLayout)

锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计41条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版…

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System EG1: 烧水与控温水壶EG2: 蓄水与最终水位闭环控制系统 EG1: 烧水与控温水壶 EG2: 蓄水与最终水位 h ˙ q i n A − g h A R \dot{…

阿里云SLS采集jvm日志

一、背景 java应用部署在阿里云的k8s容器里&#xff0c;采集其日志的需求则是一个不可缺少的。而不同公司的jvm日志会存在很大的差异&#xff0c;所以本文仅以我的实际情况作一个示例&#xff0c;仅供有需要采集jvm日志的同学们一个参考。 我们打印的Jvm日志格式见下&#xf…

【干货分享】KingIOServer与三菱PLC的通讯的应用案例

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近一个项目涉及用KingIOServer采集三菱PLC数据&#xff0c;特记录通讯过程方便备忘。 一、版本说明&#xff1a; 1、KingIOServer版本&#xff1a;3.7SP2 2、PLC型号&#xff1a;Q03UDV 和Q03UDE自带以太网网口。…

Vue笔记(五)路由进阶

导航守卫 vue-router提供导航守卫主要通过跳转或**取消*的方式守卫导航。有很多方式植入路由导航中&#xff1a;全局的、单个路由独享的&#xff0c;或者组件级的。 全局前置守卫&#xff1a;beforeEach。 每个守卫接收两个参数&#xff1a; to&#xff1a;将要进入的目标fr…

VUE宝典之el-dialog使用

文章目录 &#x1f341;前言&#x1f341;el-dialog简介&#x1f341;el-dialog属性&#x1f341;el-dialog示例&#x1f341;父子组件值传递示例 &#x1f341;前言 el-dialog是Element UI库中的一个重要组件&#xff0c;用于在Vue应用程序中创建弹出框。它提供了一组实用的属…

【Dubbo3云原生微服务开发实战】「Dubbo前奏导学」 RPC服务的底层原理和实现

RPC服务 RPC服务介绍RPC通信模式RPC架构组成RPC技术要点RPC通信技术选项分析RPC实战开发6大基础组件基础组件之Guava基础组件之Hutools基础组件之ReflectionASM基础组件之FastJSON/FastJSON2基础组件之FST相比FastJSON的优势 基础组件之Commons-Codec RPC框架层面选项分析RPC组…

持续集成交付CICD:Jenkins配置Nexus制品上传流水线

目录 一、实验 1.Jenkins配置制品上传流水线 二、问题 1.上传制品显示名称有误 一、实验 1.Jenkins配置制品上传流水线 (1) 新建流水线项目 &#xff08;2&#xff09;描述 &#xff08;3&#xff09;添加参数 &#xff08;4&#xff09;查看构建首页 &#xff08;5&…

实现简易的一对一用户聊天

服务端 package 一对一用户;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vector…

Vue.js - 界面设计工具和UI组件库

ViewDesign ViewDesign是一款开源的在线设计工具&#xff0c;它主要提供了一种可视化的界面设计方法&#xff0c;可以帮助设计师和开发人员更高效地完成界面设计和开发工作。 ViewDesign的特点是支持在线协作&#xff0c;可以多人同时进行设计&#xff0c;提高了设计效率&…

Redis课程:黑马点评

文章目录 基于Redis实现短信登录商户查询缓存优惠券秒杀一人一单 分布式锁Redis分布式锁误删情况说明解决Redis分布式锁误删问题使用lua脚本解决分布式锁的原子性问题 基于阻塞队列实现秒杀优化Redis消息队列优化秒杀业务达人探店参考 本文是根据黑马程序员的视频课程 黑马程序…

vscode 开发c环境

前置条件&#xff1a; 1.vscode安装C/C Extension Pack扩展 2.安装gcc或者clang开发环境 在工程.vscode目录下创建task任务文件 tasks.json {"tasks": [{"type": "cppbuild","label": "build","command": &q…

Kubernetes架构及核心部件

文章目录 1、Kubernetes集群概述1.1、概述1.2、通过声明式API即可 2、Kubernetes 集群架构2.1、Master 组件2.1.1、API Server2.1.2、集群状态存储2.1.3、控制器管理器2.1.4、调度器 2.2、Worker Node 组件2.2.1、kubelet2.2.2、容器运行时环境2.2.3、kube-proxy 2.3、图解架构…

深入解析Node.js:V8引擎、事件驱动和非阻塞式I/O

文章目录 1. 引言2. 什么是Node.js&#xff1f;3. V8引擎3.1 V8引擎简介3.2 V8引擎的特点 4. 事件驱动4.1 事件循环4.2 事件触发与监听4.2.1 代码示例 4.3 异步回调4.3.1 代码示例 5. 非阻塞式I/O5.1 非阻塞式I/O的优势5.2 异步与同步的对比5.2.1 同步I/O的代码示例5.2.2 异步I…

前端知识笔记(三)———CSS核心功能手册:从熟悉到精通

参考HTML代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…