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

news2024/12/22 18:23:09

前言

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

进程相关概念

文章目录

  • 前言
  • 进程相关概念
    • 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.coloradmin.cn/o/1304085.html

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

相关文章

python——第十七天

方法重写(overwrite) 、方法覆盖(override )&#xff1a;在继承的基础上&#xff0c;子类继承了父类的方法&#xff0c;如果不能满足自己使用&#xff0c;我们就可以重写或覆盖该方法 函数重载(overload)&#xff1a; 在强数据类型的编程语言中(如Java、C、C等等): 函数名称…

高通平台开发系列讲解(USB篇)MBIM驱动详解

文章目录 一、数据结构二、源码分析三、adroid_mbim创建四、读写 /dev/adroid_mbim4.1、读gsi_ctrl_dev_read4.2、写gsi_ctrl_dev_write沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB网卡MBIM驱动。 一、数据结构 目录:drivers/usb/gadget/…

Python使用分段函数拟合数据

Python使用分段函数拟合数据 前言前提条件相关介绍实验环境使用分段函数拟合数据代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏…

【LeetCode】每日一题 2023_12_12 下一个更大元素 IV(堆,优先级队列/单调栈)

文章目录 刷题前唠嗑题目&#xff1a;下一个更大元素 IV题目描述代码与解题思路 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 时隔两天&#xff0c;LeetCode 每日一题重新开张&#xff0c;流感已经不能阻挡我的脚步了&#xff01; 题目&#x…

【FAQ】推送前台应用的通知处理功能没生效,如何进行排查?

一、前台应用的通知处理简介 在调用推送接口时可以设置“foreground_show”字段控制前台应用的通知栏消息是否通过NC展示。“foreground_show”默认值为“true”&#xff0c;应用在前台时由NC展示通知栏消息&#xff1b;当设置为“false”时&#xff0c;应用在前台时&#xff…

<习题集><LeetCode><链表><61/83/82/86/92>

目录 61. 旋转链表 83. 删除排序链表中的重复元素 82. 删除排序链表中的重复元素 II 86. 分隔链表 92. 反转链表 II 61. 旋转链表 https://leetcode.cn/problems/rotate-list/ public ListNode rotateRight(ListNode head, int k) {//k等于0&#xff0c;或者head为空&…

高效利用内存资源之动态内存管理详解

目录 一、为什么存在动态内存分配 二、动态内存函数的介绍 2.1malloc 2.2free 2.3calloc 2.4realloc 三、常见的动态内存错误 3.1对NULL指针的解引用操作 3.2对动态开辟空间的越界访问 3.3对非动态开辟内存使用free释放 3.4使用free释放一块动态开辟内存的一部分 3.…

GNSS 精密单点定位(PPP) 所需数据文件及格式说明

目录 1.PPP所需的数据文件 (1)PPP中必要文件&#xff1a; (2)其他非必要文件&#xff1a; (3)文件示例&#xff1a; 2.数据下载方式 (1)网址下载&#xff1a; (2)GAMP II-GOOD软件下载 1.PPP所需的数据文件 (1)PPP中必要文件&#xff1a; 文件 功能 •观测值文件&…

降采样方法对NCC得分的影响因素评估

定位算法原理 关于不同的定位场景,最适合使用的算法原理,Halcon的原理文档中描述如下: 在图案缩放可用忽略,图案纹理丰富的场景,适合采用基于互相关的匹配。 输入参考图像,搜索图像,参考图像在搜索图像上滑动,得到滑动位置的NCC得分。如下图所示,高于阈值的最亮的地…

【多组学数据驱动的机器学习:生物医学研究的创新与突破】

简介&#xff1a;随着生物医学研究的不断发展&#xff0c;多组学数据在疾病预防、诊断和治疗方面发挥着越来越重要的作用。本文将介绍如何利用机器学习技术对多组学数据进行综合分析&#xff0c;以及这种方法在生物医学研究中的优势和潜力。 正文&#xff1a; 一、多组学数据…

linux搭建seata并使用

搭建seata 官网 在linux下搭建 下载1.6.1版本&#xff1a;地址 新建文件夹、上传压缩包并解压 [roothao ~]# cd /usr/local/software/ [roothao /usr/local/software]# ls canal docker elk gitlab jdk mysql nacos nexus nginx rabbitmq redis redis_sentinel…

【Linux】free命令使用

free命令 ​free是指查看当前系统内存的使用情况&#xff0c;它显示系统中剩余及已用的物理内存和交换内存&#xff0c;以及共享内存和被核心使用的缓冲区。 作者 作者&#xff1a;Brian Edmonds。 语法 free [参数] free 命令 -Linux手册页 命令选项及作用 执行令 &am…

ArcGIS无法绘制一个或多个图层

背景&#xff1a;在导入一份数据时候&#xff0c;arcmap出现无法绘制一个或多个图层的错误&#xff0c;...点数少于要素所要求的的数量&#xff0c;查阅了半天资料发现是制作数据时候拓扑关系错误造成&#xff0c;现将处理方法详细记录如下&#xff1a; 1.原数据&#xff1a; …

如何使用GaussDB创建外表(FOREIGN TABLE)

目录 一、前言 二、创建外表的特点 二、GaussDB创建外表访问外部数据库表&#xff08;示例&#xff09; 1、创建外表 2、FAQ&#xff1a;CREATE USER MAPPING错误 三、GaussDB创建外表映射数据文件&#xff08;示例&#xff09; 1、创建数据文件 2、创建外表 3、FAQ&a…

使用torch解决线性回归问题

数据处理 import torch import numpy as np import pandas as pd import matplotlib.pyplot as pltdatapd.read_csv(./datasets/Income1.csv) #数据准备data.head(5)#展示数据 #以上所有的代码都是用jupyter notebook写&#xff0c;形成了阶段性的结果展示 查看数据信息 dat…

Qt的坐标系系统 - 3个坐标系,2个变换

参考&#xff1a; https://zhuanlan.zhihu.com/p/584048811https://www.zhihu.com/tardis/zm/art/634951149?source_id1005 小谈Qt的坐标系系统 Qt中有三个坐标系 设备坐标系窗口坐标系逻辑坐标系 设备坐标系: 即Device坐标系。也是物理坐标系。即真实的的物理坐标系。 …

Ubuntu部署EMQX开源版MQTT服务器-Orange Pi部署-服务器部署

一、前言 作为全球最具扩展性的 MQTT 消息服务器&#xff0c;EMQX 提供了高效可靠海量物联网设备连接&#xff0c;能够高性能实时移动与处理消息和事件流数据&#xff0c;本文将介绍如何在Ubuntu 22.04上部署MQTT服务器。我们本次选择开源版&#xff0c;使用离线安装方式部署。…

ArcGIS pro与SuperMap根据属性自动填充颜色步骤

GIS项目经常会接触到控规CAD数据&#xff0c;想要把数据转换成GIS图层并发布&#xff0c;需要进行专题配图。研究了一下ArcGIS pro和SuperMap iDesktop的配图&#xff0c;整理一下用到的一些技术思路。 1、Excel表格根据RGB值添加单元格填充颜色 要实现如上效果图&#xff0c;…

【NR技术】NR NG-RAN整体架构 -网络接口以及无线协议框架(四)

1 引言 本博文介绍NR NG-RAN的网络节点间的接口以及无线协议框架。网络接口介绍包括RAN和NGC之间的NG接口&#xff1b;无线协议框架包括用户面和控制面协议。 2 NG接口 2.1 NG用户面接口 NG-U (user plane interface)是NG-RAN节点与UPF之间的接口。NG接口的用户平面协议栈如图…

UE4 透明物体不渲染显示??

问题描述&#xff1a;半透明特效在背景&#xff08;半透明材质模型&#xff09;前&#xff0c;当半透明特效开始移动的时候&#xff0c;随着速度的加快会逐渐不渲染&#xff01; 解决办法&#xff1a; 1.设置透明度排序 2.如果还没效果&#xff0c;修改半透明背景模型以下材质…