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将一些不重要的进程写入磁盘,为内存空间辗转腾挪。 

          

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

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

相关文章

jmeter多个接口测试

针对接口文档,进行对应接口设计,多个接口设计用例需要使用事物控制器。 1.通过登录接口提取sign值 发送一个登录请求,然后通过正则表达式提取该sign值 正则表达式的使用,我稍后会在下一个博文中详细说明,这边就不多说…

如何用SWIG封装c++接口给java使用?

SWIG是什么? SWIG(Simplified Wrapper and Interface Generator)是一个将C/C接口转换为其他语言接口的工具,从而可以讲C/C的库集成到其他语言的系统中。目前SWIG已经可以支持Python, Java, C#,Ruby,PHP,R语言等十多种语言。 官方网址&…

Android项目实战开发-----期末总结2

项目三:网络层和数据模型的封装 任务一:网络请求和数据解析 1,网络请求 (1)Android中的网络存储主要是使用HTTP/HTTPS协议访问服务器,与服务器发生数据交互。 (2)Android提供两种…

python -- python安装

1、python的诞生和发展: python语言是一种解释型、面向对象型、动态数据类型的高级程序设计语言。 2、python的安装: 1、安装解析器: 在安装的过程中需要注意的是: 在安装pycharm的时候也是同样的道理,需要指定安装…

【长文干货】Python可视化教程

文章目录 数据介绍Matplotlib散点图折线图柱形图直方图 Seaborn散点图折线图柱形图直方图 Bokeh散点图折线条形图交互式 Plotly基本组合优化:定制化下拉菜单 总结 数据介绍 在这个小费数据集中,我们记录了20世纪90年代初期餐厅顾客在两个半月内给出的小…

【机器学习 | 可视化】回归可视化方案

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…

LESS的叶绿素荧光模拟实现——任意波段荧光模拟

目录 前言一、任意波段荧光模拟的实现二、需要注意的输入参数 前言 此专栏默认您对LESS (LargE-Scale remote sensing data and image Simulation framework) 模型和叶绿素荧光(Sun-Induced chlorophyll Fluorescence, SIF)有一定的了解。当然,您也可以在这里下载中…

Kubernetes

Kubernetes Docker的安装Docker安装:安装docker依赖环境配置国内docker-ce的yum源(这里采用的是阿里云)安装docker。插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自…

C++基础 -17-继承中 基类与派生构造和析构调用顺序

首先声明 定义了派生类会同时调用基类和派生的构造函数 定义了派生类会同时调用基类和派生的析构函数 那么顺序如何如下图 构造由上往下顺序执行 析构则完全相反 #include "iostream"using namespace std;class base {public:base(){cout << "base-bui…

orvibo旗下的VS30ZW网关分析之二:版本回退方法

概述 上接第一篇: orvibo旗下的VS30ZW网关分析之一-CSDN博客 此产品VS30ZW支持openwrt的页面,可以版本回退进行刷机。 openwrt固件下载: 固件名称:openwrt-VS30ZW-mt7628.bin 链接地址:https://download.csdn.net/download/leekwen/88579427 版本回退方法: 1、同…

多模态大模型总结2(主要2023年)

LLaVA-V1&#xff08;2023/04&#xff09; 论文&#xff1a;Visual Instruction Tuning 网络结构 如下图 所示为 LLaVA-v1 的模型结构&#xff0c;可以看出其简化了很多&#xff0c;但整体来说还是由三个组件构成&#xff1a; Vision Encoder&#xff1a;和 Flamingo 模型的 V…

微信小程序获取手机号上限,怎么处理比较省钱

微信新规 微信2023年改了规则&#xff0c;原本免费的小程序获取手机号&#xff0c;现在如果要获取要1分钱一条。 有些小程序的用户非常恐怖&#xff0c; 比如一些工具类的&#xff0c; 群发类的。如果进入小程序就必须要获取小程序&#xff0c;就像是无底洞&#xff0c;让运营…

【古月居《ros入门21讲》学习笔记】14_参数的使用与编程方法

目录 说明&#xff1a; 1. 参数模型&#xff08;全局字典&#xff09; 2. 实现过程&#xff08;C&#xff09; 创建功能包 参数命令行的使用 YAML参数文件 rosparam命令 使用示例 编程方法&#xff08;C&#xff09; 配置代码编译规则 编译并运行 编译 运行 3. 实…

【C++笔记】红黑树的简易实现

【C笔记】红黑树的简易实现 一、什么是红黑树以及红黑树好在哪里1.1、什么是红黑树1.2、红黑树比AVL树好在哪里&#xff1f; 二、红黑树的模拟实现2.1、红黑树的插入2.2、仅变色调整2.3、变色单旋调整2.4、变色双旋调整 一、什么是红黑树以及红黑树好在哪里 1.1、什么是红黑树…

Docker容器网络模式

1.none网络 1&#xff09;使用默认网络模式创建一个BusyBox容器&#xff0c;用于对比none网络模式&#xff1b; 测试网络&#xff0c;可以正常连接外网。 2&#xff09;再创建一个none网络模式的BusyBox容器&#xff1b; 测试网络连接&#xff0c;无法连接外网。 总结&#x…

深入了解Spring Boot中@Async注解的8大坑点

文章目录 1. 缺少EnableAsync注解2. 异步方法需独立3. 不同的异步方法间无法相互调用4. 返回值为void的异步方法无法捕获异常5. 外部无法直接调用带有Async注解的方法6. Async方法不适用于private方法7. 缺失异步线程池配置8. 异步方法与事务的兼容结语 &#x1f389;深入了解S…

Ros报错:The Plugin for class ‘jsk_rviz_plugin/Plotter2D‘ failed to load

一般出现这种情况&#xff0c;是提醒Ros缺少某种库&#xff1a; 图中显示的错误是说明少了jsk_rviz_plugins库&#xff0c;他是一个提供原始rviz插件的包。 解决办法是安装相应的库与插件&#xff1a; #根据自己ROS的版本选择相应的指令 # ubuntu20.04:noetic sudo apt-get i…

RabbitMQ消息的应答

消息的应答机制 消费者完成一个任务可能需要一段时间&#xff0c;如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了&#xff0c;会发生什么情况。RabbitMQ 一旦向消费者传递了一条消息&#xff0c;便立即将该消息标记为删除。在这种情况下&#xff0c;突然有个…

计算机视觉:使用dlib实现人脸检测

1 dlib介绍 Dlib是一个广泛使用的开源库&#xff0c;在计算机视觉和机器学习领域具有重要影响。它是由Davis King在2002年开发&#xff0c;主要用C语言编写&#xff0c;但也提供了Python接口。Dlib结合了高效的算法和易用性&#xff0c;使其成为学术界和工业界的热门选择。 1.…

SpringBoot项目启动后自动停止了?

1 现象 2023-11-22T09:05:13.36108:00 DEBUG 17521 --- [ main] o.s.b.a.ApplicationAvailabilityBean : Application availability state LivenessState changed to CORRECT 2023-11-22T09:05:13.36208:00 DEBUG 17521 --- [ main] o.s.b.a.Applicat…