【操作系统和计网从入门到深入】(二)进程

前言

在这里插入图片描述
这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整性,大家可以放心订阅~

进程相关概念

文章目录

  • 前言
  • 进程相关概念
    • 1. 基本理念
    • 2. 进程的描述
      • 2.1 为什么需要pcb
      • 2.2 什么是pcb
    • 3. 查看进程
    • 4. 在程序中pid
    • 5. 父进程是什么
    • 6. 创建子进程
        • 创建进程的时候,OS要干嘛?
        • cpu的运行队列 run_queue
    • 7. 进程状态
    • 8. 状态优先级
    • 9. 环境变量
    • 10. 地址空间
      • 10.1 什么是地址空间
      • 10.2 地址空间是如何设计的
      • 10.3 扩展内容(比较难理解)
      • 10.4 为什么要有地址空间的三个理由
        • 10.4.1 理由一
        • 10.4.2 理由二
        • 10.4.3 理由三
      • 10.5 重新理解挂起

1. 基本理念

重要理论:先组织再描述:struct结构体

在操作系统内部,一定存在大量的数据结构和算法

2. 进程的描述

2.1 为什么需要pcb

为了描述每一个进程,Linux内核会给每一个进程创建一个结构体:PCB

PCB结构体包含了该进程的属性!

struct PCB
{// 属性数据,进程全部的属性数据,如pid// ... struct PCB* next;struct PCB* prev;
};

对进程的管理,变成了对进程PCB结构体链表的增删查改!

什么是进程:进程=对应的代码数据+进程对应的PCB结构体

2.2 什么是pcb

在linux中,叫task_struct

里面会有这些内容。

是一个双链表!

3. 查看进程

表头也可以带上

ps axj | head -1 && ps axj | grep myproc

top命令也可以查看进程

Linux系统下存在一个目录记录进程的信息。

/proc # 这个目录下都是进程的信息

在这个目录下,都是进程的属性。

我们可以看下里面的信息。

事实上,/proc目录是动态的,多一个进程就会多一个目录,少一个进程就会少一个目录。

4. 在程序中pid

在程序中如何获得pid呢?

getpid() // 这是我们人生中第一个系统调用接口

5. 父进程是什么

ps axj 一下,发现父进程是bash

bash是shell命令行外壳程序

很熟悉了这些。

6. 创建子进程

fork

fork()

返回值:

  • fork失败,返回-1
  • fork成功:给父进程返回子进程的pid,给子进程返回0

为什么会有两个返回值呢?不是只能返回一个吗?后面再说。

我们简单写一个代码。

第二个为什么被执行了两次?

因为不加判断,父进程和子进程都会执行。

复习到后面就会知道,创建子进程的时候,这份代码是被复制了的!

所以第二句打印语句,父子进程共享。

我们加上一个判断,就能把子进程和父进程分开来!

创建进程的时候,OS要干嘛?

本质,创建一个新的task_struct,然后这里里面的字段,有一些是复制父进程的,有一些事自己的。

cpu的运行队列 run_queue

进程调度本质上就是调度程序,在run_queue里面挑选一个task_struct来执行!

但是这个运行队列也不是按一般顺序的,这个是调度程序决定的!

7. 进程状态

具体可以看博客。

进程状态|操作系统|什么是pcb|什么是僵尸进程 |什么是孤儿进程 【超详细的图文解释】【Linux OS】_pcb结构体-CSDN博客

后台运行一个进程

./test & 

8. 状态优先级

状态优先级 = 老的优先级 + nice值

PRI就是优先级,越小越先执行

NI就是nice值

9. 环境变量

比较熟了,不再赘述。

要改可以用export

但是要记得把之前的带上

注意,环境变量的组织方式是一个字符指针数组

可以用程序打印所有环境变量。

第一种获取方式:

第二种获取方式:

略。不常用,其实第一种也不常用,第三种才常用。

main函数的第三个参数,也就是环境变量参数,是从哪里来的?

一般都是父进程中继承下来的

10. 地址空间

10.1 什么是地址空间

我们在所有的语言里面提到的地址的概念,本质上都是一个虚拟地址,而不是物理地址。

页表映射,现在只知道大概,不知道细节,所以这一节简单复习一下。

这个结构是可以用代码进行验证的。

// 验证地址空间的栈结构
int g_unval;     // 未初始化的全局变量
int g_val = 100; // 已经初始化的全局变量
int main(int argc, char *argv[], char *env[])
{printf("code addr: %p\n", main);              // 代码块位置printf("init global addr: %p\n", &g_val);     // 初始化全局变量printf("uninit global addr: %p\n", &g_unval); // 未初始化全局变量char *heap_memory = (char *)malloc(10);printf("heap addr: %p\n", heap_memory); // 堆上的空间printf("stack addr: %p\n", &heap_memory); // 栈上的空间for (int i = 0; i < argc; i++){printf("argv[%d]: %p\n", i, argv[i]);}for (int i = 0; env[i]; i++){printf("env[%d]: %p\n", i, env[i]);}return 0;
}

10.2 地址空间是如何设计的

其实就是给各个进程画饼。

先描述后组织!

如果我们可以直接访问物理内存的话,其实是特别不安全的。

所以我们构建了映射机制。

如何理解地址的划分? — 其实就是一个简单的struct结构体就行了。

struct myroom
{int __start;int __end;
};

其实地址空间的各个区域,也是通过这个方式进行划分的。

struct addr_room {int code_start; int code_end;int init_start; int init_end;int uninit_start; int uninit_end;int heap_start; int heap_end; //...其他属性
}

现在我们又可以知道,task_struct里面的又一个字段了! — mm_struct* mm

地址空间和页表(用户级)是每一个进程都私有一份的,只要保证,每一个进程的页表,映射的是物理内存的不同区域,我们就能做到,进程之间不会互相干扰进程的独立性。

回答一个遗留问题:return两个不同的值是怎么回事?

Return会被执行两次

Return的本质不就是对值进行写入吗? – 此时发生了写时拷贝!

所以两个进程各自其实在物理内存中,有属于自己的变量空间!只不过是在用户层面用同一个变量(虚拟地址!)来标识了!

10.3 扩展内容(比较难理解)

10.4 为什么要有地址空间的三个理由

10.4.1 理由一

可以有效保护物理内存,禁止非法映射

10.4.2 理由二

因为有地址空间的存在,因为有页表的映射,我们的物理内存中,是不是可以对未来的数据进行任意位置的加载?

当然可以!

首先,物理内存的分配,可以和进程管理完全解耦!

所以我们newmalloc的时候都是申请虚拟地址空间。

紧接着一个问题:如果我们申请了物理空间,但是又不马上使用,是不是造成了空间的浪费呢?当然是的!

所以事实上,OS是非常聪明的,你虽然malloc了100个字节,但是我可以一个都不给你!

而你去访问或者使用这100个字节的事哦呼,下面的物理地址空间的相关管理算法才把这个100字节分给你,再让你访问!但是你上层是0感知的!

这个叫做延迟分配的策略!

那么,OS是如何知道,一些内存空间虽然在虚拟上给了,但是物理上还 没给呢?这里有个技术叫做 —— 缺页中断!(后面我们再完善这个概念)

10.4.3 理由三

因为物理内存中理论上可以任意位置加载,那么是不是物理内存中的几乎所有的数据和代码在内存是乱序的?

但是,因为页表的存在,它可以进行映射!

那么是不是在进程视角所有的内存分布, 都可以是有序的?

是的! 地址空间+页表的存在可以将内存的分布有序化!

比如说:

我一个进程看到的,是一个连续的0-ffff的地址,但是事实上,在物理上,这个可能是分散的,分块的哦!

但是我进程需要知道这些吗?根本不需要care,我只知道,我用的是0-ffff的连续的地址就行了,底层是怎么样的,我根本不需要知道!

10.5 重新理解挂起

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

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

相关文章

【docker 】 安装docker(centOS7)

官网 docker官网 github源码 官网 在CentOS上安装Docker引擎 官网 在Debian上安装Docker引擎 官网 在 Fedora上安装Docker引擎 官网 在ubuntu上安装Docker引擎 官网 在RHEL (s390x)上安装Docker引擎 官网 在SLES上安装Docker引擎 最完善的资料都在官网。 卸载旧版本 …

【微信支付】商品支付流程实例

微信支付流程实例 0.准备 三种支付方式的流程梳理可见&#xff1a;微信支付三种常见支付方式流程梳理 微信支付准备过程中的重要参数&#xff1a; 选择【接入模式】参数申请&#xff1a; 【AppId】【商户号 mchid】完成以上两项参数的申请后&#xff0c;还需要绑定 AppId 与…

【操作系统到计网从入门到深入】(一)Linux基础知识预备

前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记&#xff0c;所以如果是博主比较熟悉的知识点&#xff0c;博主可能就直接跳过了&#xff0c;但是所有重要的知识点&#xff0c;在这个专栏里面都会提到&#xff01;而且我也一定会保证这个专栏知识点的完整性&…

开源框架Apache NiFi调研

开源框架Apache NiFi调研 NiFi背景介绍一、什么是NiFi1.1 Apache NiFi特点&#xff1a;流管理、易用性、安全性、可扩展的体系结构和灵活的伸缩模型。1.2 Apache NiFi特性1.2 Apache NiFi核心概念1.3架构 二、NiFi的诞生&#xff0c;要致力于解决的问题有哪些&#xff1f;三、为…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

class077 区间dp-下【算法】

class077 区间dp-下【算法】 算法讲解077【必备】区间dp-下 code1 括号区间匹配 // 完成配对需要的最少字符数量 // 给定一个由’[‘、’]‘、’(‘&#xff0c;’)‘组成的字符串 // 请问最少插入多少个括号就能使这个字符串的所有括号正确配对 // 例如当前串是 “([[])”&a…

【触想智能】工业显示器的日常维护及分类知识分享

工业显示器不同于普通商业显示器&#xff0c;它的结构比较复杂&#xff0c;如果在使用的过程中出现产品故障&#xff0c;我们怎么处理呢?今天小编为大家介绍工业显示器日常维护以及分类方面的知识&#xff0c;希望对大家有所帮助。 1、 工业显示器整机无电。这其实是一个非常简…

2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

新型生成式 AI 助手 Amazon Q 为 IT 专业人士与开发人员提供有力支持(预览版)

今天&#xff0c;我们发布 Amazon Q 预览版&#xff0c;这是一款专用于企业级业务的全新生成式 AI 助手&#xff0c;可根据客户的业务量身定制。 Amazon Q 为开发人员和 IT 专业人员带来了多种支持功能。现在&#xff0c;使用 Amazon Q&#xff0c;即可在亚马逊云科技上构建应…

计算机操作系统7

动态分区分配算法&#xff1a; 2.页表的逻辑地址和页内偏移量的计算 3. 两级页表 4.分段、分页管理的对比 5.传统存储方式的特征和缺点 6.虚拟存储 7.请求分页管理方式

2024世界燕窝滋补品展|上海燕博会推荐品牌天健燕窝集团-为消费者带来好燕窝!

天健燕窝集团拥有27年燕窝进出口贸易经验。是最早加入经营正规燕窝业务的企业之一&#xff0c;业务范围遍布全中国&#xff0c;2015 年至2019 年连续5年燕窝进口量全国第一。 一年一届的世界燕窝及天然滋补品博览会暨世界滋补生态发展大会&#xff08;简称上海燕博会&#xff…

IP与以太网的转发操作

TCP模块在执行连接、收发、断开等各阶段操作时&#xff0c;都需要委托IP模块将数据封装成包发送给通信对象。 网络中有路由器和集线器两种不同的转发设备&#xff0c;它们在传输网络包时有着各自的分工。 (1)路由器根据目标地址判断下一个路由器的位置 (2)集线器在子网中将网…