【Linux进程的知识点】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录

前言

操作系统的知识补充

我们来理解一个用户操作接口:

进程的理解

进程的基本概念

描述进程-PCB

task_struct-PCB的一种

task_ struct内容分类

进程的task_struct本身内部的属性有哪些?

1、启动

查找 pid 的方式:

方法一:

方法二:

2、进程创建的代码方式

我们为什么要创建子进程?

总结


前言

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!


提示:以下是本篇文章正文内容,下面案例可供参考

操作系统的知识补充

我们来理解一个用户操作接口:

举个例子:

年轻人去银行办理业务,因为是年轻人,能力比较强,知道怎么办理,就可以直接找工作人员去办理;而老年人属于弱势群体,对于这些不熟悉,此时银行的工作经理就来了,他会帮助老年人准备好各种各样的手续,所有资料都准备好了,然后再让柜台前的工作人员来办理。

系统调用接口是操作系统提供的,用户必须懂一点操作系统,才可以直接通过系统调用的接口来访问操作系统;而有的用户对操作系统不是很了解,操作系统提供的接口确实很难,这时可以通过用户操作接口,来访问系统调用接口 ----> 访问操作系统。用户操作接口(库,例如:c/c++标准库)是系统调用接口的封装。

代码不具有跨平台性根本原因:

你直接访问操作系统的系统调用接口,平台不同,操作系统不同,系统调用接口、返回值,函数名都不同,所以不具有跨平台性。

c/c++具有跨平台性:

在用户操作接口方面:linux下给c语言提供了linux版的库函数,在windows中给c语言提供了windows版的库函数,大家向上提供的都是printf函数;系统调用接口方面:linux用linux的系统调用接口帮助你向显示器打印,windows下用windows的系统调用接口帮助你完成向显示器打印。

进程的理解

struct PCB{}在操作系统中,我们一般给它叫做内核数据结构。

没开机的话,操作系统(OS)也是储存在磁盘当中的一个二进制文件。可执行程序没有运行起来的话,一般都在磁盘中。

开机的时候,操作系统是第一个加载到内存中的一个软件。内存数据块是在我们的操作系统内部的。

开机的时候,都要等上十几秒,是在磁盘中的操作系统加载到内存当中;然后当你创建进程时,一方面是把你的可执行程序和数据加载到内存当中,另一方面,需要在我们对应的操作系统内部malloc出来对应的结构体,你有几个进程,就malloc几个struct PCB{}

我们在整个操作系统内部里面对进程的管理,就变成了对struct PCB的操作。

我们可以转换成学校管理学生:

内存 ----->学校;操作系统 ------> 教务管理系统;学生 -----> 加载到内存中的代码和数据。

你怎么证明你是学校的学生呢?

你的属性信息(struct PCB)在学校的教务管理系统中。操作系统对于进程的管理,本质是对 struct PCB{}的管理,而并非是对你的可执行程序加载到内存之后,对可执行程序做管理。

为什么要有PCB呢?

OS操作系统要对进程做管理!!!任何管理:先描述,在组织

PCB是对操作系统学科里面所有进程控制块的统称。

Linux进程控制块的具体称呼:struct task_struct。

调度运行进程,本质就是让进程控制块 struct PCB{} 进行排队!!!

如何理解进程动态运行?

只要我们的进程task_struct,将来在不同的队列中,进程就可以访问不同的资源。

进程的基本概念

  • 课本概念:程序的一个执行实例,正在执行的程序等。
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

task_struct-PCB的一种

  • 在Linux中描述进程的结构体叫做task_struct。
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

task_ struct内容分类

  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

进程的task_struct本身内部的属性有哪些?

1、启动

  • 1、./xxxx,本质就是让系统创建进程并运行 ----- 我们自己写的代码形成的可执行 == 系统命令 == 可执行文件。在Linux中运行的大部分执行操作,本质都是运行进程!!!
  • 2、每一个进程都要有自己的唯一的标识符,叫做进程 pid。

查找 pid 的方式:

方法一:

方法二:

一个进程,不通过ps指令,想知道自己的pid,该如何做呢?

用户不能对操作系统直接访问,要通过系统调用接口来进行访问,我们就学到了第一个系统调用接口 man getpid

  • 3、ctrl + c 就是在用户层面上终止进程,kill -9 pid 可以直接用来杀掉进程。

2、进程创建的代码方式

父进程创建一个子进程,本质是系统多了一个进程,多了一个进程,就是多了:

1、内核 task_struct;2、有自己的代码和数据。

父进程的代码和数据是从磁盘加载来的,子进程的代码和数据呢?

默认情况继承父进程的代码和数据。

我们为什么要创建子进程?

我们想要子进程执行和父进程不一样的代码。

父进程创建一个子进程,创建一个进程是操作系统内多了一个进程,多了一个进程,其实就是多了一个struct PCB{}和该进程的代码和数据;创建一个进程就是创建一个struct PCB{}的内核数据结构,可是用户没有任何权利直接对内核数据结构(操作系统)进行任何的增删查改,所以为了创建进程,操作系统就得给我们提供一个系统调用接口(fork)。

fork()的返回值:

如果fork()函数成功了,会返回子进程的pid(pid > 0)给父进程,返回0给子进程;

如果fork()函数失败的话,-1就返回给父进程,没有子进程创建成功,错误码被设置。

fork()之后的代码,其实都被父、子进程共享的,只不过这里做了判断,子进程通过fork()进入子进程的执行流当中;父进程进入父进程的执行流当中。

父进程和子进程是并列的,退出谁,也不会影响另一个。

怎么理解fork()会有两个返回值,返回两次?

fork()是一个函数,是由操作系统(OS)提供的,fork()是一个系统调用接口。当我们执行到 return 的时候,函数是不是已经执行完了?执行到 return 的时候,子进程已经存在了,并且子进程可以被调度了,return 也是代码。我们之前说的 fork()之后,代码共享,这种说法不太准确,而是在fork()内部,前半部分代码由我们的父进程创建子进程,执行到 return 的时候,已经是两个执行流了,所以父进程被调度一次,子进程被调度一次,各自执行一次 return ,return 被执行两次。其实不是 fork()之后的代码,而是 fork()从后半部分代码和 return 之后的所有代码都是被大家共享的。

进程一定要做到:进程具有独立性。

进程 = 内核数据结构task_struct(父、子进程是独立的,有各自的 pid)+ 进程的代码(只读的!所以父子之间可以共享代码)+ 进程的数据(原则上:数据要分开,这个之后再细谈)

样例代码:一次创建多个进程

每个进程在启动的时候,会记录自己当前在那个路径下启动。

/根目录下有一个 proc 目录,proc 目录会不时地把内存当中的进程信息,给我们挂接到文件当中,让我们以文件的方式可以看到对应的进程的相关信息。

如果我们一个进程正在执行,我们把进程的可执行程序删除掉,但是进程依旧在运行,这是为什么呢?

因为这里的删除只是删除的是磁盘中的代码,而可执行程序已经加载到内存当中了,所以进程还是在运行,当然还要看程序的大小,当可执行程序非常大时,进程一开始还是好的,但是过一段时间后,进程会出错。

man chdir 更改一个调用进程的当前的工作路径。


总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

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

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

相关文章

算法刷题Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

目录 0 引言1 反转字符串1.1 我的解题1.2 2 反转字符串II2.1 解题 3 替换数字3.1 双指针法 4 翻转字符串里的单词4.1 我的解题思路4.2 另一种思路 5 右旋转字符串5.15.2 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题…

什么是序列化?为什么需要序列化?

1、典型回答 序列化(Serialization)序列化是将对象转换为可存储或传输的形式的过程(例如: 将对象转换为字节流) 反序列化(Deserialization) 是将序列化后的数据(例如: 二进制文件)转换回原始对象的过程。通过反序列化,可以从存储介质 (如磁盘、数据库) 或通过网络…

程序员们的“薪饭碗”鸿蒙迎来“薪”的就业岗位

随着科技行业的不断创新和发展,程序员们所面对的技术挑战和机遇也在不断增加。近年来,鸿蒙操作系统的崛起为程序员们提供了新的就业机会和发展前景。 鸿蒙系统作为一种全新的操作系统,在市场上占据一席之地。在当前就业市场中,鸿…

网络套接字-UDP服务器

一 预备知识 1 端口号和进程id 主机间的数据传输本质是两个进程在通信,就像是我们打开抖音刷视频,视频不是都保存在手机上的,而是服务器发送给你的,这里就是用到了网络。 那如何保证把数据给指定进程呢? 就是用端口号去标识主机中…

[实战]API防护破解之签名验签

前言: 传统的接口在传输的过程中,是非常容易被抓包进行篡改,从而进行中间人攻击。这时候我们可以通过对参数进行签名验证,如果参数与签名值不匹配,则请求不通过,直接返回错误信息,从而防止黑客…

Java错误:微服务报错Cannot execute request on any known serve

🐔问题内容 报Cannot execute request on any known server 这个错:连接Eureka服务端地址不对。 🐔解决方式 检查.yml文件或者.properties文件配置 下划线下划线后面的小写字母等同于去掉下划线大写下划线后面的字母(驼峰原则&am…

网络安全从业人员何去何从

从2024年1月1日开始到今天,基本没有真正放下自己休息过一天。可能很多人会说是卷,其实真正的原因是压力。不仅仅是生活压力还有行业压力。 今年这个行业让很多人开始感到了迷茫,不仅是股市的低迷,更多的来自于各大公司不断的因为…

Linux学习:基础开发工具的使用(1)

目录 1. Linux软件包管理器:yum工具1.1 yum是什么(软件商城)1.2 yum的使用1.3 yum的背景生态 2. 项目开发与集成开发环境3. vim编辑器3.1 vim编辑器的常见模式与模式切换3.3 vim编辑器的使用3.3.1 命令模式下的常见命令:3.3.2 vim…

【安装mysql】centos7 安装mysql

文章目录 1.卸载不用的环境2.获取mysql官方yum源3.开始安装4.常规登录4.1方法一:【博主可以】4.2方法二:直接用client登录4.3方法三:修改配置文件 5.设置配置文件5.1配置my .cnf5.2开机自启动 1.卸载不用的环境 查看有无mysql/mariadb ps ax…

优雅的记录日志,拒绝打印模糊信息导致bug定位难

想必大家都有过这样的经历:在项目中遇到报错需要紧急修复时,却因为日志信息模糊不清,无法迅速准确地定位到错误源头,这确实让人感到十分苦恼和无奈。 在新入职一家公司并着手修改遗留bug时,经常发现之前的开发者并未记…

Java Day9 Stream流

Stream流 1、认识2、Stream流使用步骤3、如何获取Stream流4.Stream流的中间方法5、 Stream流终结方法 1、认识 2、Stream流使用步骤 3、如何获取Stream流 //list获取stream流List<String> listnew ArrayList<>();Collections.addAll(list,"崔十一","…

NUMA简介

NUMA 1 什么是NUMA 早期的计算机&#xff0c;内存控制器还没有整合进 CPU&#xff0c;所有的内存访问都需要经过北桥芯片来完成。如下图所示&#xff0c;CPU 通过前端总线&#xff08;FSB&#xff0c;Front Side Bus&#xff09;连接到北桥芯片&#xff0c;然后北桥芯片连接到…

小型校园网配置笔记

1&#xff0c;搭建网络拓扑图 LSW1:三层交换机命令&#xff1a; <Huawei>sys [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]vlan batch 10 20 30 40 100 101 [Huawei]int vlan 10 [Huawei-Vlanif10]ip add 192.168.10.254 24 …

vivado FIFO IP核的使用

FIFO是先进先出的数据缓存器。起到跨时钟域的数据缓冲作用&#xff0c;一般在实际应用过程当中采用异步读写的方式&#xff0c; 选择的配置如下 封装IP核 module clk_wiz(input resetn ,input clk_in1 ,output clk_out1 ,output clk_out2 …

VScode Error Lens插件

安装完成之后&#xff0c;当我们输入一些错误的语法格式的时候&#xff0c;它都会有一些提示&#xff01; 一开始是英文提示 修改为中文提示 设置搜索 typescript.local

力扣串题:字符串中的第二大数字

此题的精妙之处在于char类型到int类型的转化&#xff0c;需要运算来解决 int secondHighest(char * s) {int max1-1;int max2-1;int szstrlen(s);int i 0 ;for(i0;i<sz;i){if(s[i]>0&&s[i]<9){if((s[i]-0)>max1){max2max1;max1s[i]-0;}else if((s[i]-0)&l…

VUE/HTML网页在线编辑AutoCAD DWG文档

猿大师办公助手作为一款专业的网页在线编辑Office插件&#xff0c;不仅支持微软Office、金山WPS及永中Office完整嵌入到最新版Chrome、Ddge、Firefox等浏览器中使用&#xff0c;猿大师还可以把Autodesk的AutoCAD、DWG TrueView、Design Review等软件嵌入到浏览器网页中&#xf…

写给新手的单元测试框架unittest运行的简单问题

当使用unittest框架编写和运行单元测试时&#xff0c;需要遵循以下步骤&#xff1a; 1、导入unittest模块&#xff1a;在代码中首先导入unittest模块。 import unittest 2、创建测试类&#xff1a;创建一个继承自unittest.TestCase的测试类。该类将包含一系列测试方法。 clas…

《ElementPlus 与 ElementUI 差异集合》icon 图标使用(包含:el-button,el-input和el-dropdown 差异对比)

安装 注意 ElementPlus 的 Icon 图标 要额外安装插件 element-plus/icons-vue. npm install element-plus/icons-vue注册 全局注册 定义一个文件 element-icon.js &#xff0c;注意代码第 6 行。加上了前缀 ElIcon &#xff0c;避免组件命名重复&#xff0c;且易于理解为 e…

深入解析C++树形关联式容器:map、set及其衍生容器的使用与原理

文章目录 一、引言二、关联式容器的中的 paira.pair 的创建及使用b.pair 间的比较 三、 map 与 set 详解1. map 的基本操作2. set 的基本操作3.关联式容器的迭代器 四、 multimap 与 multiset 的特性五、关联式容器的使用技巧与注意事项1. 键值类型的选择与设计2. 自定义比较函…