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

前言

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

进程相关概念

文章目录

  • 前言
  • 进程相关概念
    • 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.mzph.cn/news/215769.shtml

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

相关文章

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

文章目录 一、MBIM协议二、MBIM 消息类型三、基本控制消息构成3.1、MBIM OPEN MSG FORMAT3.2、MBIM CLOSE MSG FORMAT3.3、MBIM_COMMAND_MSG3.4、MBIM_COMMAND_DONE3.5、MBIM_INDICATE_STATUS_MSG四、MBIM Message(UUID+CID)4.1、UUID_BASIC_CONNECT

频率、概率

频率 在相同的条件下进行试验&#xff0c;假设试验进行了次&#xff0c;其中随机事件A发生了次&#xff0c;那么就称为随机事件A发生的频率。 概率 假设随机试验E的样本空间是S&#xff0c;对于其中每个随机事件&#xff0c;都对应了一个实数&#xff0c;把这个实数称为随机…

网络游戏APP备案|游戏

网络游戏APP备案|游戏 网络游戏备案分析需要备案原因&#xff08;个人看法&#xff09;对小公司对大公司 总结 网络游戏备案分析 相信做网络游戏的伙伴们在23年都收到了各个平台的公告&#xff0c;网络游戏需要进行APP的备案。也就是说网路游戏现在安卓平台也不是你想上架测试…

a1随笔小思--家书

师夷长技以自强 不应该只学西方的技术&#xff0c;更应该传承我们中华的五千年的先人智慧。 修心养性 藏器于身 子曰:“可与言而不与之言&#xff0c;失人&#xff1b;不可与言而与之言&#xff0c;失言。知者不失人&#xff0c;亦不失言。” 孔子说:“可以跟他交谈&#xf…

051:vue项目webpack打包后查看各个文件大小

第050个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

git强制回滚,远程强制更新,git pull强制更新

注意&#xff1a;这里是强制回滚&#xff0c;回滚后&#xff0c;之后历史的就没有了&#xff0c;慎用。 本地强制回滚 强制回滚到上一个版本 git reset --hard HEAD^强制回滚上上个版本 git reset --hard HEAD^^git log查看版本 git log --prettyonelinegit log --prettyf…

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

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

【cocotb】【达坦科技DatenLord】Cocotb Workshop分享

https://www.bilibili.com/video/BV19e4y1k7EE/?spm_id_from333.337.search-card.all.click&vd_sourcefd0f4be6d0a5aaa0a79d89604df3154a 方便RFM实现 cocotb_test 替代makefile &#xff0c; 类似python 函数执行

java web系统的常见安全问题

一、背景 java开发的系统在发布到互联网后都需要进行安全扫描&#xff0c;本文主要总结开发web系统需要注意的与系统安全相关的问题。因为在做需求开发时&#xff0c;很少产品会将系统安全的因素考虑在内&#xff0c;总觉得实现个需求很简单&#xff0c;就是一些页面&#xff0…

.Net6.0 Microsoft.AspNetCore.Http.Abstractions 2.20 已弃用

您想要升级 Microsoft.AspNetCore.Http.Abstractions 包&#xff0c;您需要注意以下几点&#xff1a; Microsoft.AspNetCore.Http.Abstractions 包在 ASP.NET Core 2.2 版本后已经被标记为过时&#xff0c;因为它已经被包含在 Microsoft.AspNetCore.App 框架引用中12。因此&am…

零基础自学Python的最全时间规划表

文章目录 前言第一阶段:熟悉Python第二阶段:软件开发第三阶段:成为程序员关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python…

产品固件烧写方案

1、前言 一成熟的量产的嵌入式产品&#xff0c;软件一般分为BootLoader和App&#xff0c;BootLoader用于启动校验、App升级、App版本回滚等功能&#xff0c;BootLoader在cpu上电第一阶段中运行&#xff0c;之后跳转至App地址执行应用程序。 因此&#xff0c;在发布固件的时候&a…

使用Mockjs模拟(假数据)接口(axios)

一、什么是MockJs Mock.js官网 Mock.wiki.git mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 二、安装mockjs npm install mockjs 三、 MockJs使用 简单使用&#xff1a; // 使用…

JFrog----常见的开源协议以及应用注意点

文章目录 1. MIT 许可证2. GPL&#xff08;通用公共许可证&#xff09;3. LGPL&#xff08;较宽松的通用公共许可证&#xff09;4. Apache 许可证 2.05. BSD 许可证开源协议的选择和注意点结论 开源软件近年来在软件开发中变得越来越流行。使用开源软件可以节省时间和资源&…

Unity优化——加速物理引擎1

大家好&#xff0c;这里是七七&#xff0c;今天开始更新物理引擎相关的优化部分了&#xff0c;本文介绍的是物理引擎内部工作情况。 Unity技术有两种不同的物理引擎&#xff1a;用于3D物理的Nvidia的PhysX和用于2D物理的开源项目Box2D。然而&#xff0c;Unity对它们的实现是高…

Nginx rewrite 参数

目录 常用的Nginx 正则表达式 rewrite 和 location的区别 location location 大致分三类&#xff1a; location 常用的匹配规则&#xff1a; location 优先级&#xff1a; rewrite rewrite跳转实现 rewrite 执行顺序如下 语法格式 flag标记说明 rewrite实际操作 基…

【虹科干货】使用Netropy广域网模拟器测试简化SD-WAN测试

文章速览&#xff1a; 为什么需要WAN模拟器&#xff1f;什么是WAN模拟器&#xff1f;用WAN模拟器测试SD-WANSD-WAN损伤测试 现如今大家都在使用SD-WAN产品节省网络成本&#xff0c;但是也面临着一些复杂的算发问题&#xff0c;那么如何简化SD-WAN系统的测试和评估&#xff1f;…

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

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

总结6种@Transactional注解的失效场景

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 引言 昨天有粉丝咨询了…

超卓航科引领冷喷涂增材制造革新,推动先进核反应堆发展

近日&#xff0c;超卓航科凭借其卓越的冷喷涂增材制造技术&#xff0c;成为推动核能领域创新的重要力量。该公司利用冷喷涂工程技术&#xff0c;或为核反应堆的制造和修复开辟了全新的道路。 冷喷涂技术是一种颇具前景的固态粉末沉积方法&#xff0c;可用于涂层制造、增材制造和…