2024年Linux最全【Linux】进程概念(下篇) —,2024年最新IDEA太强悍了

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

printf("code addr: %p\n", main);
const char\* p = "hello bit!";
printf("read only: %p\n", p);
static int a = 5;
printf("static global val: %p\n", &a);
printf("global val: %p\n", &g_val);
printf("global uninit val: %p\n", &g_unval);
char\* q1 = (char\*)malloc(10);
char\* q2 = (char\*)malloc(10);
printf("heap addr: %p\n", q1); 
printf("heap addr: %p\n", q2); 
printf("p stack addr: %p\n", &p);
printf("q1 stack addr: %p\n", &q1);
printf("args addr: %p\n", argv[0]);
printf("args addr: %p\n", argv[argc - 1]);
printf("env addr: %p\n", env[0]);

return 0;                                                                                                                                                                           

}


![在这里插入图片描述](https://img-blog.csdnimg.cn/11655634455e436982b71542d23b82a9.png#pic_center)


`从结果我们得知:`



> 
> * **栈区地址是由`高到低`增长的**
> * **堆区地址是由`低到高`增长的**
> 
> 
> 



> 
> **细心的小伙伴就会发现,两个args addr的地址为什么是一样的呢?那我们再进一步验证一下**
> 
> 
> 


`加上选项`



-a -b


![请添加图片描述](https://img-blog.csdnimg.cn/c0b0c9f34aeb4fb0b826372144fdf337.png)



> 
> **根本原因是原本只有一行命令行参数,如果加上了选项就不一样了**
> 
> 
> 




---


## 🎃什么是进程地址空间


`直接上代码观察`



#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int g_val = 0;

int main()
{
printf(“begin…%d\n”, g_val);
pid_t id = fork();
if(id == 0)
{
int count = 0;
while(1)
{
printf(“child pid: %d, ppid: %d, [g_val: %d][&g_val: %p]\n”, getpid(), getppid(), g_val, &g_val);
sleep(1);
count++;
if(count == 5)
{
g_val = 100;
}
}
}
else if(id > 0)
{
while(1)
{
printf(“father pid: %d, ppid: %d, [g_val: %d][&g_val: %p]\n”, getpid(), getppid(), g_val, &g_val);
sleep(1);
}
}
else
{
//TODO
}
return 0;
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/234410c3e8074e9f86c01c5d1a9e3544.png#pic_center)


**`我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:`**



> 
> * **变量内容不一样,所以父子进程输出的变量绝对不是同一个变量**
> * **但地址值是一样的,说明,该地址绝对不是物理地址!**
> * **在Linux地址下,这种地址叫做`虚拟地址`**
> * **我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理`(OS必须负责将虚拟地址转化成物理地址。)`**
> 
> 
> 



> 
> **可以知道`&g_val`一定不是物理地址(`真正在内存中的地址`),因为同一个物理地址处怎么可能读取到的是不同的值。所以我们断言曾经`所看到的任何地址都不是物理地址`,而这种地址本质是虚拟地址,它是由操作系统提供的,那么操作系统一定要有一种方式帮我们把`虚拟地址转换为物理地址`,因为数据和代码一定在物理内存上存储,这是由`冯 • 诺依曼体系结构`规定的。**
> 
> 
> 




---


## 🎃理解进程地址空间



> 
> **地址空间在 Linux 内核中是一个mm\_struct结构体,这个结构体没有告诉我们空间大小,但是它告诉我们空间排布情况,比如`[code_start(0x1000), code_end(0x2000)]`,其中就会有若干`虚拟地址`,这是因为`操作系统为了把物理内存包裹起来`,给每个进程画的一把尺子,这把尺子我们叫进程地址空间。进程地址空间是在进程和物理内存之间的一个软件层,它通过mm\_struct这样的结构体来模拟,让操作系统`给进程画大饼`,每一个进程可以根据地址空间来划分自己的代码。进程地址空间本质是进程看待物理内存的方式,它是抽象出来的概念,其中 Linux 内核中是用mm\_struct数据结构来表示的。这样的话每个进程都认为自己独占系统内存资源(好比每个老婆都认为自己独占10亿);区域划分的本质是将线性地址空间划分成为一个一个的区域[start, end];而所谓的虚拟地址本质是在[start, end]之间的各个地址。**
> 
> 
> 


![在这里插入图片描述](https://img-blog.csdnimg.cn/a135769d1e0b4e38ae37d45d9584ee4c.png)




---


## 🎃Linux2.6内核进程调度队列 —— 了解


### 👻进程队列数据结构图


![在这里插入图片描述](https://img-blog.csdnimg.cn/0825f6b7782743b193263cf8607e6a58.png)




---


### 👻一个CPU拥有一个runqueue



> 
> **如果有多个 CPU 就要考虑进程个数的负载均衡问题。**
> 
> 
> 


### 👻优先级



> 
> * **普通优先级:100~139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)**
> * **实时优先级:0~99(不关心)**
> 
> 
> 


### 👻活动队列



> 
> * **时间片还没有结束的所有进程都按照优先级放在该队列**
> * **nr\_active: 总共有多少个运行状态的进程**
> * **queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!**
> 
> 
> 



> 
> **`从该结构中,选择一个最合适的进程,过程是怎么的呢?`**
> 
> 
> * 从0下表开始遍历queue[140]
> * 找到第一个非空队列,该队列必定为优先级最高的队列
> * 拿到选中队列的第一个进程,开始运行,调度完成!


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值