深入理解操作系统- - 进程篇(1)

目录

进程解释:

process in memory(进程在内存中包含什么) :

并发的进程:

进程定义:

个人定义:

书本定义:

进程状态:

进程何时离开CPU:

内部事件:

外部事件:

进程切换:

中断源:

特权指令和非特权指令:

模式切换:

进程切换:

进程控制块:

进程在物理内存中:

 进程调度:

 实验篇

进程解释:

1)A program(程序) is a passive entity(被动的实体) , such as a file
containing a list of instructions stored on disk(often
called an executable file--可执行文件 ).---例如一个文件包含一列指令存储在磁盘
2)A program becomes a process when an executable file
is loaded into memory.(当可执行文件(指令)被加载进内存的时候一个程序就变成了进程)
3)A process is an active entity , with a program counter(pc)
specifying the next instruction to execute an a set of
associated resources.(一个进程是一个活动实体,包含一个程序计数器,规定用来指明下一条要执行的指令---pc+1加的是一个字长)

process in memory(进程在内存中包含什么) :

text:二进制代码(指令)
data:全局和静态变量数据
stack:栈用于存放局部变量、函数返回地址
heap:堆用于程序 运行时 的动态内存分配
还包括pcb进程控制块
int global=100; 
void f(int x, int y){ int* p = malloc(100);return; 
} 
void g(int a){ f(a, a+1); return;
} 
int main() 
{ static int i=10; g(i); return 0; 
}

将程序加载入内存

代码的二进制指令全部放入text区--------存放的指令是只读的

先执行main函数指令  将main函数的返回地址写入栈(stack)中

发现一个全局变量和一个静态变量放入data区(编译好的代码是有全局观的,所以会知道有全局变量)

调用函数g(), 把g()函数的局部变量放入栈中,并把函数的返回值压入栈中,

调用f()函数,把f函数的局部变量x,y,p放入栈中,再将f()函数的返回值放入

f()函数申请的动态内存放入heap,申请的空间内存的首地址赋值给p指针

从stack栈中得到f()函数的返回地址,让后出栈,同时函数清理需要把该函数的所有变量从栈中清掉。

取出g()函数返回地址,清空g()函数

取出main()函数的返回值,并清空栈中与data区中的数据

heap中的内存必须手动回收

并发的进程:

Concurrency:the fact of two or more events or
circumstances happening or existing at the same time.
(并发:两个或多个事件的事实同时 发生或存在的情况---不是同时runing运行--并行)

进程定义:

个人定义:

进程是一个拥有cpu使用权的进行计算任务的基本单位。

书本定义:

进程是一个程序的一次执行过程
能完成具体的功能
是在某个数据集合上完成的
执行过程是可并发的
进程是资源分配、保护和调度的基本单位

进程状态:

进程在执行期间自身的状态会发生变化,进程有三 种基本状态,分别是:
运行态(Running) :此时进程的代码在CPU上运行(正在执行的才是运行态)
就绪态(Ready) :进程具备运行条件,等待分配CPU
等待态(Waiting) :进程在等待某些事件的发生(比如 IO操作结束或是一个信号)(不具备运行条件)

进程何时离开CPU:

内部事件:

进程 主动放弃(yield) CPU,进入等待/终止状态。
E.g 使用I/O设备(等待),(非)正常结束(终止)。

外部事件:

进程被剥夺CPU使用权,进入就绪状态。这个动作叫 抢占(preempt)
E.g 时间片到达,高优先权进程到达。
new是一个新建状态,将程序加载入内存的状态
当运行除了cpu之外的所有资源都就绪后进入就绪态
当得到cpu权限后进入运行态,当运行完成后进入terminated状态
(被动)在运行态cpu被抢夺后进入就绪态
(主动)在运行态使用I/O设备的时候进入等待状态  等待结束重新进入就绪状态

进程切换:

并发进程中,一个进程在执行过程中可能会被另一个进程替换占有CPU,这个过程称作“进程切换” 

中断源:

外中断:

来自处理器之外的硬件中断信号

如时钟中断、键盘中断、外围设备中断 外部中断均是异步中断

内中断(异常 Exception):

来自于处理器内部,指令执行过程中发生的中断,属同步中断

硬件异常:掉电、奇偶校验错误等

程序异常:非法操作、地址越界、断点、除数为0

系统调用

(参考书籍不同定义就不同---内中断应该只是说法不同 可能依次对应 终止、异常、陷入)

Exception(内)与interrupt(外)统称中断,发生中断后保存进程的上下文信息(相当于快照)(pc---在上边说到程序转换成了二进制指令,不止pc)执行中断处理程序(进入内核),选择对应进程进行恢复进程上下文,返回进程的执行。

特权指令和非特权指令:

Privileged Instructions
The Instructions that can run only in Kernel Mode are called Privileged Instructions .
*I/O instructions and Halt instructions(I/O指令/停止指令)
*Turn off all Interrupts(关闭中断)
*Set the Timer  (设置时钟定时器)
*Process Switching  (进程切换)
Non-Privileged Instructions
*The Instructions that can run only in User Mode are called Non-Privileged Instructions .
怎么区分特权指令和非特权指令?
通过硬件,设置一个比特位

模式切换:

*中断是用户态向核心态转换的唯一途径!系统调用 实质上也是一种中断。
*OS提供Load PSW指令装载用户进程返回用户状态

进程切换:

1)在进程切换的第一步将cpu的user mode 切换到核心 mode 
2)保存被中断进程的上下文信息

3)修改被中断进程的控制信息(如状态等)

2、3两步会保存到该进程的PCB进程控制块,当重新得到cpu的控制权的时候会将PCB进程控制块加载到cpu

4)将被中断的进程加入相应的 状态队列
5)调度 一个新的进程并恢复它的上下文信息

进程控制块:

每个进程都拥有一个自己的PCB进程控制块

A Process Control Block(PCB)contains many pieces of information associated with a specific
process.(一个进程控制块包含很多信息,与一个特定的进程有关)

进程在物理内存中:

进程的进程实体并不是整体存放,而是离散存放
管理进程使用的是进程队列进行管理:
只有俩个状态--ready(就绪)/等待状态,运行态没用队列只有一个
就绪状态队列是使用链表进行连接形成队列(只是连接的pcb),当某个队列需要进入runing状态则从就绪队列中移除

 进程调度:

  进程在整个生命周期中会在各个调度队列中迁移, 由操作系统的一个调度器(scheduler)来执行

 实验篇:

Practice: How to create a child process?

这个实验在上一年学习Linux编程技术的的时候已经做过该实验,在这进行简单实验,若需要详细了解函数的原理可以查考Linux编程技术专栏。

补充:

调用fork()后,会把整个进程的信息进行copy完全复制给新创建的子进程,在fork()后

父子进程并发执行后边的程序,在子进程中fork函数的返回值为0,在父进程中会返回子进程的pid。(这里的并发可以根据打印信息的程序来判断--会无规律的进行交替打印)

getppid()函数是获得当前进程的父进程的pid(注:如果父进程在子进程结束之前结束,则子进程变成孤儿进程,则需要找1号进程(是系统启动的第一个进程INITD)作为父进程,即托管给系统进程)

为了避免孤儿进程的发生,我们引入了wait(NULL)方法,该方法作用与父进程,让父进程等待子进程结束后再返回。  

 代码如下:

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

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

相关文章

卫星图像应用 - 洪水检测 使用DALI进行数据预处理

这篇文章是上一篇的延申。 运行环境:Google Colab 1. 当今的深度学习应用包含由许多串行运算组成的、复杂的多阶段数据处理流水线,仅依靠 CPU 处理这些流水线已成为限制性能和可扩展性的瓶颈。 2. DALI 是一个用于加载和预处理数据的库,可…

消息队列实现进程之间通信方式代码,现象

1、向消息队列中写入数据 #include<myhead.h>//消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小int main(int argc, const char *argv[]) {//1、创建…

raw智能照片处理工具DxO PureRAW mac介绍

DxO PureRAW Mac版是一款raw智能照片处理工具&#xff0c;该软件采用了智能技术&#xff0c;以解决影响所有RAW文件的七个问题&#xff1a;去马赛克&#xff0c;降噪&#xff0c;波纹&#xff0c;变形&#xff0c;色差&#xff0c;不想要的渐晕&#xff0c;以及缺乏清晰度。 Dx…

渗透测试之打点

请遵守中华人民共和国网络安全法 打点的目的是获取一个服务器的控制权限 1. 企业架构收集 &#xff08;1&#xff09;官网 &#xff08;2&#xff09;网站或下属的子网站&#xff0c;依次往下 天眼查 企查查 2. ICP 备案查询 ICP/IP地址/域名信息备案管理系统 使用网站…

基于微信小程序的宠物寄养平台小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

浏览器输入 URL 并回车发生了什么

本文节选自我的博客&#xff1a;浏览器输入 URL 并回车发生了什么 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是MilesChen&#xff0c;偏前端的全栈开发者。&#x1f4dd; CSDN主页&#xff1a;爱吃糖的猫&#x1f525;&#x1f4e3; 我的博客&#xff1a;爱吃糖…

国庆9.30

消息队列实现进程间通信 snd #include <myhead.h> //消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //正文大小int main(int argc, const char *argv[]) {//1、创建key…

常用数学分布

正态分布&#xff08;高斯分布&#xff09; 若随机变数 X X X 服从一个期望 μ \mu μ&#xff0c;标准差 的正态分布 σ \sigma σ&#xff0c;则记为 X ≈ N ( μ , σ 2 ) X \approx N(\mu,\sigma^2) X≈N(μ,σ2)&#xff0c;其密度函数为&#xff1a; f ( x ) 1 σ …

JSP学习笔记【三】——JQuery

前言 在写项目的时候需要动态对某组件的属性进行调整&#xff0c;我看网上的教程都是使用document.getElementById等&#xff0c;但我在eclipse编写.jsp文件的时候&#xff0c;却提示document cannot be resolved。由于我对jsp没有系统的了解以及无人可咨询&#xff0c;网上也…

lv5 嵌入式开发-10 信号机制(下)

目录 1 信号集、信号的阻塞 2 信号集操作函数 2.1 自定义信号集 2.2 清空信号集 2.3 全部置1 2.4 将一个信号添加到集合中 2.5 将一个信号从集合中移除 2.6 判断一个信号是否在集合中 2.7 设定对信号集内的信号的处理方式(阻塞或不阻塞) 2.8 使进程挂起&#xff08;…

仿真数据检查器如何比较数据

可以定制仿真数据检查器比较过程&#xff0c;以多种方式满足您的需求。在比较各运行时&#xff0c;仿真数据检查器会执行以下操作&#xff1a; 根据对齐设置&#xff0c;对齐基线运行和比较项运行中的信号对组。 仿真数据检查器不会比较无法对齐的信号。 根据指定的同步方法同…

机器学习——一元线性回归构造直线,并给出损失函数

目 录 Question 问题分析 1.概念补充 2.流程分析 3.注意 具体实现 最终成果 代码 思考&#xff1a; Question 在二维平面有n个点&#xff0c;如何画一条直线&#xff0c;使得所有点到该直线距离之和最短 如果能找到&#xff0c;请给出其损失函数 问题分析 1.概念…

数据集笔记:杭州地铁刷卡数据

1 数据位置&#xff1a; 链接: https://pan.baidu.com/s/1iLHomv5NRodB_3jr7FcFow 提取码: arse 全球城市计算AI挑战赛_算法大赛_天池大赛-阿里云天池的赛制 (aliyun.com) 2 数据集介绍 杭州20190101至20190125共25天地铁刷卡数据记录&#xff0c;共涉及3条线路81个地铁站约…

【Linux系统编程】进程状态

文章目录 前言1. 准备工作2. 阻塞、挂起状态的了解2.1 阻塞2.2 挂起 3. 看看Linux内核源代码怎么说4. R运行状态&#xff08;running&#xff09;5. S休眠状态&#xff08;sleeping)6. D不可中断休眠状态7. T暂停状态&#xff08;stopped&#xff09;8. t 追踪暂停状态 (tracin…

设计模式6、适配器模式 Adapter

解释说明&#xff1a;将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作 目标接口&#xff08;Target&#xff09;&#xff1a;当前系统所期待的接口&#xff0c;它可以是抽象类或接口 适配者&#xff08;Adaptee&#xff09;&#xff1a…

C#(CSharp)入门实践项目(简易回合制游戏)

项目名称 木木夕营救公主 项目介绍 这是一个小游戏&#xff0c;你将扮演一个英雄&#xff08;木木夕&#xff09;&#xff0c;去打败恶龙&#xff0c;拯救出公主&#xff0c;该项目采用回合制战斗模式&#xff0c;由于角色的血量和攻击为随机数&#xff0c;所以需要靠运气才…

Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理

Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理 引言1.1 多数据源的必要性1.2 多数据源的应用场景 实战演示2.1 创建实体类2.2 配置数据源2.3 实现数据源配置类2.4 配置Repository类2.5 运行与验证 事务管理与数据一致性3.1 事务管理3.2 使用Se…

变电站无人值守方案:提升效率与增强安全性

随着信息技术、人工智能、大数据的发展进步&#xff0c;电力行业正逐步向智能化转型。其中&#xff0c;无人值守变电站成为了现代电力系统的明显趋势。这种新型的运营模式不仅提高了效率&#xff0c;还极大地增强了电力系统的安全性。 无人值守变电站的核心概念是在没有人类现场…

Adams齿轮副

1.运动副 添加旋转副的时候&#xff0c;必须先物体后公共part(即此处的ground&#xff09;&#xff0c;最后再选择质心点 2.啮合点 啮合点marker的z轴必须是齿轮分度圆的切线方向 3.啮合点 两齿轮的旋转副&#xff0c;和啮合点&#xff0c;即cv marker &#xff0c;必须属…

win10打开VMware 16 pro里面的虚拟机就蓝屏怎么办

2023年9月30日&#xff0c;周六下午 今天下午我也遇到了这个问题&#xff0c;后来解决了&#xff0c;于是记录一下我的解决办法 目录 1、打开控制面板&#xff0c;并选择“程序和功能” 2、点击“启动或关闭Windows服务” 3、勾选两个服务 4、重启电脑&#xff0c;大功告成…