Linux 进程(二)

1.当前工作目录

        Linux 下使用 ls /proc 查看程序中的进程,其中这些蓝色的数字代表的就是进程。

        其中cwd(current working directory)就是当前工作目录,那么为什么cwd 和 exe 是在同一级目录下呢因为 进程需要依赖可执行程序,可执行程序需要依赖源代码,所以不管是进程和可执行程序都默认生成在跟源代码同一级的目录下。

        怎么更改当前工作目录呢?

        chdir。 查看chdir的使用手册。

        用法如下,更改完成后,再去查看cwd 就会发现cwd已经更改 。

2. fork():

        首先我们来查看一下fork函数的使用。

        对于fork函数的返回值来说是最奇怪的!!!!

        fork 函数竟然有两个返回值!!这是真的吗?我们来创建程序来实验一下!! 

 

        我们可以惊奇的发现执行fork函数之后,之后的代码竟然执行力两次,并且这两个进程互为父子进程。

        进程= 内核数据结构 + 可执行程序的代码和数据!fork函数创建的子进程也不例外,并且子进程会继承父进程的绝大部分的属性(如代码和数据),这样子进程也会打印出和父进程相同的内容,但是pid就不一样,也是子进程没有继承父进程的属性。

        在上面fork 函数的介绍中说道 fork 函数有两个 返回值,返回给父进程的是子进程的pid,返回给子进程的是 0。是这样的吗?我们写个代码看一下

        如果这两个死循环能够同时跑起来,那么就能说明 id 的值既 大于0 又等于 0 ;

        我们来看程序执行的结果:

        这说明id 的值确实是既大于0 又等于 0。

        在进程当中父进程可以有很多个子进程,但是子进程只能有一个父进程,这就相当于一个人可以有很多个儿子,但只能有一个爹,所以为了更好的辨识子进程,父进程需要子进程的pid。

        下面我们继续实验:

        当我们杀死父进程时候,子进程竟然丝毫没有受到影响! 这说明了父进程和子进程在创建之后都有了独立的代码和数据,彼此不会收到影响。这是因为在fork之后 ,当父、子进程要对数据做修改时,os会介入进来会给子进程在copy一份数据,子进程就对这份数据做修改。既然有了两份数据就有两个返回值也不足为奇了!

        但问题的关键是一个变量怎么会有两个值!但linux下确实可以做到这一点。

3.进程状态

        进程被cpu运行需要在cpu下的队列进行排队,在cpu队列下排队的进程我们都可以叫它运行状态(大多数教材都是这么叫的),被cpu正在执行的也肯定是运行状态

        进程(进程 = task_struct PCB + 可执行程序(狭义上这么说))排队这件事,是进程进程所对应的PCB来排队的。进程在排队的时候,一定是在等待某种资源。

        一、进程不是一直在执行的比如一下代码:

        这个代码被执行后会卡住,因为需要等待键盘输入。

           二、进程放在cpu上也不是一直会运行的。

        比如当我们写一个死循环时,它会一直占用cpu的资源,导致电脑上的其他资源会卡死,但是事实并不是这样的,我们电脑可能会卡一点,但是其他的进程还是能正常的执行。这是系统中有一个叫“时间片”的概念。比如每个进程会执行 1ms 然后就执行下一个进程!

                

        在task_struct pcb 中会有struct_listnode n 通过 这个链表来管理全局的进程。

        n 对象是我们自己搞得那么struct 中别的对象是怎么搞得呢?

        首先将 0 强制转换成结构体指针,然后指向某个成员,这时候就算出偏移量了,然后再用n 的地址减去偏移量 就能够算出 task_struct 的地址,然后在强制转化成该结构体指针。不就能拿到该结构体地址,就能够访问该结构体的任意成员了!

        tast_struct pcb 中有很多个节点,cpu 是一种设备,所以对应的节点都可以链接到对应设备的队列上排队等待获取资源!!!

        进程的状态有 运行,阻塞,挂起。

        运行状态简单的理解就是,PCB在进程队列排队,或者正在被cpu执行。

        状态的不同,决定了你下一步要干什么!!比如你的状态是生病,下一步就是看病!!

        那么操作系统也是这样的,task_struct 中的状态其实就是一个整形变量。如下图:

        当程序走到了scanf 时,那么程序就会卡住,等待从键盘上获取资源。

        这时候操作系统会将该进程的pcb中的某个节点 连接到 对应设备的队列上去,同时该进程已经不在cpu队列了,那么该进程的状态要从运行 ,状态改为阻塞状态!!!这也就是状态的变迁。

        当我们的进程正在等待软硬件资源的时候,资源如果没有就绪,我们进程task_struct 只能

1.将自己设置为阻塞状态。2.将自己的pcb连接到该资源提供的等待队列。

              状态的变迁原因是,os将pcb放到了不同的队列中。

        挂起状态:简单的理解为内存现在吃紧,os将一些不重要的进程写入磁盘,为内存空间辗转腾挪。 

          

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

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

相关文章

Reactor模式

Reactor模式有点类似事件驱动模式。在事件驱动模式中,当有事件触发时,事件源会将事件分发到Handler(处理器),由Handler负责事件处理。Reactor模式中的反应器角色类似于事件驱动 模式中的事件分发器(Dispatc…

操作系统原理-作业一-进程同步

1.某理发店可同时供 10 人理发,当店中顾客少于 10 人时,则店外的顾客可立即进入,否则需在外面等待。请定义所需信号量并写出信号量各种取值( 大于 0 、等于 0 、小于0)分别代表的含义,并用 P 、 V 操作编程实现完成多个顾…

HCIP---MPLS---VPN

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 MPLS协议使用标签交换来转发报文,最初是为了提高IP报文转发效率而设计的,但是后来随着硬件性能的提升,路由表已经不再是路由表/防火墙的转发瓶颈&#…

树与二叉树堆:链式二叉树的实现

目录 链式二叉树的实现: 前提须知: 前序: 中序: 后序: 链式二叉树的构建: 定义结构体: 初始化: 构建左右子树的指针指向: 前序遍历的实现: 中序…

初识PO模式并在Selenium中简单实践

初识PO模式 PO(PageObject)是一种设计模式。简单来说就是把一些繁琐的定位方法、元素操作方式等封装到类中,通过类与类之间的调用完成特定操作。 PO被认为是自动化测试项目开发实践的最佳设计模式之一。 在学习PO模式前,可以先…

太快了!文生图片只需1秒,开源SDXL Turbo来啦!

11月29日,著名开源生成式AI平台Stability.ai在官网发布了,开源文生图模型SDXL Turbo。 根据使用体验,SDXL Turbo的生成图像效率非常快,可以做到实时响应(可能小于1秒)。 在你输入完最后一个文本后&#x…

基于模块暴露和Hilt的Android模块化方案

ModuleExpose 项目地址:https://github.com/JailedBird/ModuleExpose 序言 Android模块化必须要解决的问题是 如何实现模块间通信 ?而模块之间通信往往需要获取相同的实体类和接口,造成部分涉及模块通信的接口和实体类被迫下沉到基础模块&…

Nginx性能调优策略

Nginx是一个高性能的Web服务器和反向代理服务器,常用于处理高并发的请求。以下是一些常见的Nginx性能调优策略: 一、调整worker_processes和worker_connections 在Nginx配置文件中,可以通过worker_processes和worker_connections参数来调整w…

vue2.6源码分析

vue相关文档 vue-cli官方文档 vuex官方文档 vue-router 官方文档 vue2.6源码地址 如何调试源码 package.json 添加了--sourcemap "scripts": {"dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev --sourcemap" }新增…

InstructDiffusion-多种视觉任务统一框架

论文:《InstructDiffusion: A Generalist Modeling Interface for Vision Tasks》 github:https://github.com/cientgu/InstructDiffusion InstructPix2Pix:参考 文章目录 摘要引言算法视觉任务统一引导训练集重构统一框架 实验训练集关键点检测分割图像…

0x00000709一键修复的解决办法,0x00000709错误的原因

在使用打印机时,你可能会遇到一些错误代码,其中之一是0x00000709。这个错误代码表示无法设置默认打印机。如果你遇到这样的问题不用担心!这篇文章将为你提供0x00000709一键修复的解决办法,帮助你解决0x00000709错误,并…

对于 ` HttpServletResponse ` , ` HttpServletRequest `我们真的学透彻了吗

对于 **HttpServletResponse , HttpServletRequest**我们真的学透彻了吗 问题引入 PostMapping("/importTemplate") public void importTemplate(HttpServletResponse response) {ExcelUtil<SysUser> util new ExcelUtil<SysUser>(SysUser.class);uti…

J-Flash工具的使用---擦除、烧录及校验

文章目录 前言一、打开J-Flash工具二、使用步骤1.创建工程&#xff0c;选择MCU&#xff0c;配置端口2.打开要烧录的文件3.连接J-Link4.擦除Flash5. 烧录固件 总结 前言 不使用IDE&#xff08;如keil、Iar&#xff09;如何来烧录固件。当我们的程序需要保密&#xff0c;不需要被…

YOLOv8改进 | 2023 | DWRSeg扩张式残差助力小目标检测 (附修改后的C2f+Bottleneck)

论文地址&#xff1a;官方论文地址 代码地址&#xff1a;该代码目前还未开源&#xff0c;我根据论文内容进行了复现内容在文章末尾。 一、本文介绍 本文内容给大家带来的DWRSeg中的DWR模块来改进YOLOv8中的C2f和Bottleneck模块&#xff0c;主要针对的是小目标检测&#xff0c…

Vite 了解

1、vite 与 create-vite 的区别 2、vite 解决的部分问题 3、vite配置文件的细节 3.1、vite语法提示配置 3.2、环境的处理 3.3、环境变量 上图补充 使用 3.4、vite 识别&#xff0c;vue文件的原理 简单概括就是&#xff0c;我们在运行 npm润dev 的时候&#xff0c;vite 会搭起…

fastReID论文总结

fastReID论文总结 fastReIDReID所面临的挑战提出的背景概念&#xff1a;所谓ReID就是从视频中找出感兴趣的物体&#xff08;人脸、人体、车辆等&#xff09;应用场景&#xff1a;存在的问题&#xff1a;当前的很多ReID任务可复用性差&#xff0c;无法快速落地使用解决方式&…

EMA训练微调

就是取前几个epoch的weight的平均值&#xff0c;可以缓解微调时的灾难性遗忘&#xff08;因为新数据引导&#xff0c;模型权重逐渐&#xff0c;偏离训练时学到的数据分布&#xff0c;忘记之前学好的先验知识&#xff09; class EMA():def __init__(self, model, decay):self.…

RabbitMQ消息模型之Sample

Hello World Hello World是官网给出的第一个模型&#xff0c;使用的交换机类型是直连direct&#xff0c;也是默认的交换机类型。 在上图的模型中&#xff0c;有以下概念&#xff1a; P&#xff1a;生产者&#xff0c;也就是要发送消息的程序C&#xff1a;消费者&#xff1a;消…

机器学习:领域自适应学习

训练一个分类器是小问题 上难度 训练数据和测试数据不一致&#xff0c;比如训练数据是黑白的&#xff0c;测试时彩色的&#xff0c;结果准确率非常低。 训练数据和测试数据有点差距的时候&#xff0c;能不能效果也能好呢&#xff1f;这就用到了领域自使用domain adptation 用一…

Windows 11的新功能不适用于所有人,但对将要使用的人来说非常酷

正如一个新的预览版本所示&#xff0c;Windows 11即将为那些使用手写笔的人添加一些智能功能&#xff0c;以及其他改进。 这是预览版22635.2776&#xff08;也称为KB5032292&#xff09;&#xff0c;已推出Beta频道&#xff0c;这是发布预览版之前的最后一个测试方法&#xff…