进程概念——Linux

news2024/11/15 5:28:14

“技术是时间积淀出来的,你能速成的东西,别人也可以速成,所以需要耐心学习”

猛戳订阅🍁🍁 👉Linux操作系统详解👈 🍁🍁

这里是目录标题

  • 一、冯诺依曼结构
    • 为什么要存在内存?
    • 局部性原理
  • 二、操作系统
    • 什么叫做管理?
    • 什么叫做进程?
    • 进程我们学什么?
    • OS内核
  • 三、Linux可以打游戏吗
  • 四、ps axj显示自己的进程
  • 五、查看进程的信息
  • 六、怎么绕过C语言直接调用系统接口?
    • 获取进程的pid
  • 七、创建进程的方法
    • fork()代码创建子进程
    • 为什么fork会返回两次?
  • 八、操作系统进程状态原理
    • 运行态
    • 终止状态
    • 进程阻塞(重点)
    • 进程挂起(重点)
  • 九、Linux进程状态
    • 孤儿进程
  • 十、进程优先级
    • 为何会存在优先级
    • PRI和NI

一、冯诺依曼结构

图片来自百度百科
在这里插入图片描述
输入设备:键盘,话筒,摄像,(磁盘,网卡),C语言可以进行文件操作,所以磁盘可以作为输入设备。

输出设备:显示器,音响,磁盘,网卡,甚至显卡也是输出设备。

运算器+控制器(CPU):运算器进行了算数计算和逻辑计算。
控制器主要协调数据搬到内存,或者从内存搬到外设。
cpu只能被动的完成某种功能,相当于工具人,一般都是需要配合操作系统完成的。

存储器:这里的存储器指的是内存,内存不是磁盘。
除了内存之外的设备几乎都是外存。

为什么要存在内存?

CPU内包含了许多寄存器。寄存器的速度是非常快的。

CPU的运算速度 > 寄存器的速度 > L1~L3 > 内存 > 磁盘 > 光盘

一般来说速度越快价格越高。

假如只有输入设备 ——CPU——输出设备。
则效率会很低。效率由最低的设备决定,符合木桶效应。

以为输入设备和输出设备的速度比CPU慢很多。所以这时候冯诺依曼加了一个内存。

内存的速度比外设快,但是比CPU慢,所以可以把数据提前加载到内存,等待CPU读取和输入。

内存先接受输入设备的数据,然后把数据传给CPU计算,CPU再返回给内存,然后内存再输出到输出设备。

内存在我们看来,就是体系结构中的一个大的缓存,用来适配CPU和外设速度不均的问题。

从数据角度来讲:
外设和CPU不直接打交道,而是和内存打交道。

内存存在的最大意义:使用较低的钱,获取较高的性能。

我们都听过一句话,程序在编译好之后,必须先加载内存。
因为CPU需要与内存交互,所以需要先将编译好的代码编译到内存。

我们开机的时候就是把操作系统加载到内存。这就是预加载。

局部性原理

提前把数据加载到内存中,叫做局部性原理。
大概就是假如你现在正在执行第10行代码,则操作系统可以提前把你的第11行以后的代码都提前加载到内存。

这样就可以提高整个计算机的效率。

比如你刚打开计算机他比较卡,但是用了几十分钟后就不卡了,这就是提前加载到内存的好处。

二、操作系统

操作系统是一款软件,是一款搞管理的软件。

什么叫做管理?

所谓的管理就是决策者拿到相应的数据通知执行者,来对人进行间接地管理。

决策者就相当于操作系统,中间执行的人是驱动,硬件就是被管理者。

管理的本质就是对数据的管理——对数据的管理再转换为对数据结构的管理。

管理的核心的概念:先描述,再组织
先描述对应先创建结构体。
再组织对应进行链表链接。

比如写学生信息管理系统,我们先定义结构体来描述对象,然后再定义结构来组织这些对象。

所以我们需要学习 语言+数据结构。

语言是用来描述对象,数据结构是用来组织对象。

什么叫做进程?

操作系统包含四个管理模块:
内存管理 、进程管理、文件管理、驱动管理。

进程概念:进程就是一个运行起来的程序
这是肤浅的说法,实际上是将进程的结构体+进程的代码合起来才叫做进程。

操作系统里面能同时存在大量的进程,操作系统需要将所有的进程管理起来。

对进程的管理,本质就是对进程数据结构的管理。
所以这时候就用到先描述,再组织了

在Linux中,描述采用的是task_struct这个结构体,这个结构体里面包含了单个进程的所有数据。

组织采用的是链表结构。

在操作系统这门学科中,很多教材叫进程为PCB,叫做进程控制块

进程 = 对应的内核数据结构+可执行程序
也就是进程控制块=进程结构体+进程代码。

所谓的管理进程就是管理PCB的数据结构。也就是对链表的增删查改。

进程我们学什么?

学进程里面的属性

OS内核

OS内核需要直接管理驱动软件。

操作系统的管理结构如下

操作系统是一个封闭体,只暴露出一些指定的系统调用接口来供用户使用,这是操作系统为了保护自己。因为操作系统不相信用户。

因为Linux是用C语言写的,所以所谓的接口就是C语言给我们提供函数调用。

比如我们使用cout函数,本质是将数据写到硬件上,因为自己的程序没有资格写到硬件上。因为cout调用的是C++库,也就是用户操作接口,再调用系统调用接口,系统调用接口通过操作系统来管理打印到显示屏上。

操作系统是通过系统调用的方式,对外提供接口服务的。

后面学习的Linux系统编程,本质就是在学习操作系统提供的接口。

因为系统调用的接口对于一些用户来说不会用,所以这时候就在上一层有了shell外壳,C函数库lib,部分指令等,
shell叫做命令行解释器。

还有windows的图形界面,可以让小白使用。

某个语言具有跨平台性,就是因为它的lib库帮你实现了不同平台系统接口的调用。
这个和C++的多态的概念差不多。

三、Linux可以打游戏吗

可以打,但是Linux系统的用户少,一般人都用windows上打游戏。所以说游戏开发商一般不会在Linux发布开发游戏。毕竟不赚钱。

比如华为的鸿蒙操作系统,因为华为有手机作为资本,所以系统出来后,自动有供应商来找鸿蒙来提供各种软件。

四、ps axj显示自己的进程

1.ps axj 可以显示所有进程,这是后期最常用的一种方式。

//可以过滤出来关于mytest关键字的进程

ps axj | grep 'mytest'

因为Linux上的命令都算是进程,所以grep也是一个进程,所以以上命令会显示两个进程,一个是grep的一个是mytest的

加上-v grep后则不显示带有grep的进程
只会显示自己的进程。

ps axj | grep 'mytest' | grep -v grep

在/路径下存在一个proc的文件,里面存放的是进程的实时信息。上面的数字叫做PID,(process id)PID是一个进程的唯一标识符。
pid的意义就是快速找到进程。
在这里插入图片描述

进程的pid会随着进程的关闭和启动,重新分配pid,所以进程的pid会变化的。

五、查看进程的信息

信息中的exe代表进程对应的可执行程序的磁盘文件。

cwd代表的是文件所在的当前路径。
所以说C语言为什么写的文件就在当前路径?

所谓的当前路径就是进程当前所维护的路径。

那么pid和cwd的路径信息都在哪呢?
这些都算是进程的内部属性,内部属性都属于数据,数据存储在进程控制块PCB中。

六、怎么绕过C语言直接调用系统接口?

显示信息列表并显示带有a.out的进程。

ps ajx | head -1 && ps axj | grep 'a.out' | grep -v grep

在这里插入图片描述

获取进程的pid

以下获取pid是系统调用

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>                         
int main()
{
  while(1)
  {
    printf("process  pid :%d\n",getpid());
    sleep(1);
  }
  return 0;
}

假如要杀掉该进程可以按ctrl + c
也可以用命令

kill -9 进程的pid

-9就是发送9信号

七、创建进程的方法

1.把你写的程序运行起来,也就是创建进程

不管程序结束和运行,父进程一直不会改变,因为父进程就是bash。

几乎我们在命令行上所执行的所有指令(ls pwd cd等),都是bash的子进程。

fork()代码创建子进程

fork()函数的功能就是创建一个子进程。

fork给有两个返回值,给父进程返回子进程的pid,给子进程返回0。

这和C语言不同,C语言中不能同时执行if又执行else。

但是fork()函数可以同时运行。因为fork之后,父进程和子进程会共享代码,一般都会执行后续的代码。
所以会打印两次。

因为父子进程的返回值不同,所以可以通过不同的返回值判断,让父子执行不同的代码。

fork如何做到会有不同的返回值?

因为父进程和子进程是一对多的,所以父进程必须有标识子进程的方案,所以fork之后,给父进程返回子进程的pid。

给子进程返回0的原因是因为,来判断子进程是不是创建成功了。

为什么fork会返回两次?

fork有两个返回值,说明曾经被返回了两次。
fork是怎么做到返回两次的?
fork()函数是通过操作系统的system call实现的。
fork()之后,OS做了什么?

进程就是= task_struct+ 进程代码和数据

子进程的task_struct内部的数据基本是从父进程继承下来的。

子进程的代码是和父进程共享代码的。但是数据要各自独立。

虽然fork之后代码共享,但是可以通过不同的返回值执行不同的代码,比如用if,else分流。

如何理解进程被运行?

就是进程在运行队列中被CPU调度。

八、操作系统进程状态原理

以后谈到进程必须先想到进程的task_struct
这是结构体里面包含进程的全部信息。

Linux内核对进程的管理就是管理task_sturct的。

计算机学科的哲学科目——操作系统
所以我们具体事情具体分析,以Linux系统为例来学习Linux系统的进程状态。

运行态

进程只要在运行队列中,就叫做运行态。
每个CPU都要维护一个runqueue。这个运行队列每个元素就是PCB,也就是Linux中的task_struct,可以通过task_struct可以找到代码和数据。因为结构体里包含了指向代码的指针。

运行态不代表正在运行,而是代表可以随时被CPU调度

终止状态

所谓的终止状态也就是这个进程还在,只不过永远不会运行了,随时等待被释放。

为什么不立马释放资源?有没有可能操作系统正在忙着别的事情,所以没空来释放。

终止的意思就是我已经结束了,不能被调用了,随时等待释放。

进程阻塞(重点)

概念进程等待某种资源(非CPU),资源没有就绪的时候,进程需要在该资源的等待队列中进行排队,此时进程的代码并没有运行,进程所处的状态叫做进程阻塞。

在操作系统学科中,经常会听到阻塞状态。
1.一个进程,使用资源的时候,可不仅仅是在申请CPU资源!
2.进程也可能同时在申请其他资源,比如:
磁盘,网卡,(比如渲染)显卡资源。

如何进程申请CPU资源时,无法得到满足。这时候需要排队。这个队列叫做运行队列

那么如果我们申请其他慢设备的资源。比如磁盘。也是需要排队的。
总之,进程申请资源是需要排队的

概念:当进程访问某些资源(磁盘,网卡),该资源如果还没有准备好,或者为其他进程提供服务。此时:操作系统做了以下工作。
1.当前进程要从runqueue中移除
2.将当前进程放入对应设备的描述结构体的等待队列。

此时,我们的进程在外设等待资源时,该进程的代码不会被执行。这时候就叫做进程阻塞

在我们windows界面中,表现出来的状态就是软件卡住了。

通常电脑卡是在打开很多应用的时候会卡。
这时候可以把后台进程关掉一些。

进程挂起(重点)

就是进程处在非运行状态。

假如进程过多,内存不足了怎么办?
这时候操作系统就要帮助用户进行辗转腾挪。

短期内不会被调度(你等的资源短期内不会就绪)的进程,**它的代码和数据依旧在内存中。**这就是白白的浪费空间。这时候操作系统就会把该进程的代码和数据置换到磁盘上。

这样的行为就叫做进程挂起。进程挂起在小白看来,也是卡住了的现象。

九、Linux进程状态

进程后面加上+加号,叫做前台进程。前台进程可以ctrl+c杀掉。而后台进程需要用kill -9 命令。

R:运行状态,只要在运行队列就行。

S(sleeping):浅度睡眠,对应的就是阻塞状态。也就是在等待某种资源。一旦资源就绪就可以转换为R状态。此时也可以杀掉该进程。

D(disk sleep):这个状态也是一种阻塞状态,在Linux中这个是针对磁盘(disk)资源的等待。也叫深度睡眠状态,操作系统无权利杀掉该进程,只能等待该进程结束。
除非关机,或者拔掉电源。

Z(zombie):叫做僵尸状态。当Linux中的进程退出的时候,一般不会直接进入X状态,而是进入Z状态。

进入Z状态的原因是因为: 该进程退出的时候需要将执行结果告知给父进程。就是为了维护退出信息,可以让父进程或者操作系统来读取。

Z状态就是:如果创建了子进程,子进程退出了,父进程不退出,也不等待子进程,子进程退出后的状态就是Z状态。

假如一个进程正在处于僵尸状态,假如没有人回收,则该进程将一直维护!该进程的相关资源(pcb)不会被释放。这就叫做内存泄漏!

X:就是死亡状态,可以随时将资源回收。

T/t(stopped):大写T叫做暂停状态,比如暂停正在下载。 就是常规的暂停,小写t是进程被调试的时候,遇到断点所处的状态。就会呈现小t,也叫做追踪状态。

孤儿进程

孤儿进程是父进程先退出,子进程永远没退出,这时候子进程就变成了孤儿。所以叫做孤儿进程,孤儿进程则由ppid为1的父进程来领养。

父进程的父进程是bash,bash会自动回收父进程。

十、进程优先级

优先级是进程获取资源的先后顺序

为何会存在优先级

优先级就是排队。为什么存在优先级?本质原因是因为资源不够。所以才需要排队。

PRI和NI

NI是nice值,可以调整优先级
PRI越小则优先级越高。

Linux中更改优先级是更改NI,而不是更改PRI。

改变优先级命令如下

sudo top

NI的取值范围为-20到19。【-20,19】
PRI = PRI+NI;

每次调整NI都PRI初始值都是80.

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

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

相关文章

关系数据库-1-[mysql8]中的数据类型

详细介绍MySQL中的数据类型 1 MySQL中的数据类型 常见数据类型的属性&#xff0c;如下&#xff1a; 1.1 整数类型 一、类型介绍 整数类型一共有5种&#xff0c;包括TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和 BIGINT。 二、可选属性 1、M:表示显示宽度 Q&#xff1a;…

【2022】年度总结——彼此当年少 莫负好时光

文章目录【2022】年度总结前言&#x1f388;&#x1f388;&#x1f388;2022的得与失&#x1f9e8;&#x1f9e8;&#x1f9e8;对2023的期望&#x1f4e7;&#x1f4e7;&#x1f4e7;写在最后的话✍&#x1f3fb;✍&#x1f3fb;✍&#x1f3fb;【2022】年度总结 前言&#x1f…

client-go实战之七:准备一个工程管理后续实战的代码

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一&#xff1a;准备工作client-go实战之二:RESTClientclient-go实战之三&#xff1a;Clientsetclient-go实战之四&#xff1a;…

TCP为什么是三次握手和四次挥手以及可能出现的问题

目录TCP为啥设定为三次握手(两个角度分析)不可靠产生无效链接浪费服务器资源TCP为啥四次挥手服务端有剩余数据需要发送--四次挥手(多数情况)服务端无剩余数据发送--捎带应答--四次变三次(少数情况)四次挥手可能出现的问题可能出现大量的TIME_WAIT可能出现大量的CLOSE_WAITTCP为…

关于他人交谈?顺应张莉打破预期

如果你站在权利的优势场,其实你不用可以谋划什么,就可以直接顺利交流.这个时候打破预期,就要对别人更加尊重.例子&#xff1a; 美国前总统克林顿跟每一个在场的人员握手并询问名字。交流中弱势一方的预期是在&#xff0c;希望得到对方尊重&#xff0c;而不是工具人。如果站在劣…

文件没学懂没关系,我来教你快速学会文件

1. 什么是文件 文件通常是在磁盘或固态上的一段已经命名的存储区。C把文件看作是一系列连续的字节&#xff0c;每个字节都被单独读取。 在程序设计中&#xff0c;我们一般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09; 1.…

Spring Boot操作数据库学习之整合MyBatis

文章目录一 MyBatis简介二 配置数据源三 整合测试3.1 导入MyBatis依赖3.2 配置数据库连接信息application.yml3.3 使用idea测试数据库3.4 创建实体类【可以使用Lombok】3.5 创建实体类3.6 创建mapper目录以及对应的Mapper接口3.7 创建Mapper映射文件3.8 配置mybatis映射文件3.9…

第四十四章 动态规划——背包问题模型(一)

第四十四章 动态规划——背包问题模型&#xff08;一&#xff09;一、模型概述二、模型变形1、AcWing 423. 采药&#xff08;1&#xff09;问题&#xff08;2&#xff09;分析&#xff08;3&#xff09;代码2、AcWing 1024. 装箱问题&#xff08;1&#xff09;问题&#xff08;…

ESP8266 ArduinoIDE 物联网web客户端开发

一、使用 esp8266 实现 HTTP 客户端协议 在 arduinoIDE 中&#xff0c;并没有专门的 HTTP 协议客户端库。但是我们可以用 TCP 协议来自动手动实现。 1.1 HTTP 请求报文简介 所谓请求报文&#xff0c;即是基于 TCP/IP 协议发送的一串规范字符&#xff0c;这串规范字符描述了当…

liunx centos9安装nodejs并搭建vue 图文详解手把手教程

首先nodjs的官网找到liunx的安装包 https://nodejs.org/en/download/ 这里不推荐用源码安装&#xff0c;因为实在太慢&#xff0c;我安装时一下在不停安装连续15分钟都还在跑就是不知道什么原因 解压包 tar -xvf /root/node-v18.13.0-linux-x64.tar.xz设置全局 -s后面地址就是…

Android入门第59天-进入MVVM

什么是MVVM用“某大文豪亲”的话说&#xff1a;MVVM并不存在&#xff0c;只是xml里找控件找了太多了&#xff0c;自然而然就“找”出了一套共性。所以&#xff0c;MVVM只是包括了以下这些技术&#xff1a;DataBind&#xff1b;ViewModel双向绑定&#xff1b;Okhttp3retrofitrxj…

图解函数递归、数组详解

目录 一.修炼必备 二.图解递归的执行过程 三.数组 3.1 一维数组 3.2 二维数组 3.3 数组的共同问题 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 2.趁手武…

视频文缩略图SDK:GleamTech VideoUltimate Crack

Video Reader and Thumbnailer for .NET Core 和 .网络框架 读取地球上的任何视频文件格式。逐帧读取视频文件。生成有意义的缩略图。 VideoUltimate是最快&#xff0c;最简单的.NET视频阅读器和缩略图器&#xff0c;可以读取任何视频文件格式 在地球上。它允许您逐帧读取视频…

C++ 一文解决 数据库ODB 安装/调试/使用的问题

引用&#xff1a; ODB Download (codesynthesis.com) Installing ODB on Linux/UNIX (codesynthesis.com) 缘起&#xff1a; 在开发过程中发现&#xff0c;现有的软件缺乏持久层&#xff08;Persistence Layer&#xff09;&#xff0c;即专注于实现数据持久化应用领域的某个…

广义零样本学习的转移增量

摘要&#xff1a;零样本学习&#xff08;ZSL&#xff09;是一种成功的从未知类中对对象进行分类的范例。然而&#xff0c;它在广义零样本学习&#xff08;GZSL&#xff09;设置中遭受严重的性能降级&#xff0c;即以识别来自可见类和不可见类的测试图像。在本文中&#xff0c;为…

C语言-qsort函数基本使用

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 先来看一下qsort函数的介绍&#xff1a; Compare 函数的返回值描述>0elem1将被排在elem2前面0elem1等于elem2<0elem1 将被…

LeetCode刷题模版:171-174、179

目录 简介171. Excel 表列序号172. 阶乘后的零173. 二叉搜索树迭代器174. 地下城游戏【未理解】179. 最大数结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,…

Redis学习【1】之Nosql概述

文章目录一 从技术发展探究使用Nosql的原因1.1 单机Mysql时代1.2 Memcached&#xff08;缓存&#xff09; MySQL 垂直拆分[读写分离]1.3 MySQL主从读写分离1.4 分表分库 水平拆分 Mysql 集群1.5 如今时代1.6 使用NoSQL的原因二 Nosql初识2.1 NoSQL的特点【解耦】三 NoSQL的四…

树状数组的原理和区间和

目录 一、前言 二、树状数组的原理 1、杂论 2、从二叉树到树状数组 3、神奇的 lowbit(x) 操作 4、tree[ ]数组&#xff1a;将一维信息转换为树形信息存储 5、基于 tree[ ] 的计算 6、tree[]的更新&#xff08;要加lowbit&#xff09; 三、树状数组的应用 1、单点修改…

流媒体方案之Nginx

1.Nginx可以作为流体服务器。2三种web服务器的比较3.推流端: FFmpeg使用RTMP协议向Nginx推流拉流端: •VLC播放器使用RTMP或HTTPFLV协议从Nginx拉流•浏览器使用HTTPFLV协议从Nginx拉流(安装flv.js)4.有两种方法&#xff1a;下载源码&#xff0c;手工编译使用Buildroot&#xf…