【Linux系统】进程概念创建进程进程标示符

什么是进程?

操作系统中, 进程可以同时存在非常多的。根据我们之前谈的操作系统具有“管理”的特性, 那么就有,既然要管理,就要 --- 先描述,在组织!!!

 由冯诺依曼体系结构我们知道磁盘中的文件都是要加载到内存然后由内存与CPU交互完成一些任务的。

所以其实当我们运行一些程序时就会为我们创建一个进程。

这个进程是什么样的?

那么当我们运行我们写出来的c/c++代码时。

首先从磁盘中把我们的代码和数据加载到内存中

一个进程就要有一个PCB(process control block)

这个PCB要在内存中加载的操作系统中malloc出对应的空间,实质上就是一个结构体类型,

里面包含了各种进程有关的属性,并且有一个指针可以指向自己的代码和数据!!!

那么我们得出一个结论:进程 = PCB + 程序的代码和数据

 在后面我们就可以把内存中加载的操作系统内部进行各种PCB的管理工作,也就是说

我们对进程的管理就转变成了我们对链表(各种数据结构,不一定就是链表)的增删查改!!!

具体到Linux中的进程是什么样的?

 我们前面知道了:进程 = PCB + 自己的代码和数据

这里的PCB是一个统称,因为我们将来要接触各种各样的操作系统, 他们的PCB实现当然是不同的,名字可能也有差异。

那具体到Linux中是怎么样的呢?

struct task_struct

{

        //Linux控制块

}

这里的task_struct就是具体的称呼!!!

 下面就理解一个概念:如何理解进程动态运行?

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

 故有:调度运行进程,本质就是让进程块task_struct进行排队!!!

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

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

 这些是task_struct内部的一些属性名称,我们后续都将一一学习。

如何启动一个进程?

 a. 

我们在Linux中的./xxx本质就是让系统启动进程并运行 === 我们写的代码形成可执行 ===

系统命令 === 可执行文件。

所以:在Linux中运行中的大部分执行操作,本质都是运行进程!!!

 我们在Linux中也可以查看进程

通过ls /proc命令

进程的标识符

每个进程都有自己的唯一标识符,叫做进程pid

一个进程,想知道自己的pid???

如何做呢?

那么问题来了,我们能直接访问操作系统来查询自己的pid吗?答案是不能的

我们已经讲过用户想要访问操作系统的内容就必须要通过操作系统提供的系统调用接口来获取内部信息!!!

 那么如何获取我们进程的pid呢?

就使用getpid这个接口即可获取到我们需要的进程pid信息!!!

 

  #include<stdio.h>#include<sys/types.h>#include<unistd.h>int main(){pid_t pid = getpid();printf("pid:%d\n", pid);sleep(1);                                                                                     return 0;                                                  }     

 

 我们来创建一个一直在跑的进程,方便我们查看进程

  1 #include<stdio.h>  2 #include<sys/types.h>  3 #include<unistd.h>  4   5 int main()  6 {  7     pid_t pid = getpid();8 9     while(1)                                                                                      10     {                           11         printf("pid:%d\n", pid);12         sleep(1);13     }14              15     return 0;16 }

 

 这是我们的进程在运行,我们看到pid就是属性栏的第二列就是我们该进程自己的pid。

显然ctrl + c就是在用户层面终止程序

kill + -9 + pid 可以用来直接杀掉进程

进程创建的代码方式(重操作,轻原理 --- 后续会再次详谈进程创建)

 

 getpid():获取当前进程的pid

getppid():获取当前进程的父进程pid

在Linux中所有的进程又有一个统一的父进程,就是bash --- 命令行解释器

比较方便查看进程的一个xshell脚本:while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep ; sleep 1; done
 

而我们接下来要学习一个新的接口,他能够为我们创建子进程

fork();

 

 fork之后父子代码共享!!!

创建一个进程本质就是系统多了一个进程

多了个进程就是多个

1.内核task_struct

2.有自己的代码和数据

父进程的代码和数据是由磁盘加载而来的。

那么子进程的代码和数据呢???

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

 我们为什么要创建子进程,我们是要子进程执行和父进程不一样的代码

#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){ //child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else{ //father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}

 对于fork两个问题

1.同一个id,怎么可能即是0又是一个大于0的数

2.fork会有两个返回值,返回两次

对于第一个问题现在我们还不能很好的解释后续再谈

第二个问题

我们知道

进程 = 内核数据结构task_struct + 代码和数据

进程一定要独立,进程具有独立性

所以父子各自独立,原则上数据要分开

且代码是只读的

子进程会继承父进程的代码,又代码是只读的,所以fork函数内部必定是要先去创建子进程的

然后进行返回id,但我们知道子进程是完全继承父进程的代码的,故会返回两次值。

我们在后续可以一次性创建多个进程

进程的PCB中会记录自己对应的可执行程序的路径 -》 exe -> 路径

也会记录该进程当前的工作路径 -》 cwd -> 路径

 chdir("");这个函数可以改变我们的进程工作路径!!!

结论:每个进程在启动时都会记录自己在当下哪个路径启动,进程的当前路径!!!

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

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

相关文章

并发VS并行

参考文章 面试必考的&#xff1a;并发和并行有什么区别&#xff1f; 并发&#xff1a;一个人同时做多件事&#xff08;射击游戏队友抢装备&#xff09; 并行&#xff1a;多人同时处理同一件事&#xff08;射击游戏敌人同时射击对方&#xff09;

关于hook ntdll 代码详解

UNHOOK ntdll DWORD unhook() {//创建该结构体用于获取该dll的信息 将所有成员变量初始化为零MODULEINFO mi {};//获取当前内存的ntdll的句柄HMODULE ntdllModule GetModuleHandleA("ntdll.dll");//HANDLE(-1)表示获取当前进程的句柄 该函数用于获取该进程的信息G…

在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】

MySQL主从复制 MySQL主从复制介绍MySQL复制过程分成三步&#xff1a;1). MySQL master 将数据变更写入二进制日志( binary log)2). slave将master的binary log拷贝到它的中继日志&#xff08;relay log&#xff09;3). slave重做中继日志中的事件&#xff0c;将数据变更反映它自…

学点儿数据库_Day11_数据库简介、Sql单表、GROUP BY答疑

1 数据库简介 数据在内存&#xff1a; 优点&#xff1a;读写速度快 缺点&#xff1a;程序结束后数据丢失 保存到文件 优点&#xff1a;数据可以永久保存 缺点&#xff1a; 1、频繁的IO操作&#xff0c;效率不高 2、数据的管理非常不方便&#xff0c;需要把所有的数据整体都读…

云原生靶场kebernetesGoat、Metarget

靶场 文章目录 靶场kebernetesGoat靶场安装Docker in DockerSSRF漏洞容器逃逸到主系统Docker CIS 基线分析Kubernetes CIS 安全基线分析分析被部署挖矿软件的容器镜像获取环境信息Hidden in layersRBAC最低权限配置错误使用 Sysdig Falco 进行运行时安全监控和检测 Metarget ke…

C++类和对象、面向对象编程 (OOP)

文章目录 一、封装1.抽象、封装2.类和对象(0)学习视频(1)类的构成(2)三种访问权限(3)struct和class的区别(4)私有的成员变量、共有的成员函数(5)类内可以直接访问私有成员&#xff0c;不需要经过对象 二、继承三、多态1.概念2.多态的满足条件3.多态的使用条件4.多态原理剖析5.纯…

负氧离子监测站:创造健康生活环境

TH-FZ5在蓝天白云之下&#xff0c;那一座座高耸的全彩屏负氧离子监测站&#xff0c;如同一支支科技的绿芽&#xff0c;静静破土而出&#xff0c;为这片土地带来了新的生命力。这些现代化的设备不仅美化了环境&#xff0c;更是我们呼吸健康守护者&#xff0c;它们的存在让我们的…

初识云原生、虚拟化、DevOps

文章目录 K8S虚拟化DevOpsdevops平台搭建工具大数据架构 K8S master 主节点&#xff0c;控制平台&#xff0c;Master节点负责核心的调度、管理和运维&#xff0c;不需要很高性能&#xff0c;不跑任务&#xff0c;通常一个就行了&#xff0c;也可以开多个主节点来提高集群可用度…

Arduino+ESP8266+华为云物联网平台实现智能开关

前言 最近在做一个物联网项目&#xff0c;涉及到智能开关的开发。目前已经实现简单的TCP通信远程控制&#xff0c;但是考虑到后期的设备管理以及设备通信所需要的技术和服务器的维护成本&#xff0c;我决定将设备接入云平台。本文将详细阐述如何利用华为云的物联网平台&#x…

CI/CD实战-jenkins流水线 6

现最新版本没有该问题的出现 基于RBAC的身份授权&#xff1a; 安装插件&#xff1a; 新建测试用户 修改默认授权策略 新建的用户就没有任何权限 新建角色并授权 添加用户角色身份 pipeline 安装ssh agent插件 由于最新版的插件是有问题的&#xff0c;会有以下报错&#xff…

Memcached分布式内存对象数据库

一 Memcached 概念 Memcached 是一个高性能的分布式内存对象缓存系统&#xff0c;用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数&#xff0c;从而提高动态、数据库驱动网站的速度。 二 在架构中的位置 Memcached 处于前端或中间件后…

使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

一、前言 在业务系统开发过程中&#xff0c;我们必不可少的会使用数据库&#xff0c;在应用开发过程中&#xff0c;数据库连接信息往往都是以明文的方式配置到yaml配置文件中的&#xff0c;这样有密码泄露的风险&#xff0c;那么有没有什么方式可以避免呢&#xff1f;方案当然是…

怎样从录制好的视频中提取音频?分离音频只需几秒 音频提取

在当今数字化的世界中&#xff0c;视频与音频的结合已经成为我们生活中不可或缺的一部分。然而&#xff0c;有时我们可能只需要视频中的音频部分&#xff0c;这时候&#xff0c;如何从视频中提取音频就成了一个实用且常见的问题。本文将详细介绍几种常见的方法&#xff0c;帮助…

设计用于驱动12 V汽车接地负载,VN5E160ASTR、VND5E160MJTR、VND5E025AKTR、VND5E050ACKTR 单/双通道高侧驱动器

摘要 意法半导体VIPower系列高侧开关符合汽车应用要求&#xff0c;内嵌先进的控制功能&#xff0c;其新型保护机制适用于各种负载类型及额定功率。 此类开关是汽车系统的理想选择&#xff0c;如&#xff1a;接线盒、内部/外部照明、直流电机驱动等&#xff0c;并适用于任何需…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ 可定制化

工程项目管理软件是现代项目管理中不可或缺的工具&#xff0c;它能够帮助项目团队更高效地组织和协调工作。本文将介绍一款功能强大的工程项目管理软件&#xff0c;该软件采用先进的Vue、Uniapp、Layui等技术框架&#xff0c;涵盖了项目策划决策、规划设计、施工建设到竣工交付…

机器学习笔记(4)—逻辑回归(Logistic Regression)

文章目录 逻辑回归&#xff08;Logistic Regression&#xff09;分类问题假说表示判定边界代价函数简化的成本函数和梯度下降多类别分类&#xff1a;一对多 逻辑回归&#xff08;Logistic Regression&#xff09; 分类问题 分类问题中&#xff0c;我们要预测的变量 y y y是一…

Hive入门

什么是hive&#xff1f; - Hive是Facebook开发并贡献给Hadoop开源社区的。它是建立在 Hadoop体系架构上的一层 SQL抽象&#xff0c;使得数据相关人 员使用他们最为熟悉的SQL语言就可以进行海量数据的处理、 分析和统计工作 - Hive将数据存储于HDFS的数据文件映射为一张数据库…

【笔记】MJ Prompt

参数 --chaos 10 or --c 10, 0-10, defalut 0 --quality 1 or --q, 0.25-1, defalut 1 --iw 2, 0.5-2, --stylize 100 or --s 100, 0-1000, defalut 100 --cref URL --cw 100, 0-100stylize 风格化&#xff0c;MJ不同的出图模式&#xff0c;有默认的艺术风格&#xff0c;该值…

【jenkins+cmake+svn管理c++项目】windows修改jenkins的工作目录

jenkins默认的存放源码的workspace是&#xff1a; C:\Users\用户\AppData\Local\Jenkins\.jenkins\workspace。由于jenkins会拉取大量的源代码以及编译生成一些文件&#xff0c;我希望我能自己指定目录作为它的工作空间&#xff0c;放在这里显然不太合适。 那么修改目录的方式有…

跟张良均老师学大数据人工智能——数据挖掘集训营开营

集训营特色&#xff1a; 知识点深入浅出&#xff0c;实现以学促用 以业务内容为主线&#xff0c;数据挖掘技能嵌入 多行业项目实战&#xff0c;全面提升职业素养 全程线上辅导&#xff0c;助力熟练掌握技能 惊喜优惠&#xff1a; 限时“六折”&#xff01; 师傅带练 方向…