当前位置: 首页 > news >正文

【Linux】初识进程

目录

操作系统是什么

设计操作系统的目的

操作系统的定位

如何理解管理

管理的本质

管理的例子

计算机的管理概念图

操作系统管理逻辑的六字真言

系统调用和库函数的概念

进程

进程的概念

什么是PCB?

PCB的主要内容

如何查看进程?

通过系统调用获取进程标识符

Linux中创建进程

认识fork

fork有两个返回值

如何实现一个变量接受两个返回值的呢?

父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

创建进程的过程概况

小结


操作系统是什么

  • 在介绍进程之前,我们先回顾一下操作系统的概念:任何计算机都包含一个基本的程序集合,这个集合我们称做操作系统。宽泛的来讲,操作系统可以分为内核(进程管理、内存管理、文件管理、驱动管理)和其他程序两大部分(函数库、shell程序等)。

设计操作系统的目的

  1. 与硬件交互,管理所有软件资源

  2. 为用户程序(应用程序)提供一个良好的执行环境

操作系统的定位

  • 在整个计算机体系架构中,操作系统是一款纯正的搞管理的软件,管理的是资源

如何理解管理

管理的本质

  • 管理的本质实际上就是管理数据

管理的例子

  • 在一个大型制造公司中,有多个部门和不同层级的管理人员。公司的管理结构可以分为高层管理层、中层管理层和基层管理层。高层管理层:由公司的CEO(首席执行官)、CFO(首席财务官)、COO(首席运营官)等组成。他们负责制定公司的战略方向、决策重要事项,并对整个公司的运营和业绩负责。中层管理层:包括各个部门的经理、主管等,他们负责执行公司制定的战略方针,管理团队成员的日常工作,协调部门间的合作与沟通,确保部门目标的达成。基层管理层:由领班、班长等组成,他们负责具体的生产、运营工作。他们需要执行中层管理层下达的任务,指导员工完成具体工作,解决实际生产过程中的问题。通过这个例子,可以清晰地展示层级管理在一个组织中的运作方式。不同层级的管理人员各自承担着不同的责任和角色,共同协作使得整个组织能够高效运转,达成既定的目标和使命。

计算机的管理概念图

操作系统管理逻辑的六字真言

  • 先描述再组织

  • 描述:我们在管理一个对象之前要知道它有什么属性,换到计算机当中就是用类去表示,如:学生的学号、班级、姓名,这样在学生调皮捣蛋的时候能重拳出击。

  • 组织:在描述完这个对象之后,便可以将抽象的管理转变成现实的数据结构的增删查改。

系统调用和库函数的概念

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。

  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

  • 系统调用是形成库的基础

进程

进程的概念

  • 程序是静态的文件,存储在磁盘上,而进程是程序在内存中的执行实例。

  • 进程 = 可执行程序+PCB

什么是PCB?

  • 按照上面的说法,我们要管理进程,首先就要描述进程

  • 进程控制块(Process Control Block,PCB)是操作系统中用于描述和管理进程状态及相关信息的数据结构。每个正在系统中运行的进程都有一个对应的 PCB,操作系统使用 PCB 来跟踪和管理进程的执行。如此,对进程的管理便变成了对PCB的增删查改

PCB的主要内容

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程

  • 状态: 任务状态,退出代码,退出信号等

  • 优先级: 相对于其他进程的优先级

  • 程序计数器: 程序中即将被执行的下一条指令的地址

  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

  • 上下文数据: 进程执行时处理器的寄存器中的数据

  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表

  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等

  • 其他信息

如何查看进程?

  • 查看/proc文件夹即可

ls /proc/

  • 使用ps、top等用户级工具

ps aux | grep test | grep -v grep

通过系统调用获取进程标识符

  • 进程id(PID)

  • 父进程id(PPID)

#include<stdio.h>
#include <unistd.h>int main()
{while(1){printf("i am a process my pid : %d,my father pid :%d\n",getpid(),getppid());sleep(1);}
}

Linux中创建进程

  1. 命令行中直接启动进程:启动程序的本质就是创建进程,一般是通过父进程创建的,一般使用命令行创建的进程都是bash子进程

  2. 通过代码来创建:使用fork函数来创建子进程,fork前只有父进程执行代码,fork之后,父子进程都执行代码

认识fork

  • 使用 man 3 fork来了解fork的使用

fork有两个返回值

  • 父进程中:当fork()在父进程中被调用时,fork()会返回新创建的子进程的进程ID(PID),这个 PID 就是子进程的标识符。父进程可以通过这个返回的 PID 来识别和管理其创建的子进程。

  • 子进程中:在子进程中,fork()的返回值为0。这是因为子进程是父进程的副本,所以子进程中的fork()返回值为0,表示这是子进程的执行环境。

  • 错误情况:如果fork()调用失败,返回值为-1,表示创建子进程失败。在这种情况下,通常会设置全局变量errno来指示具体的错误类型,比如内存不足等。

  • 因此,通过检查fork()的返回值,父进程和子进程可以根据返回值来确定自己是父进程还是子进程,并进行不同的处理逻辑。这个通常使用分支语句if来实现。

如何实现一个变量接受两个返回值的呢?
  #include <stdio.h>#include <sys/types.h>#include <unistd.h>int main(){int ret = fork();if(ret < 0){perror("fork");return 1;}else if(ret == 0){ //childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ //fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;}       
  • 执行一个程序却有两个结果

  • 操作系统是通过一些寄存器做到返回值返回两次的

父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

  • fork创建子进程,系统便会多一个子进程,以父进程为模板,为子进程创建PCB,但创建的子进程没有代码和数据,目前和父进程共享代码和数据,所以fork之后,父子进程会执行一样的代码。

创建进程的过程概况

  1. 找到父进程的PCB

  2. malloc(task_stract)

  3. 根据父进程的PCB,初始化子进程的PCB

  4. 让子进程的PCB指向父进程的代码程序数据

  5. 将子进程放入调度队列中,和父进程一样去排队...

  6. 执行完一系列操作后便返回xxx

小结

  • 综上,我们知道了管理进程要先描述,再组织,所以便有了PCB用来描述进程,进程的创建方式有命令行和代码两种,使用代码创建进程时我们要用到fork函数,fork函数有两个返回值,子进程和父进程共享代码和数据,且数据以写时拷贝的形式。对于fork函数,后面会专门写一篇博客来介绍,祝同志们生活顺利、学业有成QVQ

相关文章:

【Linux】初识进程

目录 操作系统是什么 设计操作系统的目的 操作系统的定位 如何理解管理 管理的本质 管理的例子 计算机的管理概念图 操作系统管理逻辑的六字真言 系统调用和库函数的概念 进程 进程的概念 什么是PCB&#xff1f; PCB的主要内容 如何查看进程&#xff1f; 通过系统…...

有关Theano和PyTensor库

根据Github里面的介绍&#xff0c;PyTensor是源于Theano&#xff0c; Theano目前应该已经不再开发了&#xff0c;更新都是很多年前。 因此PyTensor在背景介绍中说 PyTensor is a fork of Aesara, which is a fork of Theano. Theano和PyTensor都是计算相关的库&#xff0c;可以…...

用 Open-Sora 高效创作视频,让创意触手可及

近年来&#xff0c;视频内容以爆炸式增长席卷了我们的生活。从短视频平台到直播带货&#xff0c;视频正成为人们获取信息和娱乐的主要方式。然而&#xff0c;传统视频制作流程往往耗时费力&#xff0c;对于普通用户来说门槛较高。 为了降低视频创作门槛&#xff0c;让更多人享…...

Git版本管理工具

前言&#xff1a; 本文记录学习使用 Git 版本管理工具的学习笔记&#xff0c;通过阅读参考链接中的博文和实际操作&#xff0c;快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: Git使用教程-配置管理 git reset详解-CSDN博客 3、Git使用不完全指南&am…...

微信小程序选择器picker的使用(省市区)

index.wxml picker中的 moderegion模式&#xff0c;这里同element中的select不同的是&#xff0c;不需要自己在绑定数据原&#xff0c;默认就包含了省市区的整体数据 <view class"section"><view class"section__title">省市区选择器</vie…...

std::shared_ptr与std::make_unique在类函数中的使用

在最近学习cartographer算法的时候&#xff0c;发现源码中大量的使用了std::shared_ptr与std::make_unique&#xff0c;对于这些东西之前不是很了解&#xff0c;为了更好的理解源代码&#xff0c;因此简单学习了一下这块内容的使用&#xff0c;在这里简单记个笔记。 std::shar…...

flutter 局部view更新,dialog更新进度,dialog更新

局部更新有好几种方法&#xff0c;本次使用的是 StatefulBuilder 定义 customState去更新对话框内容 import package:flutter/cupertino.dart; import package:flutter/material.dart;class ProgressDialog {final BuildContext context;BuildContext? dialogContext;double _…...

Lombok:@Delegate优化代码利器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Delegate介绍 二、示例 三、使用场景 四、使用注意事项 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Delegate介绍 Dele…...

【C语言】对称密码——栅栏的加密和解密

栅栏密码的原理&#xff1a; 栅栏层数n ①把将要传递的信息中的字母交替排成上下n行。 ②再将下面每一行字母排依次在上面一行的后边&#xff0c;从而形成一段密码。 ③例如&#xff1a;栅栏层数为2 明文&#xff1a;THE LONGEST DAY MUST HAVE AN END 加密&#xff1a; …...

一、rv1126开发之视频输入和视频编码

RV1126 H264/HEVC编码流程 一、RV1126编码的流程图&#xff1a; 二、每个代码模块详细讲解 2.1. VI模块的创建 VI模块的初始化&#xff1a;关键在于VI_CHN_ATTR_S结构体&#xff0c;这个结构体是VI设置的结构体。这个结构体的成员变量包括&#xff1a;pcVideoNode&#xff0…...

4.1 用源文件写汇编代码

汇编语言 1. 源程序 1.1 伪指令 汇编指令是有对应的机器码的指令&#xff0c;可以被编译为机器指令&#xff0c;最终为CPU所执行伪指令没有对应的机器指令&#xff0c;最终不被CPU所执行伪指令是由编译器来执行的指令&#xff0c;编译器根据伪指令来进行相关的编译工作 1.2…...

Linux TCP参数——tcp_abort_on_overflow

文章目录 tcp_abort_on_overflow全连接队列是什么&#xff1f;如何改变队列大小&#xff1f;内核源码流程命令查看总结 tcp_abort_on_overflow 英文翻译理解&#xff1a;溢出中止 所以&#xff0c;溢出指的是什么溢出&#xff1f; Linux中会维护socket全连接队列&#xff0c;所…...

jupyter notebook设置代码提示方法

在命令行运行以下代码&#xff1a; pip install jupyter_contrib_nbextensionsjupyter contrib nbextension install --userpip install jupyter_nbextensions_configuratorjupyter nbextensions_configurator enable --user &#xff08;有时安装第一行后会自动执行第二行&a…...

Linux 一点查询资料

Linux 一点查询资料 Linux101 Linux入门教程 鸟哥的Linux私房菜 Harley Hahn’s Guide to Unix and Linux 文件管理 - cd, pwd, mkdir, rmdir, ls, cp, rm, mv, tar 文件检索 - cat, more, less, head, tail, file, find 输入输出控制 - 重定向, 管道, tee, xargs 文本处理 -…...

如何快速搭建一个完整的vue2+element-ui的项目-二

技术细节-继续配置 提示&#xff1a;你以为这样就完了吗,其实还有很多东西需要我们自己手写的 例如&#xff1a; element-ui的配置样式重置配置src使用的配置elinst配置axios异步请求的二次封转配置语言国际化配置(这个看需求,我这里就不用配置了)vuex的配置mixins的配置开发环…...

多语言LLM的状态:超越英语

多语言大语言模型的发展现状&#xff1a;超越英语 引言 据微软研究院的数据显示&#xff0c;世界上大约88%的语言&#xff0c;即12亿人的母语&#xff0c;缺乏对大型语言模型&#xff08;LLM&#xff09;的访问。这是因为大多数LLM都是以英语为中心的&#xff0c;即它们大多是…...

kafka什么情况下会认为发送失败进而去重试

在Kafka中&#xff0c;发送消息的过程是异步的&#xff0c;即消息后不会立即得到发送结果。Kafka会将消息添加到发送缓冲区&#xff0c;并立即返回一个成功的响应。因此&#xff0c;Kafka并不会直接知道消息是否成功发送到了目标主题的分区。 Kafka在以下情况下会认为发送失败…...

不满足软件包要求‘transformers==4.30.2‘, ‘sse-starlette

transformers4.30.2支持的SSE-Starlette版本是0.14.0...

C# 设置AutoScroll为true没效果的原因分析和解决办法

C#中添加tabControl 分页&#xff0c;将autoscroll设置为true发现缩小窗口没有滚动条效果。该问题出现后&#xff0c;检索发现也有很多人询问了该问题&#xff0c;但是都没有给出解决方案。 原因是内部button的属性Anchor设置为top、left、right、bottom导致的缩小界面窗口也没…...

<Senior High School Math>: inequality question

( 1 ) . o m i t (1). omit (1).omit ( 2 ) . ( a 2 − b 2 ) ( x 2 a 2 − y 2 b 2 ) ( x 2 y 2 ) − ( a 2 y 2 b 2 b 2 x 2 a 2 ) ≤ x 2 y 2 − 2 x y ( x − y ) 2 (2). (a^2-b^2)(\frac{x^2}{a^2} - \frac{y^2}{b^2})(x^2y^2)-(\frac{a^2y^2}{b^2}\frac{b^2x^2}{a^…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

用鸿蒙HarmonyOS5实现中国象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...