Linux进程概念

冯诺伊曼体系结构

在这里插入图片描述

冯诺依曼体系结构大家一定不陌生,这里提两点:
1.运算器中包含了算数运算和逻辑运算两种运算
2.控制器:CPU响应外部事件,协调外部就绪事件(比如拷贝数据到内存)

  • CPU读取数据(数据+代码),都是从内存中读取。站在数据的角度,认为CPU不和外设交互。
  • CPU要处理数据,需要先将数据从外设加载到内存中,站在数据的角度,认为外设之和内存直接交互
    程序要运行需要先加载到内存中,这是由体系结构的特点决定的。
    想要了解权限,就需要先了解操作系统,但是操作系统是一个很复杂的东西,短短的一篇博客远远说不清楚,先初步了解一下吧

操作系统

在这里插入图片描述
任何一个计算机都包含一个基本的程序集合,称为操作系统,操作系统包括:

  • 内核(内存管理,进程管理,文件管理,驱动管理)
  • 其他程序(函数库,shell程序)
    操作系统可以提供给用户一个安全,简单,稳定的执行环境。
    操作系统如何对硬件进行管理呢?
    操作系统对硬件的管理是先描述,再组织。其实对硬件的管理本质上就是对数据的一种管理,首先要对数据进行分类和整合,使数据形成一个个对象可以进行管理,再通过数据结构和算法就可以对操作系统有一个很好的管理。

当然操作系统是极为复杂的,这里只是粗略地介绍一下

进程

在WIndows下启动一个软件,本质就是启动了一个进程
在Linux下输入一个指令,运行一条命令,本质上就是在系统层面创建了一个进程

在我们电脑的任务管理器中可以发现有很多的进程,那么这么多的进程操作系统是如何管理的呢?

猜对了吗?也是先描述再组织,那么描述成一个什么样的数据了呢?这里就要提到PCB了

描述进程-PCB

PCB包含了所有进程内的所有属性,所以对进程的管理就变成了对进程PCB结构体链表的增删查改

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
  • 在Linux下的进程控制块叫task_structtask_struct是Linux内核的一种数据结构,它被装载在内存中并包含着进程的信息。

task_struct中包含有许多的内容,包括进程的状态,优先级,程序计数器…
在这里插入图片描述
操作系统和CPU运行某个进程,本质是从task_struct形成的队列中挑选一个task_struct,在结构体中有一个内存指针,内存指针包括了程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针,图中就是结构体中的指针指向对应程序的代码和数据。

ps指令可以查看系统的进程的相关信息

kill-9 pid ——杀掉pid对应的进程,这里涉及到信号,之后的博客中会提及信号相关的知识。

fork&pid&ppid

fork是一个函数,函数可以创建一个子进程,目前我们只讨论fork的返回值以及一些基本的使用,实际上fork中涉及到了很多操作系统的知识。

pid是当前进程的进程号,ppid是一个进程的父进程的进程号,而这个两个进程号分别可以通过getpid和getppid两个函数来获取。
在这里插入图片描述
在这里插入图片描述
综合程序以及最终打印的结果,可以发现fork返回值有两个,一个返回0(这个进程就是子进程),一个返回子进程的pid,所以我们就认识了一个拥有两个返回值的函数。

怎么会有有两个返回值的函数呢?其实在fork之后,就创建了一个新的进程,新的子进程的task_struct继承了很多父进程的东西,所以fork之后的代码也会被父进程和子进程共享。
在这里插入图片描述

进程状态

操作系统进程的状态:

  • 新建:新建一个进程
  • 运行:task_struct结构体在运行对列中排队,所处的状态就是运行态,运行态的进程就是在等待CPU资源
  • 阻塞:等待非CPU资源的状态就是阻塞,因为在系统中有各种的资源,包括网卡,显卡,硬盘…所以进程有可能会等待其他的外设,那么它所处的状态就是阻塞。
  • 挂起:当内存快要别占用满的时候,操作系统会讲一些不经常使用的进程的代码和数据放到磁盘上一个叫SWAP的文件中,但是进程的PCB仍然在内存中,这样的状态就被称为挂起,所以有的时候我们发现自己的硬盘并不是所有的空间都可以被读写的,有一部分留给了SWAP。挂起本质上也是一种阻塞状态

Linux的进程状态:

  • R状态:运行状态
    在这里插入图片描述

细心的话就会发现这里的R+带了一个+,这个加号意味着这是一个前台进程,前台进程表示进程一旦启动,那么执行命令就没什么效果了,只能通过ctrl+c终止掉程序,前台进程本质上就是占用了bash对话框

  • S状态:睡眠状态
    意味着进程正在等待事件完成(这是一种可中断睡眠),比如scanf()函数等待用户从键盘输入的过程就是等待状态
  • D状态:睡眠状态,磁盘睡眠,不可以被终端,不可以被被动唤醒
    在这里插入图片描述
    这里有一篇很好的博客来讲述这两个进程:
    LInux进程D状态详解
  • T状态:暂停

暂停和休眠的本质区别就是有没有等待某种资源,没有等待就是暂停,有等待就是休眠
T状态的应用就是调试

  • X状态:终止状态 具有非常强的瞬时性,在程序结束的瞬间状态就变为了X状态
  • Z状态:僵尸状态
    在这里插入图片描述
    一般情况下,当父进程创建子进程之后,子进程退出,但是父进程什么也不做,就会导致子进程成为一个僵尸状态的进程。

僵尸状态进程会以终止状态保存在进程表中,并且会一直等待父进程读取退出状态码。

僵尸进程的危害

  1. 进程的退出状态必须被维持下去,它要告诉关系它的进程,如果父进程一直不读取,那么子进程就处于Z状态
  2. 维护退出状态本身就是要用数据维护,也属于进程的基本信息,所以保存在PCB中,Z状态一直不退出,PCB就一直要维护
  3. 僵尸进程不回收,就会导致内存泄漏的问题

孤儿进程
父进程如果提前退出,子进程就成为孤儿进程。
孤儿进程会被领养,当然操作系统不会允许一个没有任何进程管理的子进程存在,所以1号进程会对孤儿进程进行领养,目的是为了方便之后对这个进程进行回收。

进程优先级

首先知道,优先级是CPU资源调度的优先权,配置进程优先权对多任务环境的Linux很有用,可以改善系统性能。优先级是PCB中的一个重要字段,这就意味着我们是可以用一些数据表明优先级的。
Linux下具体的优先级做法:

优先级=老的优先级+nice值
在这里插入图片描述
在使用ps指令查看优先级的时候,PRI所代表的就是优先级,其值越小越容易被调度,NI值的意思就是nice值,其表示进程可被执行的优先级的修正值,所以在Linux下调整优先级就是调整进程的nice值,nice值的取值范围是-20——19,一共40个级别。
在这里插入图片描述
每次设置优先级都要从进程最开始的优先级开始设置(也就是从80开始),如果不是root用户,优先级每次只能往大调不能往小调。

进程的特性
在这里插入图片描述

这就是进程的基本概念了,大家学习愉快,早日拿到心仪的offer!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Feng,

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值