深入理解操作系统- - 进程篇(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.xdnf.cn/news/145607.html

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

相关文章

C++ -- 学习系列 std::deque 的原理与使用

一 deque 是什么? std::deque 是 c 一种序列式容器,其与 vector 类似,其底层内存都是连续的,不同的地方在于, vector 是一端开口,在一端放入数据与扩充空间,而 deque 是双端均开口,都可以放…

pip version 更新

最近报了一个错: 解决办法: 在cmd输入“conda install pip” conda install pip 完了之后再输入: python -m pip install --upgrade pip ok.

C++ AB组辅导课

C AB组辅导课 蓝桥杯C AB组辅导课 第一讲 递归与递推 Acwing1、整数划分(递归)2、acwing92. 递归实现指数型枚举10凑算式(全排列)11李白打酒(全排列)12、棋牌总数(递归)13、剪邮票(递归)14、1050. 鸣人的影分身 (递归或动态规划(记忆化搜索))15、方格分割 (dfs思维&…

Win10自带输入法怎么删除-Win10卸载微软输入法的方法

Win10自带输入法怎么删除?Win10系统自带输入法就是微软输入法,这个输入法满足了很多用户的输入需求。但是,有些用户想要使用其它的输入法,这时候就想删除掉微软输入法。下面小编给大家介绍最简单方便的卸载方法吧。 Win10卸载微软…

Oracle物化视图(Materialized View)

与Oracle普通视图仅存储查询定义不同,物化视图(Materialized View)会将查询结果"物化"并保存下来,这意味着物化视图会消耗存储空间,物化的数据需要一定的刷新策略才能和基表同步,在使用和管理上比…

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

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

Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境

参考的博客: Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter,并创建虚拟环境 理解和创建:Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址,可…

7.网络原理之TCP_IP(上)

文章目录 1.网络基础1.1认识IP地址1.2子网掩码1.3认识MAC地址1.4一跳一跳的网络数据传输1.5总结IP地址和MAC地址1.6网络设备及相关技术1.6.1集线器:转发所有端口1.6.2交换机:MAC地址转换表转发对应端口1.6.3主机:网络分层从上到下封装1.6.4主…

django 实现:闭包表—树状结构

闭包表—树状结构数据的数据库表设计 闭包表模型 闭包表(Closure Table)是一种通过空间换时间的模型,它是用一个专门的关系表(其实这也是我们推荐的归一化方式)来记录树上节点之间的层级关系以及距离。 场景 我们 …

网页采集工具-免费的网页采集工具

在当今数字化时代,网页采集已经成为了众多领域的必备工具。无论是市场研究、竞争情报、学术研究还是内容创作,网页采集工具都扮演着不可或缺的角色。对于许多用户来说,寻找一个高效、免费且易于使用的网页采集工具太不容易了。 147SEO工具的强…

Spring Mvc的相关知识

一、初识MVC 1.Spring Mvc 是控制层的Spring框架,替换Servlet,除了它以外,还有 struct1和 struct2 区别: 1.struct1被struct2 取代 2.struct2:采用 prototype多例模式,内存消耗快,经常会出现内存…

C++ 类构造函数 析构函数

类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。 下面的实例有助于更好地…

MySQL架构 InnoDB存储引擎

1. 什么是Mysql? 我们在开发的时候,我们都需要对业务数据进行存储,这个时候,你们就会用到MySQL、Oracal等数据库。 MySQL它是一个关系型数据库,这种关系型数据库就有Oracal、 MySQL,以及最近很火的PgSQL等。…

JSP学习笔记【三】——JQuery

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

Linux开发工具之文本编译器vim

●IDE例子 Linux编辑器-vim使用 vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行&#xff…

金融生产存储亚健康治理:升级亚健康 3.0 ,应对万盘规模的挑战

随着集群规模的不断扩大,硬盘数量指数级上升,信创 CPU 和操作系统、硬盘多年老化、物理搬迁等多种复杂因素叠加,为企业的存储亚健康管理增加了新的挑战。 在亚健康 2.0 的基础上,星辰天合在 XSKY SDS V6.2 实现了亚健康 3.0&#…

渗透测试之打点

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

ElasticSearch 10000条查询数量限制

一、前言 我们将库存快照数据导入ES后发现要分页查询10000条以后的记录会报错,这是因为ES通过index.max_result_window这个参数控制能够获取数据总数fromsize最大值,默认限制是10000条,因为ES考虑到数据要从其它节点上报到协调节点如果搜索请…

APACHE NIFI学习之—UpdateAttribute

UpdateAttribute 描述: 通过设置属性表达式来更新属性,也可以基于属性正则匹配来删除属性 标签: attributes, modification, update, delete, Attribute Expression Language, state, 属性, 修改, 更新, 删除, 表达式 参数: 如下列表中,必填参数则…

Leetcode 剑指 Offer II 046. 二叉树的右视图

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个二叉树的 根节点 root,请找出该二叉树的 最底…