操作系统之进程概念

进程概念

进程是什么:

  表面上来说进程是程序的一个执行实例,或者是一个正在执行的程序等,从操作系统的角度来说,程序运行需要将代码数据加载到内存中,由于在操作系统中运行了很多的程序,操作系统就必须去管理这些运行的程序,先描述再组织,所以在操作系统的层面的进程就是操作系统对一个运行的程序的描述。这个描述信息就是PCB(进程控制块),在Linux中这个PCB有一个专属的名称task_struct结构体。task_struct是Linux内核的一种数据结构,他会被装载到RAM里,并且包含着进程的信息。
pcb中的描述信息

内存指针:包括程序代码和进程相关的数据的指针,还有和其他进程共享的内存块的指针。

程序计数器:程序中即将被执行的下一条指针的地址。

上下文数据:进程执行时处理器的寄存器中的数据。

标识符PID:描述本进程的唯一标识符,用来区别其他的进程。

进程状态:任务状态,退出代码、退出信号等。

进程优先级:决定了cpu给进程分布分配资源的优先级

记账信息:处理器时间总和,使用的时钟数总和,时间限制、记账号等。

IO信息:包括显示的I/O请求,分配给进程I/O设备和被进程使用的文件列表。

CPU分时机制

  对程序运行处理进行切换调度处理(时间片:cpu在每个程序上所运行的这段时间 )

查看进程

s -aux | grep 进程名
cd / -> cd /proc ->cd 进程ID

创建进程

创建子进程的意义:

分摊任务处理压力,让子进程完成其他任务(提高稳定性)

  操作系统通过写时拷贝技术来创建子进程,也就是说通过复制父进程创建子进程,子进程初始时与父进程指向同一块物理内存区域,当内存数据发生改变时,为了保证进程之间的独立性,操作系统会为子进程重新开辟一段物理内存空间,并且更新子进程的页表。

  复制:操作系统通过复制父进程创建子进程,因此父子进程数据独有,但是代码共享

  返回值:对于父进程来说,fork返回的是子进程的pid;创建子进程失败返回-1,对于子进程来说,fork的返回值是0

用户通过fork的返回值不同对父子进程进程运行流程进行分流

#include<iostream>
#include<string>
#include<pthread.h>
#include <unistd.h>
#include<vector>
using namespace std;int main()
{//pid_t fork(void)//创建一个子进程,父进程返回子进程的pid,子进程返回0pid_t pid = fork();if(pid < 0){cout << "fork error" << endl;return -1;}else if(pid == 0){cout << "<----I am child----> " << getpid() << endl;}else{cout << "<----I am parent----> " << getpid() << endl; }return 0;
}

进程状态

运行、就绪、阻塞

R:运行状态:但是并不意味着进程一定在运行中,它表明进程要么是在运行要么是在运行队列里

S:睡眠状态;意味着进程在等待事件完成(可中断休眠:能够被唤醒的状态)

D:磁盘休眠状态;不可中断休眠:要通过特定的条件才能被唤醒

T:停止状态:可以通过发送SIGSTOP信号给进程来停止,这个被暂停的进程可以通过发送SIGCONT信号继续运行。

X:死亡状态:这个状态只是一个返回状态,不会再任务列表中看到这个状态。

僵尸进程

处于僵尸状态的进程会造成内存泄漏

僵尸进程产生的原因

  子进程先于父进程退出,因为要保留推出原因,所以操作系统不能直接释放所有资源,通知父进程获取退出原因,允许操作系统释放资源,但是父进程没有关注这个通知导致子进程退出后无法释放所有资源,处于僵死状态,称为僵尸进程。

如何避免:进程等待

处理方式:退出父进程

孤儿进程

父进程先于子进程退出,子进程成为孤儿进程,运行在后台,父进程成为1号进程
守护进程/精灵进程:特殊的孤儿进程,一个进程的父进程先于他推出后成为孤儿进程,他会脱离各种会话和终端影响,将之前的所有联系取消,

环境变量

存储系统运行环境参数的变量

查看环境变量
env set echo

设置环境变量
export

删除环境变量
unset

常见环境变量
HOME PWD SHELL PATH

环境变量特性
全局特性(继承)
当前shell终端下所运行的进程能够获取到当前终端所有的环境变量,但是获取不到普通变量

环境变量在代码中的获取

通过函数: char* getenv(char* name)
main的第三个参数:  int main(int argc, char* argv[], char* env[])

环境变量的使用场景
  通常是父进程通过给子进程设置环境变量达到向子进程传递数据的功能。

程序地址空间

在这里插入图片描述
  内存地址就是内存区域的一个编号,变量就是一块内存地址的别名。

虚拟地址

  虚拟地址空间,实际上是一个结构体, mm_struct,这个结构体给进程描述了一块完整连续的虚拟地址空间,但是在物理内存中有可能是不连续的。

struct mm_struct
{ulong men_size;//内存大小ulong code_start;//代码段的起始位置ulong code_end;//代码段的结束位置
};

  每个进程都会有一份自己的程序地址空间。并且每个程序都需要一块连续的地址空间。操作系统对每个运行起来的程序都会建立一块虚拟的地址空间,给进程描述一块虚假的内存空间,每一个变量都有一个虚拟的地址,但是这个虚拟的地址无法存储数据,还是要存储到物理内存中,这时就有一个页表,它主要时做映射,将变量通过映射,映射到物理内存中,这块物理内存存放的就是变量的值,子进程复制了父进程而创建,也就是说子进程和父进程有着相同的虚拟地址空间和页表,在他的初始化全局这段空间中也有着和父进程相同的变量,也通过页表映射一块物理内存空间,这块物理内存空在开始的时候是相同的,但是当子进程要修改这块内存中的数据的时候,为了保证进程之间的独立性,操作系统会通过写时拷贝技术为子进程重新开辟一段块物理内存空间,所以说地址相同说的是他们的虚拟地址相同。

  我们所看到的程序地址空间实际上是一个虚拟地址空间,实际上是通过操作系统通过mm_struct这个结构体为进程描述的一个空间,因此有时候也称作内存描述符。

为什么要有虚拟地址空间?

  进程通过访问虚拟地址进而获取变量数据,最终还是要去访问物理内存,因为数据是存储在物理内存中的,在虚拟地址和物理地址之间通过页表进行地址映射,将虚拟地址转换得到物理地址,进而访问物理内存区域。通过映射之后物理地址可就不一定是连续的了,通过这种映射转换的方式实现数据的离散存储提高了内存的利用率。页表中不但记录了虚拟地址和物理地址的映射关系,还记录了这块地址的属性实现内存的访问控制。

为什么进程要独立

  进程应该具有独立性,因为独立才更加稳定

虚拟地址空间和页表有什么用?

​ 提高内存利用率,增加内存访问控制,保持进程独立性

页表是如何将虚拟地址转换到物理地址

一共有三种常见的内存管理方式:分段式、分页式和段页式

分段式内存管理

​ 内存地址构成:段号+段内偏移
​ 段表:有很多的段项

​ (物理段的起始地址)


  分段式物理地址获取方法:通过地址中的段号去段表中找到段表项,通过段表项中的物理起始地址加上地址中的段内偏移获取到物理地址

​ 分页式内存管理:

​ 内存地址的构成:页号 + 页内偏移

​ 页表中有很多页表项

在这里插入图片描述
  分页式物理地址获取方法:通过地址中的页号去页表中找到页表项,通过页表项中的物理页号加上页内偏移获取到物理地址

段页式内存管理

  内存地址:段号+段内页号+页内偏移

  段表向中包含段内页表起始地址

  段内页表中包含物理页号

段页式物理地址获取方法:通过段号在段表中找到段表项,通过段表项中的段内页表地址找到段内页表,通过地址中的段内页号在段内也表中找到页表项,通过页表项中的物理页号与页内偏移组成物理地址。

内存置换算法:

​ 内存中只有4G,但是想处理5G的数据怎么办?

​ swap分区也叫交换内存:内存不够时,将内存中的数据置换到交换分区中,腾出内存处理数据

置换算法

FIFO:先进先出,核心原则就是:如果一个数据最先进入缓存区,则因该最早淘汰掉
LFU:最近最少频率未使用。基于访问次数。
LRU:最近最久未处理,基于访问时间。

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

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

相关文章

也谈压缩感知和贝叶斯大脑

来源&#xff1a;科学网压缩感知和人工智能都是当下很热很热的研究课题。不过许多论文数学论述高深莫测&#xff0c;加之一大堆各种千奇百怪的数学符号&#xff0c;不仅让人望而生畏&#xff0c;望而却步。笔者对希望用形象的比喻把问题大致轮廓讲清楚就好。所谓压缩感知是什么…

一篇文章搞懂数据仓库:三种事实表(设计原则,设计方法、对比)

目录 1、三种事实表概述 2、三种事实表对比 3、事实表设计 8 大原则 4、事实表设计方法 第一步&#xff1a;选择业务过程及确定事实表类型 第二步&#xff1a;声明粒度 第三步&#xff1a;确定维度 第四步&#xff1a;确定事实 事实表作为数据仓库维度建模的核心&#…

Eclipse快捷键一览

基本使用 Ctrl1 快速修复(最经典的快捷键,就不用多说了)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt↑ 当前行和上面一行交互位置(同上)Alt← 前一…

深思考人工智能蝉联SMP2018多轮语义对话冠军,报告解读多轮人机对话实现过程...

人机对话技术近年来受到了学术界和产业界的广泛关注&#xff0c;其发展影响并推动着语音识别与合成、自然语言理解、对话管理以及自然语言生成等研究的进展。众多产业界巨头相继推出了人机对话技术相关产品&#xff0c;并将人机对话技术作为其公司的重点研发方向。8月3日&#…

操作系统之动态库和静态库

什么是库&#xff1f; 平时在写代码的时候会经常添加一些头文件&#xff0c;添加这些头文件其实是让编译器从一个目录下去寻找这个文件&#xff0c;这个目录就是我们常说的库。在Linux中库一般存放在user/lib目录。库就是将一些常用的函数的目标文件打包在一起&#xff0c;提供…

一篇文章搞懂数据仓库:数据仓库规范设计

目录 一、为什么要进行规范设计&#xff1f; 二、设计规范 - 指标 三、命名规范 - 表命名 3.1 常规表 3.2 中间表 3.3 临时表 3.4 维度表 四、开发规范 五、流程规范 一、为什么要进行规范设计&#xff1f; 无规矩、不方圆。规范设计是在具体开发工作之前制定的&…

asm字节码操作 方法的动态修改增加

asm 4.0 版本 http://forge.ow2.org/plugins/scmsvn/index.php?group_id23 asm是java的字节码操作框架&#xff0c;可以动态查看类的信息&#xff0c;动态修改&#xff0c;删除&#xff0c;增加类的方法。 下面基于4.0版本的一个使用示例&#xff0c;演示了对类Foo进行修改方法…

vim基本命令

最实用的几个&#xff1a; 0&#xff08;数字0&#xff09;移动到本行第一个字符上 $ 移动到行尾 。 3$ 移动到下面3行的行尾 gg 移动到文件头。 [[ G&#xff08;shift g&#xff09; 移动到文件尾。 ]] /text  查找text&#xff0c;按n健查找下一个&#xff0c;按…

map的详解及常见面试题

map的概念 map是STL中的一个关联式容器&#xff0c;它提供一对一的K-V的数据处理能力&#xff0c;由于这个特性&#xff0c;在我们需要完成Key-Value数据处理的时候可以很方便的调用。map的底层结构是红黑树&#xff0c;这棵树对数据有自动排序的功能&#xff0c;所以map中的数…

无处不在的人工智能,IBM沃森的20个行业应用

来源&#xff1a;资本实验室聚焦前沿科技创新与传统产业升级自2011年在美国综艺电视节目《危险边缘》中一战成名后&#xff0c;IBM的Watson就一直是最受关注的人工智能之一。从菜谱分析到球队管理&#xff0c;从健康顾问到酒店礼宾服务&#xff0c;Watson基于自然语言处理和机器…

自定义店招应该具有的基本功能

今天正式开始制作我的第一套SDK2.0模板。 首先是制作店铺的招牌&#xff0c;因为我个人习惯把首页的样式先制作在PSD中&#xff0c;然后参照PSD&#xff0c;由上至下进行编码实现&#xff01;在此前&#xff0c;我一度想过使用默认的店招&#xff0c;但是他真的是太不方便了&a…

一篇文章搞懂数据仓库:数据仓库架构-Lambda和Kappa对比

在介绍Lambda和Kappa架构之前&#xff0c;我们先回顾一下数据仓库的发展历程&#xff1a; 传送门-数据仓库发展历程 写在前面 咳&#xff0c;随着数据量的暴增和数据实时性要求越来越高&#xff0c;以及大数据技术的发展驱动企业不断升级迭代&#xff0c;数据仓库架构方面也在…

epoll精讲

epoll - I/O event notification facility 在linux的网络编程中&#xff0c;很长的时间都在使用select来做事件触发。在linux新的内核中&#xff0c;有了一种替换它的机制&#xff0c;就是epoll。 相比于select&#xff0c;epoll最大的好处在于它不会随着监听fd数目的增长而降…

宇宙和你,本质上其实只是个八维数字?

剑桥大学的数学物理学家Cohl Furey正在寻找粒子物理标准模型和八元数之间的联系。八元数的乘法规则被编码在被称为法诺面的三角图中。来源&#xff1a; 环球科学对于一维、二维乃至四维的数字&#xff0c;人们都不陌生&#xff1a;一维的实数一直都存在于经典物理中&#xff0c…

Fedora 安装QQ2012

1.下载软件包&#xff1a;http://www.everbox.com/f/yLDb2jlpP9WBVvXlSkzC5JKuD9 2.依次执行一下命令 cd /root # 文件存储路径 tar -zxvf qq2012.tar.gz -C /opt # 解压到/opt路径下&#xff0c;注意权限 cd /opt ls cd qq2012/wineapp/qq/ ls ./ins…

一篇文章搞懂数据仓库:数据应用--OLAP

目录 1、OLAP和OLTP的区别 2、OLAP分类 3、OLAP基本操作 4、OLAP选型 1、olap和oltp的区别 OLTPOLAP对象业务开发人员分析决策人员功能日常事务处理面向分析决策模型关系模型多维模型数据量几条或几十条记录&#xff1e;百万于万条记录操作类型增、删、查、改(CRUD)查询为主…

欧洲、美国、中国智慧城市的不同实践路径

来源&#xff1a;远望智库摘要&#xff1a;随着ICT、大数据、物联网等各类新兴技术的不断发展&#xff0c;智慧城市的运营和实践也不断趋于成熟。随着ICT、大数据、物联网等各类新兴技术的不断发展&#xff0c;智慧城市的运营和实践也不断趋于成熟。通过整理欧美各大典型智慧城…

使用IOUtils和FileUtils

文本输出应该比较常用&#xff0c;以前都是通过反复的创建InputStream, InputReader, OutputStream, OutputWriter等去输入输出文本&#xff0c;比较麻烦。Apache提供了一个commons-io.jar包&#xff0c;里面有很多IO相关的工具&#xff0c;比如输入输出文本等&#xff0c;着实…

一个sql生成hive日期维度表

目录 1、日期维度表 2、生成语句 3、用例 在进行日期处理时&#xff0c;有时候会很麻烦&#xff0c;于是小编开发了一张日期维表&#xff0c;供大家参考。 1、日期维度表 num字段名字段中文名描述数据类型1date日期日期 yyyMMdd格式bigint2week星期&#xff0c;数字型星期…

重磅推荐:机器人行业深度报告

来源&#xff1a;WPR随着中国人口红利消失&#xff0c;机器人不仅在制造业上正在替代工人&#xff0c;还将在军事、服务、娱乐等领域取代人类&#xff0c;“钢铁侠”已不仅仅存在于美国科幻电影中&#xff0c;而正走入我们的生活。本篇报告对机器人行业及龙头上市公司进行分析&…