欢迎各位大佬光临本文章!!!

还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。

本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬、帅哥、美女点点支持,您的每一分关心都是我坚持的动力。

我的博客地址:bingbing~bang的博客_CSDN博客https://blog.csdn.net/bingbing_bang?type=blog

我的gitee:冰冰棒 (bingbingsupercool) - Gitee.comhttps://gitee.com/bingbingsurercool


系列文章推荐

冰冰学习笔记:《string类的模拟实现》

冰冰学习笔记:《gcc,gdb等工具的使用》


目录

系列文章推荐

目录

前言

1.冯诺依曼体系结构

2.操作系统

3.进程

3.1描述进程

3.2查看进程

3.3创建进程

3.4进程状态

3.5孤儿进程

3.6进程优先级

其他概念:

总结


前言

计算机行业重来不只是学懂软件就可以,我们不仅要对软件开发具备一定的理解,同时我们还需要了解计算机的硬件部分,做到软硬结合。那么计算机的组成是什么样的?结构是什么?又如何管理这些硬件呢?

1.冯诺依曼体系结构

冯诺依曼体系结构是目前大多数计算机中都遵循的体系结构。冯诺依曼体系结构由输入设备,存储器,输出设备,CPU构成。其中存储器指的是系统的内存,并非磁盘,而输入设备则是键盘,摄像头,磁盘,网卡等设备,输出设备则有显示屏,音响,磁盘,网卡等设备。CPU由两部分组成,运算器与控制器,运算器进行算术运算,逻辑运算;控制器进行协调外部就绪事件。

那么为什么冯诺依曼体系结构是这种形式的呢?原因很简单,计算机中的CPU要想处理数据就需要从内存中加载数据,然而CPU的运行速度非常的快,是远大于内存的运行速度的,然而内存中的数据又需要从输入设备中进行读取,例如磁盘中存储的数据,磁盘的速度又远小于内存的速度,如果一级一级的加载上来会浪费资源和时间,因此当需要使用CPU时,需要提前将数据加载到内存中,CPU从内存中加载数据将提高效率。因此内存实际上充当了一个CPU与外界环境接触的媒介工具,CPU不会直接与外界设备进行接触。

因此当我们通过聊天工具向好友发送信息时,一定是先通过我们自己的输入设备接受信息然后加载到自己的内存中共CPU进行处理,再通过内存到达输出设备,然后通过网络连接到达好友的输入设备,经过内存、CPU的处理最终到好友计算机的输出设备中。而这种传输路径就是通过冯诺依曼体系结构决定的。

2.操作系统

操作系统是任何计算机系统都包含的一个基本的程序集合,其实就是一款管理资源的软件。操作系统之所以存在是为了让我们能够更方便的与计算机的硬件进行交互,并且给用户提供一个稳定,简单的执行环境。

计算机是如何管理硬件的呢?简单来说操作系统就是管理者,硬件就是被管理者。被管理者会生成各种数据,管理者并不会直接与被管理者进行交互,而是通过他们的数据形成对硬件的描述,然后通过各种管理数据的方式对其进行统一的管理。

为了保障操作系统的安全,操作系统不会直接开放给用户操作,而是使用系统接口来提供调用服务。其中shell外壳,第三方库充当引导操作者更加方便的使用接口的角色。

简单来说就是六个字:先描述,在组织。

3.进程

我们在启动一个软件时,本质就是启动了一个进程,例如我们在Linux系统中./XXX时,就是在系统层面创建了一个进程。Linux可以同时加载多个程序,因此Linux可以同时存在大量的进程。那操作系统是怎么管理进程的呢?当然是先把进程描述起来,然后再将进程组织起来。

3.1描述进程

进程是怎么描述的呢?我们知道人类是通过属性来认识世界的,操作系统也是通过属性来认识进程的。在操作系统中,进程中的所有属性被存储在PCB(Process Control Block)中,其实PCB就是一个结构体,里面的数据用来将一个进程描述清楚。在Linux系统中,用来描述进程的结构体是task_struct。所以当一个程序加载到系统中形成一个进程,其应该包含两部分一个是程序对应的代码和数据,另一个就是进程对应的PCB结构体。当进程被描述完后,系统管理进程就变为对PCB这一系列的结构体进行管理,管理结构体就需要使用数据结构来进行各种增删查改的操作,从而达到管理进程的目的。

那PCB是怎么描述进程的呢?以Linux系统中task_struct为例,其包含以下信息。

标示符:                描述本进程的唯一标示符,用来区别其他进程,进程PID。

状态:                   任务状态,退出代码,退出信号等。

优先级:                相对于其他进程的优先级。

程序计数器:         程序中即将被执行的下一条指令的地址。

内存指针:           包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据:         进程执行时处理器的寄存器中的数据。

I/O状态信息:     包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

记账信息:            可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

其他信息

3.2查看进程

进程在系统中运行时我们如何查看进程呢?

查看进程有下列几个命令:

ps axj | grep 'myfilebin'  :查看可进程myfilebin

top : 显示进程,类似于windows下的任务管理器,按q退出

ls /proc :查看进程文件夹信息,每个数值都代表一个进程ID

ls /proc/5314 -d :查看进程5314的文件信息

还可以使用head命令显示进程头部信息:

 ps axj | head -1 && ps axj | grep 'myfilebin'  

这里面就包含了进程的PID以及父进程的PPID,每个进程都有唯一的ID值,在系统中这个唯一的ID值就表示一个进程,当ID值不存在时,进程也就不存在了。

我们也可以用代码来查看进程ID:

头文件:#include<sys/types.h>或者<unistd.h>

getpid():获取当前进程ID。

getppid():获取当前进程的父ID。

我们还可以使用命令杀死进程,由于每个进程存在唯一的PID,所以可以利用PID将进程终止。

kill -9  5314 :将进程5314终止。

3.3创建进程

如果我们自己想在程序中创建子进程,可以使用fork函数进行创建。

pid_t  fork() :创建子进程,创建成功将给父进程返回子进程的PID,给子进程返回0。创建失败返回-1。fork之后代码是父子进程共享的。

也就是说fork函数将会返回两个值,我们可以根据fork函数的不同返回值执行不同的代码逻辑,可是我们之前从来没有说过一个函数会有两个不同的返回值,那么fork能做到吗?我们可以使用下面的代码进行验证。

#include<stdio.h>
#include<unistd.h>
int main()
{pid_t id=fork();if(id<0){perror("fork");return 1;}else if(id==0){int i=3;while(i--){printf("i am a child pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);//子进程执行3次后退出}exit(-1);}else{while(1){printf("i am a parent pid:%d,ppid:%d\n",getpid(),getppid());sleep(1);}}return 0;
}

输入脚本命令进行监控:

while :; do ps axj | head -1 && ps axj | grep mybin | grep -v grep; sleep 1; echo "############################################"; done

监控结果如下图所示:

两个逻辑中的代码都会被执行,确实创建了一个新进程。

之所以要给父进程返回子进程的PID,是因为一个父进程可以有多个子进程,父进程需要对子进程进行管理,因此父进程需要获得子进程的PID。

那么fork是如何做到具备两个返回值的呢?原因在于fork函数内部在创建完进程后,两个进程都会执行fork函数的return返回语句,两个进程返回的值不同,因此fork函数会返回两次不同的值。

但是fork函数虽然返回两次,可是id只有一个呀?id怎么能存两个值呢?原因在于父进程子进程都具备id值,当fork返回id值时发生写时拷贝,父进程子进程的虚拟地址虽然一样,但是物理地址并不一样,id虽然只有一个,实际上底层有两个不同的地址来存放id值,存有两个不同的返回值。

3.4进程状态

进程具备各种状态,一般具备以下几种:

(1)新建状态:字面意思,一个进程创建时的状态。

(2)运行状态:task_struct结构体在运行队列中排队时,就叫做运行状态,不一定在CPU上运行。

(3)阻塞状态:等待非CPU资源就绪的状态。

(4)挂起状态:当内存不足的时候,os通过适当的置换进程的代码和数据到磁盘中,此时进程的状态叫做挂起状态。

Linux系统中同样具备各种进程状态,并有不同的状态标识符。

(1)R :对应运行状态,带有+号表示为前台进程,运行指令后面加&设为后台进程,ctrl+c无法终止该程序。

(2)S :可中断睡眠状态,对应阻塞状态,可以被新系统唤醒。

(3)D :磁盘睡眠状态,深度睡眠,不可被中断,不可以被被动唤醒 。

当服务器压力过大时,OS会通过一定的手段杀掉一些进程,来节省空间,D状态下系统不会将其杀死。

(4)T :暂停状态,可使用kill -19 +进程ID暂停程序,使用kill -18 +ID继续程序,一般在调试时使用。

(5)X :终止状态,瞬时性非常强

(6)Z :僵尸状态,一个进程已经退出,但是还不被允许释放,处于一个被检测的状态,此时就成为僵尸状态。一般是父进程或者OS维持该状态,目的是为了让父进程或者OS来回收。僵尸状态下,资源没有被彻底释放,PCB会一直维护,僵尸进程会以终止状态保持在进程列表中,并且会一直等待父进程读取退出状态码。僵尸进程会产生内存泄漏的危害。

3.5孤儿进程

当一个进程的父进程退出,自己还在时,该进程就叫做孤儿进程。孤儿进程会被1号进程领养,1号进程就是系统本身。


          之所以要被领养,是为了方便回收资源。

3.6进程优先级

为什么要有优先级:

因为CPU资源是有限的,进程太多,需要通过某种方式竞争资源,竞争的依据就是优先级。

在Linux系统中优先级由两部分组成,一个进程的优先级等于原有的优先级加nice值。优先级越小,越快执行,因此我们可以通过更改nice值来改变优先级。

优先级改动是有范围的,nice值的范围是-20到19之间,一共40个等级。

优先级的修改方式:

top  -> 按r -> 输入进程ID -> 输入修改的nice值

例如:将优先级的值增大,需要将nice值增大。

注意:每次设置优先级都会从开始时的优先级的值进行变化。

其他概念:

竞争性:

系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

独立性:

多进程运行,需要独享各种资源,多进程运行期间互不干扰

并行:

多个进程在多个CPU下分别,同时进行运行,这称之为并行

并发:

  多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

时间片:每个进程在CPU上运行的时间。

大多数计算机都是采用并发的模式进行运行,因此进程都有自己运行的时间片,如果进程A正在被执行,CPU内的寄存器里面一定保存的是进程A的临时数据,此时称为A进程的上下文数据。当进程A暂时被切换时,进程A将带走自己的上下文数据,以便下次回来时可以恢复回去。

总结

进程的介绍到这里并没有结束,这只是冰山一角,我们只是初识进程的一些相关概念,进程的后续内容还会在其他文章中更新。

冰冰学习笔记:进程概念相关推荐

  1. 冰冰学习笔记:进程控制

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  2. 冰冰学习笔记:基础IO

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  3. 冰冰学习笔记:内存地址空间

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  4. 冰冰学习笔记:多线程

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  5. 冰冰学习笔记:智能指针

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  6. 冰冰学习笔记:类与对象(下)

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  7. 冰冰学习笔记:vim工具的基本操作

            欢迎各位大佬光临本文章!!!         还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正.         本系列文章为冰冰学习编程的学习笔记, ...

  8. 冰冰学习笔记:异常处理

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

  9. 冰冰学习笔记:linux的文件系统

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

最新文章

  1. 【Android 安全】DEX 加密 ( Application 替换 | 获取 ContextImpl、ActivityThread、LoadedApk 类型对象 )
  2. python elif 用法_Python入门高级教程--Python 条件语句
  3. c++中结构体套结构体用 = {0}初始化编译报错解决办法(用memset或者={})(error: invalid conversion)
  4. net4.0 兼容2.0的方法
  5. 北师大本科毕业需要过计算机二级吗,全国计算机二级
  6. BZOJ 1604 [Usaco2008 Open]Cow Neighborhoods 奶牛的邻居:队列 + multiset + 并查集【曼哈顿距离变形】...
  7. 安装OpenCL和AMD驱动程序
  8. idea 修改html 不重启,解决idea spring boot 修改html等不重启即时生效的问题
  9. 牛逼!这么问 OutOfMemoryError 能让我懵逼!
  10. python各个模块
  11. Object.HashCode()——居然是Java Native方法
  12. 三茗硬盘保护系统安装Linux,重装windows系统而不影响linux引导的方法
  13. php公众号开发 点菜,微信公众号点餐系统怎么弄 微信点餐系统怎么开发
  14. Chart控件,chart、Series、ChartArea曲线图绘制的重要属性介绍(Windows窗体)
  15. 面试官常问的web前端问题大全(10道面试真题祝你旗开得胜)
  16. 华为照片在哪个文件夹_华为手机相册照片在哪个文件夹(这2个方法帮你轻松找到)...
  17. 海洋cms常见问题有哪些?
  18. 一个img文件-实验吧
  19. gds文件 导出_GaussDB 200使用GDS服务导入导出数据
  20. 超级简单的 RocketMQ 流量削峰实战

热门文章

  1. Smalltalk的辉煌时代
  2. 如何学好编程?黄金四步走
  3. oss取视频封面 以及图片缩略图
  4. Mysql数据库迁移|如何把一台服务器的mysql数据库迁移到另一台服务器上的myql中
  5. 【自动控制原理】线性系统的根轨迹法
  6. 在鼠标右键上加入使用notepad++打开编辑
  7. 360 度评估中如何评价他人
  8. c语言对10万位进行显示,C语言位运算
  9. 2023年网络爬虫实训(第二天)
  10. Spring Cache的基本使用