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

news2025/1/14 0:57:18

目录

进程解释:

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.coloradmin.cn/o/1052754.html

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

相关文章

Backblaze发布2023中期SSD故障数据质量报告

作为一家在2021年在美国纳斯达克上市的云端备份公司,Backblaze一直保持着对外定期发布HDD和SSD的故障率稳定性质量报告,给大家提供了一份真实应用场景下的稳定性分析参考数据。 本文我们主要看下Backblaze最新发布的2023中期SSD相关故障稳定性数据报告。…

华为ensp单臂路由及OSPF实验

单臂路由及OSPF实验 1.1实验背景 在这个实验中,我们模拟了一个复杂的网络环境,该网络环境包括多个子网和交换机。这个实验旨在帮助网络工程师和管理员了解如何配置单臂路由和使用开放最短路径优先(OSPF)协议来实现不同子网之间的…

【网络安全】网络安全之信息收集和信息收集工具讲解,告诉你黑客是如何信息收集的

一,域名信息收集 1-1 域名信息查询 可以用一些在线网站进行收集,比如站长之家 域名Whois查询 - 站长之家站长之家-站长工具提供whois查询工具,汉化版的域名whois查询工具。https://whois.chinaz.com/ 可以查看一下有没有有用的信息&#xf…

数据集笔记:OpenCelliD(手机基站开放数据库)

下载数据的方式可见:【数据获取】全球最大手机基站开源数据库 1 读取数据 import pandas as pdpd.read_csv(C:/Users/16000/Downloads/454.csv/454.csv,headerNone,names[Radio,MCC,MNC,LAC/TAC/NID,CID,Longitude,Latitude,Range,Samples,Changeable1,Changeable…

前端开发和后端开发的一些建议

前端开发和后端开发是Web开发的两个方向 前端开发主要负责实现用户在浏览器上看到的界面和交互体验,包括HTML、CSS和JavaScript等技术。后端开发主要负责处理服务器端的逻辑和数据,包括数据库操作、服务器配置和接口开发等技术。 前端开发 前端开发需…

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

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

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统

LabVIEW开发虚拟与现实融合的数字电子技术渐进式实验系统 数字电子技术是所有电气专业的重要学科基础,具有很强的理论性和实践性。其实验是提高学生分析、设计和调试数字电路能力,培养学生解决实际问题的工程实践能力,激发学生创新意识&…

leetCode 188.买卖股票的最佳时机 IV 动态规划 + 状态压缩

给你一个整数数组 prices 和一个整数 k ,其中 prices[i] 是某支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。也就是说,你最多可以买 k 次,卖 k 次。 注意:你不能同时参与多…

国庆中秋特辑(五)MySQL如何性能调优?下篇

目录 5.数据库维护6. 数据库调优工具7.数据库架构优化8.代码层面优化9. 硬件层面优化10. 数据库安全 MySQL 性能优化是一项关键的任务,可以提高数据库的运行速度和效率。以下是一些优化方法,包括具体代码和详细优化方案。 接下来详细介绍,共有…

Hudi第二章:集成Spark

系列文章目录 Hudi第一章:编译安装 Hudi第二章:集成Spark 文章目录 系列文章目录前言一、安装Spark1、安装Spark2.安装hive 二、spark-shell1.启动命令2.插入数据3.查询数据1.转换DF2.查询 3.更新4.时间旅行5.增量查询6.指定时间点查询7.删除数据1.获取…

C/C++字符函数和字符串函数详解————长度受限制的字符串函数

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.前言 2.长度受限制的字符…

arm 汇编基础指令

实现1-100求和 .text .globl _start_start:mov r0, #1 i&#xff0c;i1mov r1, #100 条件变量i<100mov r2, #0 sumLoop: 循环cmp r0,r1 比较r0和r1的大小bhi stop 当r0>r1时&#xff0c;跳到stop标签a…

Ubuntu服务器安全性提升:修改SSH默认端口号

在Ubuntu服务器上&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种至关重要的远程连接工具。它提供了一种安全的方式来远程连接和管理计算机系统&#xff0c;通过加密通信来确保数据的保密性和完整性。SSH协议广泛用于计算机网络中&#xff0c;用于远程管理、文件传…

什么是 MyBatis?与 Hibernate 的区别

引言 在现代的应用程序开发中&#xff0c;与数据库的交互是至关重要的。为了简化数据库访问&#xff0c;许多开发者选择使用ORM&#xff08;对象-关系映射&#xff09;框架。MyBatis和Hibernate都是流行的ORM框架&#xff0c;它们可以帮助开发者更轻松地将Java对象映射到数据库…

Springboot+vue的球队训练信息管理系统(有报告),Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的球队训练信息管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的球队训练信息管理系统&#xff0c;采用M&…

选择排序、冒泡排序、快速排序、归并排序

1、选择排序 设一个数据集有n个元素&#xff0c;选择这n个元素中最小的一个与第一个元素交换位置&#xff0c;再在剩下的n-1个元素中选择最小的一个与第二个元素交换位置&#xff0c;直到在最后两个元素中选择最小的一个放在倒数第二的位置上&#xff0c;简单选择排序是不稳定…

【Arduino ESP32教程入门】Note

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;arduino开发板引脚USB串行总线串行总线和并行总线的优…

Kerberos常见报错汇总

一.kdb5_util: Password mismatch while reading master key from keyboard 1>.错误复现 2>.错误原因分析 在初始化Kerberos数据库时需要输入密码&#xff0c;2次密码输入不一致就会导致该错误。 3>.解决方案 重新执行"kdb5_util -r YINZHENGJIE.COM create -s…

读书笔记--知识图谱基础概念与关键环节解析

知识图谱相当于一张网&#xff0c;是一种大型知识库&#xff0c;一种揭示实体之间关系的语义网络&#xff0c;是事物及其关系的形式化描述&#xff0c;分为通用知识图谱和领域&#xff08;行业&#xff09;知识图谱&#xff0c;如DBpedia&#xff0c;OpenKG&#xff0c;Wikidat…

IP行业查询API:为用户分析提供帮助

引言 在数字化时代&#xff0c;IP地址不仅代表着设备在互联网上的位置&#xff0c;还蕴含着丰富的信息。IP地址所属行业查询API应运而生&#xff0c;为用户分析提供了有力支持。本文将探讨这一工具的应用&#xff0c;以及对用户分析的帮助。 IP行业API的应用 1. 目标市场定位…