Linux进程(1)(结构-操作系统-进程)

目录

1.体系结构

 2.操作系统(Operator System)

1)概念:

2)结构 示意图(不完整)

3)尝试理解操作系统

4)系统调用和库函数概念

3.认识进程

1.启动

2.进程创建的代码方式 --- 重操作,轻原理

1)创进程

2)我们为什么要创建子进程呢? 


1.体系结构

输入设备:键盘、鼠标、摄像头、话筒、磁盘、网卡......

输出设备:显示器、声卡、磁盘、网卡......

CPU:运算器、控制器

存储器:内存

数据是要在计算机的体系结构中进行流动的,流动过程中,进行数据的加工处理从一个设备到另一个设备,本质:是一种拷贝!!!

又因为中央处理器的运行速度非常之快,因此数据设备间的拷贝的效率,决定了计算机整机的基本效率!

存储:距离CPU越近,效率越高,成本越高

若没有存储器,而是直接将CPU位于输入和输出设备两者的中间,那么将会导致一个类似于木桶效应似的缺点(装水的多少不是由长板子决定的,而是由短板子决定的),若是这样放置,由于输入输出设备拷贝的速度相比CPU来说非常的慢,导致CPU大部分时间不是在处理数据,而是在等待输入输出设备拷贝数据。

CPU 的速度远远快于外部设备(如磁盘、光驱等),内存作为介于 CPU 和外部设备之间的媒介,可以帮助平衡这种速度差异CPU 可以快速地从内存中读取或写入数据,而内存则可以暂时存储来自外部设备的数据,使得 CPU 不必等待外部设备完成读写操作。

因此要在三者间设置一个存储器。

对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上 qq 开始和某位朋友聊 天开始,数据的流动过程。
  1. 输入设备:您在电脑或手机等设备上输入登录 QQ 的账号、密码以及与朋友聊天的信息,这些输入设备(如键盘、触摸屏)将您的操作转换为电信号。

  2. 存储器:输入的数据首先被存储在本地设备的存储器(如内存)中。

  3. 控制器:控制器指挥数据的流动和处理,它协调各个部件的工作,将登录和聊天数据发送到运算器进行处理。

  4. 运算器:对登录和聊天数据进行处理,如加密、编码等操作。

  5. 输出设备:处理后的数据通过网络接口(可视为一种输出设备)发送到网络中。

  6. 网络传输:数据通过网络以数据包的形式传输,经过多个路由器和网络节点,最终到达 QQ 服务器。

  7. QQ 服务器接收:服务器的输入设备接收数据包,数据存储在服务器的存储器中。

  8. 服务器处理:服务器的控制器和运算器对数据进行处理,如验证登录信息、查找接收方的连接信息、转发聊天数据等。

  9. 服务器输出:处理后的聊天数据再次通过网络发送给接收方的设备。

  10. 接收方设备接收:接收方设备的输入设备接收数据,经过类似的处理流程,最终在输出设备(如屏幕)上显示聊天内容。

在硬件数据流动角度,在数据层面:


1.CPU不和外设直接打交道,CPU只和内存打交道

2.外设(输入和输出)的数据,不是直接给CPU的,而是先要放入内存中

 2.操作系统(Operator System

1)概念:

是一款软件,对软硬件资源进行管理的软件

广义上的认识:操作系统的内核 + 操作系统的外壳周边程序(给用户提供使用操作系统的方式)

狭义上的认识:只是操作系统的内核

2)结构 示意图(不完整)

3)尝试理解操作系统

管理好,不需要管理者和被管理者直接接触

管理的本质不是对被管理的对象做管理,而是对被管理者的数据做管理

任何管理,要建模:

先描述,再组织

先把被管理对象先描述起来,有几个被管理对象,就把几个被管理对象所对应的数据对象用特定的数据结构组织起来

C++语言中封装 --- 就是描述对象!!!        而它的STL则是组织方式

比如实践通讯录时,要先构建结构体,然后定义   本质上就是先描述,再组织

所以凡是要对特定的对象进行管理:都是先描述,再组织

任何上层用户想要访问操作系统的功能,都必须直接或间接的使用系统调用(system call),而不是直接访问

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

3.认识进程

在操作系统中,进程可以同时存在非常多!!!

进程 = PCB( process control block) +自己的代码和数据
这样以来,对进程的管理,就变成了 对链表的增删查改!!!
为什么要有PCB呢?? ----  因为OS要对进程进行管理!!    先描述,再组织
Linux操作系统下的PCB : task_struct
进程 = 内核task_struct结构体 + 程序的代码和数据
1.启动

a. ./XXXX,本质就是让系统创建进程并运行 --- 我们自己写的代码形成的可执行 == 系统命令 == 可执行文件。在linux中运行的大部分指令操作,本质都是运行进程!!!


b. 每一个进程都要有自己的唯一标识符,叫做进程pid


c. 一个进程,想知道自己的pid???
d. ctrl +c 就是在用户层面终止进程, kill -9 pid 可以用来直接杀掉进程
2.进程创建的代码方式 --- 重操作,轻原理
1)创进程

fork()

开启监视窗口指令:

while :; do ps axj | head -1 && ps axj | grep myprocess | grep -v grep; sleep 1; done

第二个出现的进程,他的ppid为第一个进程的pid,因此下一个进程为上一个进程的子进程

在fork之后,父子代码共享
创建一个进程,本质是系统中多了一个进程,多了一个进程,就是多了--->
1.内核task_struct
2 有自己的代码和数据
父进程的代码和数据是从磁盘加案的子进程的代码和教据?? 默认情况继承父进程的代码和教据
2)我们为什么要创建子进程呢? 

我们想让子进程头行和父进程执行不一样的代码

即返回给父进程一个PID,子进程一个0.
fork()是一个函数吗,答案是是的,只不过是有OS提供的
那么问题又来了,为什么fork()这个函数能提供两个返回值呢?
原因是当我们执行到 return 的时候,函数的核心工作已做完了,这时候是不是 子进程已经存在了(即可以被调度使用了!!),因此return执行两次也不是很奇怪吧
进程一定要做到:
进程具有独立性(即一个进程被杀掉,不会影响别的进程)--  因此当你杀掉父进程时,不会影响子进程的运行。
进程 = 内核数据结构task_struct + 代码和数据
其中代码是只读的,不可修改,因此父子 共用代码,但是 数据不一样,父子各自独立,原则上数据要分开
(exe)即进程的pcb中会记录自己对应的可执行程序的路径
(cwd)即进程当前的工作路径!!
当程序在运行时,这时我们把他的exe可执行文件删除会怎么样呢?
虽然已经被删除,但是我们会发现该程序还在运行着:
这又是为什么呢?
因为 原则上一个程序要被变成进程调度,他就已经在内存中以及存在一份了,这时候你把他在磁盘上的可执行程序删除时,还能跑。
那为什么是原则上呢?
因为当该程序 在磁盘上的占用空间大于内存空间时,接着跑下去肯定会出现问题的。
每个进程在启动的时候,会记录自己当前在哪个路径下启动,进程的当前路径
这里将当前工作路径做了修改,导致其新生成的log.txt并不在默认的当前工作目录(exe所在位置),而是在修改过后的位置

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

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

相关文章

Mojo 编程语言:AI 开发者的必备利器

目录 1. Mojo 的背景与发展 1.1 编程语言的演变 1.2 Mojo 的诞生 2. Mojo 的核心特点 2.1 高性能计算 2.2 易用性 2.3 灵活性 3. Mojo 的关键技术 3.1 静态类型系统 3.2 并行计算 3.3 高效的内存管理 3.4 GPU 加速 4. Mojo 的应用场景 4.1 数据处理与分析 4.2 机…

王道考研数据机构:中缀表达式转为后缀表达式

实现方法: 初始化一个栈,用于保存暂时还不能确定运算顺序的运算符。从左到右处理各个元素,直到末尾。可能遇到三种情况: 遇到操作数。直接加入后缀表达式遇到界限符。遇到“(”直接入栈;遇到“)”则依次弹出栈内运算符并加入后缀表达式&…

C#用反射机制调用dll文件的字段、属性和方法

1、创建dll文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace CLStudent {public class Student{//字段public string Name "Tom";//属性public double ChineseScore { get; s…

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段: …

【linux/shell】linux如何去除字符串中空格

在Linux中,去除字符串中的空格可以使用多种方法,以下是一些常见的命令和技巧: 1. 使用 tr 命令: tr 命令可以用来替换或删除字符。要删除空格,可以使用: echo "字符串" | tr -d 2. 使用 se…

【C++】开源:nlohmann/json数据解析库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍nlohmann/json数据解析库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&am…

计算机组成原理--概述

🌈个人主页:小新_- 🎈个人座右铭:“成功者不是从不失败的人,而是从不放弃的人!”🎈 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 🏆所属专栏&#xff1…

Jetpack Compose实战教程(五)

Jetpack Compose实战教程(五) 第五章 如何在Compose UI中使用基于命令式UI的自定义View 文章目录 Jetpack Compose实战教程(五)一、前言二、本章目标三、开始编码3.1 先让自定义控件能跑起来3.2给自定义控件使用compose的方式赋值…

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

C#Modbus通信

目录 1&#xff0c;辅助工具。 2&#xff0c;初识Modbus。 3&#xff0c;基于ModbusRTU的通信。 3.1&#xff0c;RTU与ASCII模式区别 3.2&#xff0c;Modbus存储区 3.3&#xff0c;报文格式 3.4&#xff0c;异常代码 3.5&#xff0c;详细文档连接 。 3.6&#xff0c;代…

2024 年第十四届亚太数学建模竞赛(中文赛项)浅析

需要完整B题资料&#xff0c;请关注&#xff1a;“小何数模”&#xff01; 本次亚太(中文赛)数学建模的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&…

纸飞机社工库

收集了一些比较好用的纸飞机社工库&#xff0c;有纸飞机的可以加一下 Space X 隐私信息查询平台https://t.me/SpaceSGK_bot?startKhbOsEdELmingeek社工库 https://t.me/ingeeksgkbot?startNzM3ODE5NDM5Nw Botnet免费社工机器人https://t.me/SGK_0001_bot?start7378194397暗…

TZDYM001矩阵系统源码 矩阵营销系统多平台多账号一站式管理

外面稀有的TZDYM001矩阵系统源码&#xff0c;矩阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c;混剪生成原创视频&#xff0c;账号分组&#xff0c;意向客户自动采集&#xff0c;智能回复&#xf…

【C++ | 继承】C++的继承详解 及 例子源码演示

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…

信用卡没逾期就万事大吉了吗?

6月28日&#xff0c;中国人民银行揭晓了《2024年第一季度支付体系概览》&#xff0c;数据显示&#xff0c;截至本季度末&#xff0c;信用卡及借贷合一卡的总量为7.6亿张&#xff0c;与上一季度相比&#xff0c;这一数字微降了0.85个百分点。同时&#xff0c;报告还指出&#xf…

AE的合成

目录 合成的概念 合成设置 预设 像素长宽比 分辨率​编辑 开始时间码和持续时间 背景颜色 合成的实战理解 在AE的操作界面中&#xff0c;当我们新建了一个项目之后&#xff0c;画面中最主要的位置显示的是新建合成 合成的概念 AE是一款专业特效合成软件&#xff0c;可…

【吊打面试官系列-MyBatis面试题】MyBatis 实现一对一有几种方式?具体怎么操作的?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f; 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询…

Golang 指针+运算符

指针 获取变量的地址(指针)&#xff0c;用 & 操作符&#xff0c;比如 &number 指针类型&#xff0c;存储的是一个地址&#xff0c;比如 *int&#xff0c;*float64 访问指针类型指向空间&#xff0c;用 *&#xff0c;比如 *ptr 指针空值类型是nil &#xff0c;而不是…

【记录】如何使用IDEA2023

前言&#xff1a; 记录IDEA2023的激活与安装 第一步&#xff1a;官网下载安装包&#xff1a; 下载地址&#xff1a;https://www.jetbrains.com/idea/download/other.html 这个最好选择2023版本&#xff0c;用着很nice。 安装步骤就不详解了&#xff0c;无脑下一步就可以了…

【并发编程】-3.锁的类型、CAS、UNSAFE、原子操作

锁的类型 可重入锁和不可重入锁 可重入锁&#xff1a;一个线程可以多次抢占同一个锁&#xff1b;Synchronized、ReentrantLock都是可重入锁&#xff0c;用Synchronized进行锁的可重入测试&#xff0c;在同一个线程中定义childMethod()和childMethod2()两个方法&#xff0c;在这…