Linux第十一节课 - 进程

一个程序从磁盘以文件的形式加载到内存之后,已经变成了进程!

引入管理者和被管理者

1、管理者和被管理者不需要见面!(例如学生和校长!)

2、管理者在不见被管理者的情况下,如何做好管理呢?只要能够得到管理信息,就可以在未来进行管理决策!(管理的本质:通过对数据的管理,达到对人的管理)

3、管理者和被管理者面都不见,怎么才能拿到数据?

通过辅导员(本质上也是执行者 ---> 执行校长的命令)

例如网卡出现问题,这时,驱动程序会将有问题的数据报告给操作系统,此时操作系统检测到硬件网卡出现问题,操作系统自动修复,如果修复不了就向上报给用户说明故障!

如果学生(硬件)太多,此时操作系统会将学生按照结构体的类型整理起来!

类似于链表结构!此时10000个学生就会有10000个结构体对象!

此时,成功的将对学生(硬件)的管理工作,改为对链表的增删改查!

软硬件的数量太大!此时操作系统会根据软硬件的属性进行分类(描述的过程),然后再将分类好的结果按照数据结构的类型进行管理(组织的过程)!

在操作系统中,管理任何对象,最终都可以转化为某种数据的增删查改!(先描述再组织!)

先描述再组织:面向对象编程的核心思想也是!(例如clsaa类)

操作系统改成为硬件的管理对链表的增删查改(这一过程称为---建模)---> 计算机只能这么做!

操作系统中一定存在了大量的数据结构!

如果我们使用printf函数打印东西到显示器上面!(这个过程是从上到下依次贯穿的!)

因此对于C/C++的库函数(lib)和系统调用的关系是上下层的关系!(上下层的调用和被调用的关系!)

总结:

1、计算机管理硬件

  • 描述起来用struct结构体(因为操作系统就是C写的!)
  • 组织起来,用链表或者其他高效的数据结构!

2、系统调用和库函数

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

一、再谈进程 

1、引入

如果进程有成千上百个,操作系统怎么对进程进行规划呢?

也是先描述再组织!!!

一个被加载到内存中的程序,也叫做进程!(进程也叫任务)

也有的教材说:正在运行的程序叫做进程!

正常情况下我们写的myprocess.c和myprocess可执行程序都位于磁盘当中!

此时如果我们运行./myprocess,就会形成一个进程!

开机的本质就是把操作系统从外设搬入到内存当中!!!

就例如我们如果想要运行./myprocess,需要将其加载到内存中,再由CPU进行处理!!!

一个操作系统,不仅仅只能运行一个进程,还可以同时运行多个进程!

操作系统必须对所有的进程管理起来!如何管理呢?--->  先描述,再组织!!!

任何一个进程,再加载到内存的时候,形成真正的进程时,操作系统要先创建描述进程的结构体对象------PCB(process ctrl block)------ 进程控制块

人是怎么辨别一个事物或者对象的?(通过属性认识的!!!)

当属性够多的时候,这一堆属性的集合,就是目标对象!!!

同样的,描述一个进程的时候,如果进程的描述属性足够多,那么我们就可以确定具体的进程!!!(本质就是面向对象!!)

因为操作系统是C语言写的,所有进程本质就是操作系统中的一个结构体类型!!!

PCB是一个结构体,里面存放用于区分不同进程的属性,例如:进程的编号,进程的状态,优先级,相关的指针信息(通过指针找到对应的代码和数据),(struct PCB* next)(可能是以链表的形式进行描述多个进程的)......

PCB也被加载到内存中!而当我们运行一个可执行程序,代码和数据可会被加载到内存当中!此时,我们可以自己给进程一个定义:

内核PCB数据结构对象 + 自己的代码和数据     ---- >进程

但是通常操作系统管理进程不看代码和数据,仅仅是通过PCB对象来管理

当有多个进程的时候,操作系统会根据PCB创建对应的PCB结构体对象!这个结构体对象可以找到自己原来的代码和数据!

此时,在操作系统中对进程的管理变成了对链表的增删查改!!!

因此,此后操作系统对进程管理都是对PCB结构体对象进行管理!!!

上述步骤,任何操作系统都是这样子定义来的

2、那么具体Linux是怎么实现的?

在不同的操作系统,windows/Linux/mac实现的差别有所不同!

课本上称之为PCB,但是在Linux系统中称之为PCB:task_struct;

task_struct是PCB的一种!

  • 在Linux系统中描述进程的结构体叫做task_struct;
  • task_struct是Linux内核的一种数据结构(一种自定义类型),它会被装载到RAM(内存)里并且保存进程的信息!
task_ struct内容分类
  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。(唯一的一个编号!)
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。(进程在运行的时候会经常被其他事物影响而停止或者中断,此时记录下运行到当前位置的地址,方便后面接着运行!)
  • 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针(方便找到对应的数据)
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息

小总结:

  • pcb -> task_struct 结构体里面包含了进程的所有属性;
  • Linux中如何组织进程  ---> Linux系统中,最基本的组织进程采用task_struct的方式,采用的是双链表组织的(一个PCB对象可能不止在链表中,还有可能在二叉树等其他数据结构中!)

例如使用PCB_*next链入链表;使用PCB_*queue链入队列;

对进程的管理工作,取决于将进程放进那个被管理的数据结构类型中!

3、查看进程的相关属性

ps命令可以查看属性;

运行两个一模一样的程序会生成两个进程!

  • PID就是其中进程唯一的ID值,用于区分不同的进程;

Linux系统中存在一个目录

ls /proc

可以通过 /proc查看当前系统下的所有进程;

下面的grep -- color=autor 实际上就是grep对应的进程!

grep的关键字里也有process,因此当它在执行过滤系统当中的进程时,首先会把自己变成进程,然后自己才会被CPU调度,执行自己的过滤代码!

通过ls查看会发现根据ID号码排列的一个个目录, 系统当中启动的所有进程,默认会在 /proc下面创建一个以该进程PID命名的文件夹!该目录下保存了进程的大部分属性!

ls /proc/20639

可以改看该PID下进程的相关信息

如果此时再将程序关闭,会发现文件夹消失!

再次运行后进程的PID号码发生改变!(大概率会发生改变)

proc目录中包含的是系统动态目录下的相关进程的信息!

cwd  --- > current work dir 指的是当前进程的工作目录

在C语言中,如果使用fopen创建一个文件,这个文件一般在当前目录下存放!

且为什么在一个目录下touch test.c是在当前目录下创建的?

实际上,当touch这个指令运行起来变为进程,默认进程在哪个目录,这个进程所在的目录就是当前目录!(PCB属性会记录当前所在的Linux的绝对路径为但当前路径!)

实际上fopen在运行的时候会将"log.txt"拼接到cwd的后面!

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

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

相关文章

Windows下Python和PyCharm的应用(二)__快捷键方式的设定

前言 程序写久了,难免会形成自己的编程习惯。比如对某一套快捷键的使用,已经形成了肌肉记忆。 为了方便快捷键的使用,可以在PyCharm中设置自己喜欢的快捷键。 我比较习惯于微软Visual Studio的快捷键设置。(因为早些年VC开发用的…

计算机网络与Internet应用

一、计算机网络 1.计算机网络的定义 网络定义:计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享…

数据仓库技术选型方案文档

关联博客: 数据仓库技术选型方案文档 Flink CDC MySQL数据同步到Doris表同步配置生成工具类 新版报表系统(明细报表、看板、数据大屏)方案&介绍 文章目录 数据仓库技术选型背景现状现状架构目标架构业务反馈&痛点问题:原因…

QT定时器QObiect/QTimer

QT定时器 一、QObiect: startTimer ----------- killTimer 电子相册,利用定时器轮播图片 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);picID …

【C++11】类的新功能

【C11】类的新功能 文章目录 【C11】类的新功能一、移动构造和移动赋值的特点二、类成员变量初始化三、强制生成默认函数的关键字default四、禁止生成默认函数的关键字delete五、继承和多态中的fifinal与override关键字 一、移动构造和移动赋值的特点 ​ 默认成员函数&#xf…

对一个已经运行的LabVIEW VI进行控制

要对一个已经运行的LabVIEW VI进行控制,可以采用多种方法,这取决于你想要控制的内容以及具体的应用场景。以下是几种常见的实现方式: 1. 使用全局变量或功能全局变量(FGV) 方法: 你可以创建全局变量或功能全局变量&am…

枚举和联合体

1.枚举类型 1枚举类型的声明 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的7天,可以一一列举 性别有:男、女、保密,也可以一一列举 月份有12个月,也可以一一…

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,fr…

自然语言处理系列六十三》神经网络算法》LSTM长短期记忆神经网络算法

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十三神经网络算法》LSTM长短期记忆神经网络算…

fail to install hcmon driver问题解决

对我搜集到的解决办法进行总结: 没有删除“C:\Windows\System32\drivers”)下的 hcmon.sys 驱动文件,删除后重启后安装修改了注册表默认下载位置,使用winR输入regedit,将 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion这个路径下的都改为C…

PyTorch 卷积层详解

PyTorch 卷积层详解 卷积层(Convolutional Layers)是深度学习中用于提取输入数据特征的重要组件,特别适用于处理图像和序列数据。PyTorch 提供了多种卷积层,分别适用于不同维度的数据。本文将详细介绍这些卷积层,特别…

Java项目: 基于SpringBoot+mysql+maven房屋租赁系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven房屋租赁系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…

【鸿蒙】HarmonyOS NEXT星河入门到实战3-ArkTS界面起步开发

目录 一、界面开发布局思路 二、组件的属性方法 三、字体颜色 四、文字溢出省略号、行高 五、Image图片组件 六、输入框与按钮 七、综合实战- 华为登录 八、设计资源-svg图标 前言:HarmonyOS NEXTArkTS界面开发起步。开发工具:仍然是 DevEco Studio 学习界面…

【电子通识】洁净度等级划分及等级标准

洁净度常用于评估半导体、生物制药、医疗、实验室及科研院所、新能源等领域的洁净室、无尘室或者无菌室等环境。 一般来说,晶圆光刻、制造、测试等级为100级或1000级的洁净间,百级洁净间要求空气中0.5微米的尘埃粒子数不得超过每立方米3520个&#xff1b…

Mysql 数据库免费使用

目录 前言 详细步骤 总结 前言 由于工作需要现在打算学习WPF开发,因为需要访问mysql数据,但是又不想在自己电脑上安装。于是就上网试着查了下,发现果然有提供免费数据库服务的网站。nice!所以就打算写一篇文章详细记录一下&…

计算机电脑共享文件和打印机共享问题:“计算机无法访问!您可能没有权限使用网络资源。请与这台服务器的管理员联系以查明您是否有访问权限。”解决办法

在Win10系统中,我们在访问局域网共享文件或计算机共享打印机的时候会出现“你可能没有权限使用网络资源 ”。请与这台服务器的管理员联系以查明你是的提示,很多用户不知道如何解决,下面就把正确的解决方法分享给大家,你可能没有权…

C++11线程池、多线程编程(附源码)

Test1 示例源码展示&#xff1a; #include<iostream> #include<thread> #include<string> using namespace std;void printHelloWord(string s) {cout << s << endl;//return; } int main() {string s;s "wegfer";thread thread1(p…

getLocation:fail, the permission value is offline verifying

getLocation:fail, the permission value is offline verifying 后端会根据appid和secret生成 签名&#xff0c;前端wx配置时一定用appid来验证签名的正确 本次错误为配置初始化失败&#xff1a;前端与后端的appId不一致&#xff0c;我的失误也

Linux CentOS 7.9 安装mysql8

1、新建mysql文件夹 数据比较大&#xff0c;所以我在服务器另外挂了一个盘装mysql&#xff0c;和默认安装一个道理&#xff0c;换路径即可 cd ../ //创建文件夹 mkdir mysql //进入mysql文件夹 cd mysql 2、下载mysql8.0安装包并解压、重命名 //下载安装包 wget https://dev…

yolov8 pt转onnx

第一步&#xff1a; 安装onnx pip install --upgrade onnx 第二步&#xff1a; 将以下代码创建、拷贝到yolov8根目录下。具体代码test.py&#xff1a; from ultralytics import YOLO # Load a model model YOLO(yolov8n.pt) # load an official model # Export the mode…