【Linux】---认识进程

news2024/10/6 20:30:33

文章目录

  • 进程的概念
    • 1、什么是进程
    • 2、PCB
    • 3、查看进程
    • 4、初始fork()创建进程
    • 5、kill杀死进程
  • 进程的状态
    • 普适的操作系统下的状态
      • 运行
      • 阻塞
      • 挂起
    • Linux下的状态理解
      • R--运行状态
      • S--睡眠状态
      • D--深度睡眠状态
      • T--暂停状态
      • t--追踪暂停状态
      • X--死亡状态
      • Z--僵尸状态
    • 孤儿进程
  • 进程优先级
  • 进程的其他概念
  • 进程的切换

进程的概念

1、什么是进程

进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。由于CPU不会直接和硬盘打交道,但程序是存储在硬盘上的,所以需要将程序先加载到内存中,再由CPU去调度,加载到内存中的程序就可以称为进程。在将程序加载到内存时,需要对程序进行管理,则就有了进程控制块-PCB的概念

2、PCB

进程控制块PCB:操作系统中用于描述进程的工具,其中包含的是进程属性的集合;Linux操作系统下的PCB是 task_struct的结构体。也就是说,CPU在调度时并不是直接去调度加载到内存中的程序,而是操作系统会把程序用一块新的空间利用PCB的结构将程序的属性等封装起来,CPU直接访问的是该程序对应的PCB结构体。

在这里插入图片描述

内存会将所有进程组织起来管理,也就是会将所有运行起来的进程都已task_struct链表的形式存起来,CPU就可以找到并且遵守队列的先进先出的性质

3、查看进程

当程序运行起来我们就可以去查看对应的进行了

ls /proc
ls /proc/(对应的进程id)

可以通过上面两条指令去查看,第一条是查看当前所有的进程

在这里插入图片描述

这些数字就是进程对应的id,同样的我们可以通过指定的id去查看对应的进程

除了这个,当我们自己写好了程序运行起来时,我们也可以去获取我们自定义的程序的属性

ps axj | grep 进程名

在这里插入图片描述

现在我编写了一个死循环的程序,让其一直运行,然后我再查看这个进程,就可以查看到其属性了

4、初始fork()创建进程

fork可以用来创建一个新的进程,**其会有两个返回值,如果其返回值为0则创建的进程为子进程,大于0则为父进程。**则可以通过if分流查看其创建情况

这时又可以用到两个函数,一个为getpid用来获取当前进程的id值,另一个getppid用来获取当前进程的父进程的id值。

在这里插入图片描述

在这里插入图片描述

可以看到运行之后,创建出来的子进程对应的父进程就是创建出来的父进程。

5、kill杀死进程

像现在我们自定义的这些普通的进程都是可以直接[CTRL C]去结束进程的,当然我们也可以使用kill命令去杀死进程。

kill -9 进程id

在这里插入图片描述

可以看到kill命令还有很多种操作,不止是-9一种,需要用到的时候变化一下即可

进程的状态

普适的操作系统下的状态

不同的操作系统可能状态的名称不一样或者也会有不一样的状态,当从普适的操作系统进程状态来讲会有以下几种状态:运行,阻塞,挂起,新建,就绪,等待,挂机,死亡。

其中 运行,阻塞,挂起比较难理解

运行

操作系统为了更好更合理的去分配CPU和各种硬件资源,为了更好的调度,所以会为CPU创建一个进程队列。当某一个进程进入了CPU的运行队列时,就可以说其已经是运行状态了,而并非等其真正运行起来才算是运行状态

阻塞

由于每一个硬件设备一次也只能执行一个进程,所以当需要访问硬件的进程和不需要访问硬件都全部在CPU的运行队列中时,可以理解为忙不过来,那这个时候操作系统就会将需要访问硬件的进程的PCB剥离出来,将该PCB放在硬件的等待队列中去等待。

那么这种等待的状态就是阻塞,其本质就是将该进程从CPU的运行队列中剥离出来,等待该进程获取到硬件资源时再将该进程调回CPU的运行队列

挂起

当一个进程在阻塞状态时,其代码和数据仍然会在内存中,那这个时候如果阻塞的进程过多时内存的空间就太浪费了,所以此时操作系统就会将阻塞的进程的代码和数据拷贝一份到硬盘中,然后释放掉内存中的那部分空间,从而减轻内存的空间压力。这种状态下的进程就叫做挂起状态。注意挂起进程并不会释放进程,进程对应的代码和数据仍然有备份在硬盘中

Linux下的状态理解

先来看看Linux内核中对状态的定义

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R–运行状态

当一个进程进入了运行队列时,其就是运行状态了,我们可以查看进程的属性

ps axj | head -1 && ps axj | grep 进程名

在这里插入图片描述

可以看到此时进程的状态显示R+也就是运行状态

S–睡眠状态

这个睡眠状态和阻塞状态是一样的,也就是需要等待某种硬件资源时,在硬件的等待队列中等待的时候

在这里插入图片描述

可以看到此时的进程是属于S+状态的,那么为什么会这样呢。因为printf函数需要等待显示器硬件的资源,CPU的运行速度比硬件的速度快太多了,所以99%的时间进程都是在等待的状态,因此我们大部分都只会看到进程是在睡眠等待的状态

D–深度睡眠状态

如果当前的进程太多了,挂起也解决不了内存空间饱满的时候,操作系统就会自动的杀掉某一些进程,但是这里就会出现一些问题。因为操作系统杀死进程是不会根据用户意愿的,所以难免就会杀死一些比较重要的进程,当进程被杀死后就不可以恢复了。

那为了应对这种情况,Linux就设定了深度睡眠状态,处于深度睡眠状态的进程,是不可以被用户和操作系统杀掉的,只能通过自己醒来或者断电的操作才可以杀掉

深度睡眠一般只会出现在高IO的情况下

T–暂停状态

根据kill命令的选项 我们可以通过**-19来使得进程变为T状态,通过-18**让进程恢复运行状态

在这里插入图片描述

当我们让该进程暂停后恢复,可以发现进程此时的状态是R而不是**R+**了,这里要注意:当进程状态有+号时代表着此时进程时在前台运行的,我们可以利用CTRL C去杀死进程也可以通过kill;但是当进程状态没有+号时代表着后台运行,此时只能通过kill杀死进程

t–追踪暂停状态

追踪暂停状态是一种特殊的暂停状态,进程处于此状态表示该进程正在被追踪,比如调试进程时

在这里插入图片描述

X–死亡状态

死亡状态代表着一个进程结束运行

Z–僵尸状态

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不取,那子进程就一直处于僵尸状态了。现在我们来实验一下,将父进程的子进程杀掉

在这里插入图片描述

像这种情况,父进程没有回收子进程的数据,就会出现僵尸状态。

注意僵尸状态会导致内存泄漏,所以我们要避免僵尸进程的出现

孤儿进程

孤儿进程是指父进程提前退出后,子进程被操作系统领养的一种情况,被操作系统领养的进程就被称为孤儿进程

在这里插入图片描述

以上的情况就是孤儿进程,将子进程的父进程杀掉后,子进程就会直接被id为1的进程领养,也就是操作系统。

进程优先级

像我们的现实生活一样,我们去排队打饭的情况也是一个具有优先级的情况,先来的人优先级就比后来的人优先级高,所以先来的人先打饭。进程也是一样,优先级高的进程先执行。

Linux 中优先级通过两个变量 PRI和 NI来表示,每个进程默认的 PRI 都是 80,NI 都是 0,如果我们先修改某个进程的优先级,我们修改的是NI值,也就是说进程的优先级等于PRI + NI。但是需要注意,不管NI多大,进程的优先级始终在**[99,60]**这个区间内

在这里插入图片描述

如果想要修改优先级,首先top指令(可能需要sudo提高权限)------输入r-------输入需要修改的进程id--------输入想要修改的NI值

在这里插入图片描述

进程的其他概念

  1. 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  2. 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  3. 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  4. 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

进程的切换

一般如果一个计算机只有一个CUP时,不可能会是等待一个进程执行完再执行下一个进程的,那如果是这样我们平常使用电脑就毫无体验感了。所以进程是需要切换的,每一个进程在CPU执行时都会有一个属于自己的时间片,过了这个时间片CPU就会切换进程执行。

CPU本身会有一套的寄存器硬件,每当CPU切换进程时,需要对进程的数据进行上下文保护和上下文恢复,所以当进程被切换时其数据就会被寄存器保护起来,等下次再执行时寄存器又会把数据恢复。要注意寄存器是被所有进程共享的,所以寄存器中的数据只属于该进程,上下文保护时保护的是寄存器里面的数据而不是寄存器

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

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

相关文章

先广度后深度,打开编程视野

古人云 “读万卷书,行万里路。” 书籍是人类进步的阶梯、培养阅读习惯,当一个人爱上读书的时候,眼睛都是发光的。 在小编看来,学习理念是【先广度后深度】,先把Java知识体系的东西都了解到,工作上先会用&…

【数据结构与算法】之动态规划经典问题

前言 本文为 【数据结构与算法】动态规划 经典问题相关介绍 ,具体将对最长递增子序列问题,找零钱问题,0-1背包问题相关动态规划算法问题进行详尽介绍~ 📌博主主页:小新要变强 的主页 👉Java全栈学习路线可…

【LeetCode】No.91. Decode Ways -- Java Version

题目链接:https://leetcode.com/problems/decode-ways/ 1. 题目介绍(Decode Ways) A message containing letters from A-Z can be encoded into numbers using the following mapping: 【Translate】: 包含从A到z的字母的消息可…

C++之继承详解(万字讲解)

这里是目录呀前言一、继承的概念及定义1.继承的概念2.继承定义(1)定义格式(2)继承关系和访问限定符(3)继承基类成员访问方式的变化二、继承中的作用域三、基类和派生类对象赋值转换四、派生类的默认成员函数五、继承与友元六、继承与静态成员七.复杂的菱形继承及菱形虚拟继承1.…

暗猝灭剂BHQ-2 氨基,BHQ-2 amine,CAS:1241962-11-7

产品描述 1、名称 英文:BHQ-2 amine 中文:BHQ-2 氨基 2、CAS编号:1241962-11-7 3、所属分类:Other dyes 4、分子量:477.53 5、分子式:C24H27N7O4 6、质量控制:95% 7、储存: …

爱心html制作并部署github

手机也可以观看 效果预览地址 1.网页效果 心形优化 2.网页源码 源码地址 可以改变不同的图片&#xff0c;作者已经改为全局变量 <!DOCTYPE html> <html><head><title></title><script src"js/jquery-1.7.2.js"></script…

高并发,你真的理解透彻了吗?高并发核心编程手册荣登Github榜首

高并发&#xff0c;几乎是每个程序员都想拥有的经验。原因很简单&#xff1a;随着流量变大&#xff0c;会遇到各种各样的技术问题&#xff0c;比如接口响应超时、CPU load升高、GC频繁、死锁、大数据量存储等等&#xff0c;这些问题能推动我们在技术深度上不断精进。 在过往的面…

Spring Cloud Ablibaba 学习系列文章

前言&#xff1a; 最近发现Spring Cloud的应用越来越多了&#xff0c;微服务的概念在一般的互联网公司上面几乎都会使用到&#xff0c;于是准备一套Spring Cloud Alibaba的学习文章&#xff0c;文章写到一定阶段&#xff0c;会进行实战篇&#xff0c;比如搭建注册通信的框架&a…

C. Crossword Validation(字典树)

Problem - C - Codeforces 题意: 你得到了一个在NN网格上完成的填字游戏。每个单元格要么是填有字母的白色单元格&#xff0c;要么是黑色单元格。你还会得到一本包含M个不同单词的字典&#xff0c;其中每个单词都有一个与之相关的分数。网格中的一个横向候选词是在网格的同一行…

Android TCPIP常见问题

book: Understanding Linux Network Internals socket读写错误返回值&#xff1a;errno TCP: Robert Elliot Kahn IP: Robert Elliot Kahn, Vint Cerf 1 RFC规范 RFC793&#xff1a;TCP RFC768&#xff1a;UDP RFC791&#xff1a;IP RFC826&#xff1a;ARP RFC792&#xff1a;I…

请求转发与请求重定向的区别

目录 1.实现 2.具体区别 1.有关实现 请求转发与重定向分别对应forward 和 redirect两个关键字&#xff0c;接下来我们在Java中尝试去实现一下。 1.1 请求转发 我们一般使用两种方式实现&#xff0c;具体代码见下&#xff1a; RequestMapping("/fw")public Strin…

【C】语言文件操作(一)

&#x1f648;个人主页&#xff1a; 阿伟t &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;越忙&#xff0c;越要沉住气&#xff01; 本章重点 : 为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和…

Netty之I/O模型

UNIX提供的5种IO模型&#xff1a; 阻塞模型 阻塞IO模型&#xff1a; IO复用模型&#xff1a; 信号驱动IO模型&#xff1a; 对于五种IO模型我这里用自己的白话再复述一遍&#xff0c;加深理解&#xff0c;如果要看权威的解释可以自己去看《Netty权威指南》。 阻塞IO 进…

【算法】树状数组数据结构

文章目录Part.I 预备知识Chap.I 一些前提和概念Chap.II lowbit 函数Part.II 树状数组Chap.I 树状数组的思想Chap.II 树状数组的构造Part.III 树状数组的应用Chap.I LeetCode: 2426. 满足不等式的数对数目Sec.I 题目描述与分析Sec.II 代码实现Chap.II LeetCode: 51. 数组中的逆序…

计算机网络-网络层(ARP协议,DHCP协议,ICMP协议)

文章目录1. ARP协议2. DHCP协议3. ICMP协议1. ARP协议 首先数据在从网络层向下传递到数据链路层&#xff0c;在数据链路层中&#xff0c;要给报文封装源MAC地址和目的MAC地址。 其中获取目的MAC地址就是通过ARP协议 首先&#xff1a;每台主机都有一个ARP高速缓存&#xff08…

【VC++】字符串详解窗口第一个windows程序

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录系统调用顺序对比怎样避免确实动态链接库基本知识类型列表指针类型匈牙利标记法字符串详解Unicode 和 ANSI 函数TCHARs窗口WinMain我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xf…

微信小程序开发(超详细保姆式教程)

介绍&#xff1a; 微信里面app&#xff0c;16年推出 竞品&#xff1a;支付宝小程序&#xff0c;钉钉&#xff0c;美团&#xff0c;头条&#xff0c;抖音qq小程序 优点 1&#xff0c;在微信里面自由分享&#xff0c;2&#xff0c;不用下载app&#xff0c;3,能快速的开发&#xf…

【MySQL】如何把Windows上的MySQL数据库迁移到Linux服务器上

目录1. 前言2. 物理备份与逻辑备份3. mysqldump实现逻辑备份4. 逻辑恢复1. 前言 最近在学黑马的《瑞吉外卖》&#xff0c;前期的基础版本一致在 Windows 电脑上开发&#xff0c;包括 MySQL 数据库也是安装在 Windows 电脑上。最近才学到优化篇&#xff0c;安装了 Linux 虚拟机…

【成为红帽工程师】第二天 ssh远程连接服务器

目录 一、远程连接服务器 二、连接加密技术 三、ssh远程连接服务 四、sftp用法介绍 五、相关实验 一、远程连接服务器 &#xff08;一&#xff09;什么是远程连接服务器 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机…

2022年最新山东交安安全员模拟真题及答案

百分百题库提供交安安全员考试试题、交安安全员考试真题、交安安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 43.危险性较大工程专项施工方案需要论证的&#xff0c;应当由建设单位组织召开专家论证会。 答案&#…