当前位置: 首页 > news >正文

操作系统(OS)与系统进程

操作系统(OS)与系统进程

  • 冯诺依曼体系结构
  • 操作系统(Operator System)
  • 进程
    • 基本概念
    • 进程的描述(PCB)
    • 查看进程
    • 通过系统调用获取进程标示符(PID)
    • 通过系统调用创建进程(fork)
    • 进程状态(初识)

冯诺依曼体系结构

要去了解操作系统,冯诺依曼体系结构是必须掌握的,它决定了计算机最底层最基础的设计思路。

image-20230903203703062

首先,冯诺依曼体系结构由四大部分构成,输入设备,存储器,中央处理器(CPU),输出设备。CPU里又有控制器和运算器两大器件组成。

image-20230903204205899

这里的存储器指的是内存,不考虑缓存情况,这里的**CPU能且只能对内存进行读写**,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。一句话,所有设备都只能直接和内存打交道 。

因此,一个程序要运行,必须加载到内存中。原因就是冯诺依曼体系结构设计就决定了必须是这样的。

那么为什么必须是内存,CPU不能直接去外设,例如硬盘中读取数据呢,原因是存储是分级的。

image-20230903204856033

木桶的短板效应很好理解,要考虑到效率问题。

操作系统(Operator System)

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括内核(进程管理,内存管理,文件管理,驱动管理),其他程序(例如函数库,shell程序等等)。

设计OS的目的 :操作系统本质就是一组软件,负责与底层硬件资源交互。与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境

操作系统本质是一款负责管理的软件,管理所有的软硬件资源。

image-20230903210501697

用户是不可能直接管理底层硬件资源的,因为操作系统不相信任何人,要与底层资源交互唯一的方式就是通过系统调用接口,通过操作系统去完成。

在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发 。

总结:

操作系统管理硬件方式:先描述,后组织

描述:将要管理的对象的属性用结构体描述整合起来

组织:将一个个的结构体用特定的数据结构进行组织

进程

基本概念

课本概念:程序的一个执行实例,正在执行的程序等。
内核观点:担当分配系统资源(CPU时间,内存)的实体。

image-20230903211633392

简单理解,就是加载到内存中的一个个程序,最简单直观的就是打开任务管理器,就是有很多很多进程。

概念简单理解即可。真正难理解的是进程的各种属性,以及操作系统对进程的管理。

进程的描述(PCB)

一个进程通常有进程信息(PCB)以及它的数据和代码组成。

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

PCB包含的信息:

标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

组织进程的方式:可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里

Linux中是通过双链表的方式将task_struct组织起来的。

image-20230903223325072

查看进程

进程信息都在/proc目录下可以找到,如要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹

image-20230903212649190

大多数进程信息同样可以使用top和ps这些用户级工具来获取 ,并且是比较推荐的。

例如查看全部进程。

image-20230903212910050

怎么查找一个进程呢。

image-20230903213801291

只需要会查找进程即可。上面一行进程的详细信息需要慢慢来理解。

通过系统调用获取进程标示符(PID)

image-20230903214509446

通过系统调用可以获取自己进程的PID或者PPID,getpid()和getppid()。

image-20230903215353681

通过系统调用创建进程(fork)

fork非常的神奇,它有两个返回值,没错,它是个函数,但是有两个返回值,将子进程的PID返回给父进程,子进程返回直接0。

image-20230904143150246

image-20230903222924321

image-20230903222812313

这次你会发现一个神奇的现象,代码中写的if else结构竟然同时执行了。难道id既是0,又是大于0的数吗。

fork是怎么做到的呢,它究竟做了什么事?

image-20230904192212594

Linux文档中关于fork的描述是这样的:

image-20230903224205835

fork是创建一个有自己PID的子进程,但是**子进程和父进程却是共享一份代码的**。

但是我们的创建子进程的目的是为了让两个进程做不同的事情,所以需要用一定的方法将两者区别开来,所以fork采用了两个返回值的方式,但是一个id如何能表示两个值呢?

在代码执行完毕,最后要return时,父进程和子进程每个都返回一次,这才实现了fork两个返回值。

但是还有一个问题子进程和父进程却是共享一份代码,那么数据也是共享的,问题是如果要对数据做修改怎么办呢?

Linux下给出的解决方式是在子进程想要对数据进行修改的时候,操作系统会阻止,并且为子进程单独开辟一块空间将数据拷贝给子进程,这种技术叫做写时拷贝

进程状态(初识)

image-20230904191519196

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在
Linux内核里,进程有时候也叫做任务),下面是Kernel源代码中的定义:

/*
\* The task state array is a strange "bitmap" of
\* reasons to sleep. Thus "running" is zero, and
\* you can test for combinations of others with
\* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态 。

进程状态有很多种,第一次接触进程状态只简单认识三大状态,运行、阻塞、挂起

image-20230904193840354

一个进程要执行要先进到运行队列中排队。

一个进程到CPU上不一定必须等到它执行结束才被拿下去,每一个进程都有时间片,如果时间到了但是没有结束依然会被拿下来到放到后面重新排队,防止一个进程一直占用资源的情况。

image-20230904195020472

而由于后面的进程都在排队,但是还占据资源,为了保证进程既能正常排队,又能节省大量资源,所以只留下PCB来排队,将对应的代码和数据交换到磁盘中,等轮到时再将对应的代码和数据交换过来,中间只有PCB的过程就是一种挂起状态。

image-20230904195554700

相关文章:

操作系统(OS)与系统进程

操作系统(OS)与系统进程 冯诺依曼体系结构操作系统(Operator System)进程基本概念进程的描述(PCB)查看进程通过系统调用获取进程标示符(PID)通过系统调用创建进程(fork)进程状态&…...

防重复提交:自定义注解 + 拦截器(HandlerInterceptor)

防重复提交:自定义注解 拦截器(HandlerInterceptor) 一、思路: 1、首先自定义注解; 2、创建拦截器实现类(自定义类名称),拦截器(HandlerInterceptor); 3…...

Excel中将文本格式的数值转换为数字

在使用excel时,有时需要对数字列进行各种计算,比如求平均值,我们都知道应该使用AVERAGE()函数,但是很多时候结果却“不尽如人意”。 1 问题: 使用AVERAGE函数: 结果: 可以看到单元格左上角有个…...

uni-app开发小程序中遇到的map地图的点聚合以及polygon划分区域问题

写一篇文章来记录以下我在开发小程序地图过程中遇到的两个小坑吧,一个是点聚合,用的是joinCluster这个指令,另一个是polygon在地图上划分多边形的问题: 1.首先说一下点聚合问题,由于之前没有做过小程序地图问题&#…...

【笔记】软件测试的艺术

软件测试的心理学和经济学 测试是为发现错误而执行程序的过程,所以它是一个破坏性的过程,测试是一个“施虐”的过程。 软件测试的10大原则 1、测试用例需要对预期输出的结果有明确的定义 做这件事的前提是能够提前知晓需求和效果图,如果不…...

配置本地maven

安装maven安装包 修改环境变量 vim ~/.bash_profile export JMETER_HOME/Users/yyyyjinying/apache-jmeter-5.4.1 export GOROOT/usr/local/go export GOPATH/Users/yyyyjinying/demo-file/git/backend/go export GROOVY_HOME/Users/yyyyjinying/sortware/groovy-4.0.14 exp…...

C# 按钮的AcceptButton和CancelButton属性

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...

SMT贴片制造:专业、现代、智能的未来之选

在现代科技的快速发展下,SMT贴片制造作为电子元器件的核心工艺之一,正以其专业、现代和智能的特点成为未来的首选。 随着电子产品越来越小型化,传统的手工焊接已经无法满足高速、高精度、高稳定性的要求。而SMT贴片制造作为一种先进的表面贴…...

python sqlalchemy db.session 的commit()和colse()对session中的对象的影响

实验一:commit()之后查看stu的属性id,查看db.session是否改变 db_test.route("/db_test",methods["GET"]) def db_test():stuStuTest()stu.stu_age22stu.stu_name"nnannns"stu.stu_class11print("sessio…...

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…...

【ES6】JavaScript中Reflect

Reflect是JavaScript中的一个内建对象,它提供了一组方法,用于对对象和函数进行操作和检查。这些方法与内建对象的方法非常相似,但具有更高的灵活性。 以下是Reflect对象的一些常用方法: 1、Reflect.apply(target, thisArgument,…...

Ajax + Promise复习简单小结simple

axios使用 先看看老朋友 axios axios是基于Ajaxpromise封装的 看一下他的简单使用 安装:npm install axios --save 引入:import axios from axios GitHub地址 基本使用 axios({url: http://hmajax.itheima.net/api/province}).then(function (result…...

WebDAV之π-Disk派盘 + 小书匠

小书匠是一款功能丰富,强大的知识管理工具。全平台覆盖,离线数据存储,自定义数据服务器,所见即所得的 markdown 编辑体验。 小书匠提供了多种实用的编辑模式,例如:栏编辑、双栏编辑、三栏编辑、全屏写作、全屏阅读等。并且该软件还提供了许多有用的扩展语法,比如Latex公…...

LTE ATTACH流程、PDN流程、PGW地址分配介绍

1、S-GW\P-GW选择 MME根据S-GW和P-GW的拓扑信息进行S-GW/P-GW的选择,在S-GW的候选序列和P-GW的候选序列中比较,寻找是否有合一的S-GW/P-GW,并且根据S-GW的优先级和权重信息进行排序,得到S-GW/P-GW的候选组。 2、SGW>PGW连接 PD…...

SQL sever中用户管理

目录 一、用户管理常见方法 二、用户管理方法示例 2.1. 创建登录账户: 2.1.1 检查是否创建账户成功: 2.2. 创建数据库用户: 2.2.1检查用户是否创建成功: 2.3. 授予权限: 2.3.1授予 SELECT、INSERT 和 U…...

linux————pxe网络批量装机

目录 一、概述 什么是pxe pxe组件 二、搭建交互式pxe装机 一、配置基础环境 二、配置vsftpd 三、配置tftp 四、准备pxelinx.0文件、引导文件、内核文件 一、准备pxelinux.0 二、准备引导文件、内核文件 五、配置dhcp 一、安装dhcp 二、配置dhcp 六、创建default文…...

处理时延降低24倍,联通云粒数据引擎优化实践

*作者:郑扬勇,云粒星河数据中台产品负责人 云粒智慧科技有限公司成立于 2018 年 6 月,是中国联通集团混改以来成立的首家合资公司,是中国智慧城市数智化建设者。一直以来,云粒智慧以数字化、智能化、集约化产品为核心&…...

学习MATLAB

今日,在大学慕课上找了一门关于MATLAB学习的网课,MATLAB对于我们这种自动化的学生应该是很重要的,之前也是在大三的寒假做自控的课程设计时候用到过,画一些奈奎斯特图,根轨迹图以及伯德图,但那之后也就没怎…...

React 18 对 state 进行保留和重置

参考文章 对 state 进行保留和重置 各个组件的 state 是各自独立的。根据组件在 UI 树中的位置,React 可以跟踪哪些 state 属于哪个组件。可以控制在重新渲染过程中何时对 state 进行保留和重置。 UI 树 浏览器使用许多树形结构来为 UI 建立模型。DOM 用于表示 …...

MySQL之事务与引擎

目录 一、事物 1、事务的概念 2、事务的ACID特点 3、事务之间的相互影响 4、Mysql及事务隔离级别(四种) 1、查询会话事务隔离级别 2、查询会话事务隔离级别 3、设置全局事务隔离级别 4、设置会话事务隔离级别 5、事务控制语句 6、演示 1、测试提交事务 2、测试事务回滚 4…...

Flink集群常见的监控指标

为确保能够全面、实时地监控Flink集群的运行状态和性能指标。以下是监控方案的主要组成部分: Flink集群概览:通过访问Flink的JobManager页面,您可以获取集群的总体信息,包括TaskManager的数量、任务槽位数量、运行中的作业以及已…...

React常见知识点

1. setCount(10)与setCount(preCount > preCount 10) 的区别: import React, { useState } from react; export default function CounterHook() {const [count, setCount] useState(() > 10);console.log(CounterHook渲染);function handleBtnClick() {//…...

Vue-router路由

配置路由 相当于SpringMVC的Controller 路径然后,跳转到对应的组件 一键生成前端项目文档...

JVM-CMS

when 堆大小要求为4-8G 原理 初始标记:执行CMS线程->STW,标记GC Root直接关联的对象->低延迟 并发标记:执行CMS线程和业务线程,从GC Root直接关联的对象开始遍历整个对象图 重新标记:执行CMS线程->STW&a…...

无涯教程-Flutter - Dart简介

Dart是一种开源通用编程语言,它最初是由Google开发的, Dart是一种具有C样式语法的面向对象的语言,它支持诸如接口,类之类的编程概念,与其他编程语言不同,Dart不支持数组, Dart集合可用于复制数据…...

如何创建美观的邮件模板并通过qq邮箱的SMTP服务向用户发送

最近在写注册功能的自动发送邮箱告知验证码的功能,无奈根本没有学过前端,只有写Qt的qss基础,只好借助网页设计自己想要的邮箱格式,最终效果如下: 也推销一下自己的项目ShaderLab,可运行ShaderToy上的大部分着色器代码&…...

手机无人直播软件在苹果iOS系统中能使用吗?

在现代社交媒体的时代,直播带货已经成为了一种热门的销售途径。通过直播,人们可以远程分享自己的商品,与观众进行互动,增强沟通和参与感。而如今,手机无人直播软件更是成为了直播带货领域的一项火爆的技术。那么&#…...

创建2个线程并执行(STL/Windows/Linux)

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun1(void) {cout << "one STL thread 1!" << endl; }void thread_fun2(void) {cout << "one STL thread 2!" <…...

Redis可以干什么

Redis可以做什么&#xff1f; 缓存 Redis作为一款高性能的缓存数据库&#xff0c;能够将常用的数据存储在内存中&#xff0c;以提高读写效率。它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合等&#xff0c;让你可以根据业务需求选择合适的数据结构进行缓存。 …...

R语言+Meta分析;论文新方向

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…...

网站制作和网页制作区别/百度推广账户优化

一.类模板当做模板的参数 #include<iostream> #include<string> using namespace std; //类模板当做一个类的参数 template<class T> class ren //一个通用的类模板 { public:T name;ren(T t):name(t){}}; template<template<class T>class T1>…...

做网站买主机还是服务器/还有哪些平台能免费营销产品

上证综合指数作为A股市场第一条股票指数&#xff0c;将于7月22日迎来重大优化。修订后的编制方案将剔除风险警示股票、延长新股计入时间&#xff0c;并计入科创板上市证券。上证综合指数等以样本股的发行股本数为权数进行加权计算&#xff0c;计算公式为&#xff1a; 报告期指…...

网站优化计划/中国百强城市榜单

当前越来越多的消费者对自己所需要使用的产品尤其是音效产品都有了更高的需求。追求极致的音效体验&#xff0c; 这也给外置声卡行业带来极大的发展空间。现如今声卡主要面向热衷于钻研电子科技&#xff0c;或直播行业&#xff0c;游戏领域的年轻消费群体&#xff0c;在产品的沟…...

腾博会的网站是什么/百度关键词seo推广

基础知识 jwt是由三部分构成的&#xff0c;第一部分是头部&#xff08;header&#xff09;&#xff0c;第二部分是载荷&#xff08;payload&#xff09;&#xff0c;第三部分为签证&#xff08;signature&#xff09; 头部 头部声明了类型和加密方法&#xff0c;如下 {typ:…...

网做 网站有哪些功能/农产品推广方案

用awk将文件中的几行合并为一行awk { printf ("%s ", $0)} END {printf ("\n") } 转载于:https://blog.51cto.com/maocong/1616687...

南昌有限公司 网站/百度seo教程视频

如果2020年全球共用一个表情&#xff0c;那应该是一张皱着眉头的、充满疑惑的脸。在漫长的居家隔离、艰苦的抗疫防疫中&#xff0c;2020年给每个人留下了满满的告诫与警示&#xff1a;人类必须重新思考与自然环境间的关系。这一年&#xff0c;疫情影响和改变了每个人的生活与工…...