Linux进程与操作系统详解

news2024/11/25 2:57:06

在这里插入图片描述

文章目录

  • 一:冯诺依曼体系
  • 二:操作系统
  • 三:进程和PCB
  • 四:进程相关的指令
  • 五:getpid和getppid系统调用
  • 六:fork系统调用
  • 七:进程状态
  • 八:Linux下进程状态大全
    • 8.1:R(running)
    • 8.2:S(sleep)
    • 8.3:D(disk sleep)
    • 8.4:T(stopped)
    • 8.5:X(dead)
    • 8.6:僵尸进程Z(zombie)
    • 8.7:孤儿进程
  • 九:进程优先级

一:冯诺依曼体系

image-20221110165912826

  • 存储器指的是内存(RAM),具有断电易失的特点
  • 外设和存储器的过程就是IO过程
  • 运算器和控制器+其他合并为CPU
  • 由图中可以看见,输入设备和输出设备不能直接和cpu打交道,必须先和内存打交道,cpu也只和内存打交道。
  • cpu结构精密,运算速度极高,而我们的外设IO设备效率相对cpu很慢,因此cpu必须直接和内存打交道,提高整机效率
  • 对于cpu而言,只能被动的接受别人的指令,别人的数据,计算别人的数据,但是他得首先认识别人的指令,因为cpu有自己的一套指令集(精简和复杂指令集),在c语言里面学过我们写的代码程序在编译过程中会生成二进制的可执行程序,这些二进制对应着指令集。

举个例子:我们在和朋友使用qq聊天的时候,当我们在窗口输入了一句话,那么这句话就会从我们的输入设备(键盘)载入数据到内存中,我们点击发送的时候,cpu就会执行qq这个程序的发送的指令集,和内存中的那句话打交道,将他发送到服务器上,也就是我们的网卡。然后网卡再作为输入设备与我们的内存打交道,cpu执行服务器中的这句话的指令集,然后再通过内存发送到对面的电脑上,也就是磁盘上。

总结

  • cpu只和内存打交道,不和外设直接打交道。
  • 所有的外设,所有的数据需要载入,只能载入到内存中,内存写出,也一定是写到外设中。

二:操作系统

image-20221110171708812

在学校校长不是直接管理学生,而是通过教师管理学生,校长只需要通过教师获取学生的数据(个人信息)即可,操作系统就是这样,不直接和管理对象直接接触,只需要获得他们的数据就行。

而对于这些数据,是通过struct结构体提取学生的关键词信息,比如age,height。对学生的数据进行链表式的管理。

创建结构体的过程是先描述学生的关键信息,使用链表将学生数据汇总是组织这些数据的过程。

操作系统也是如此。管理硬件的时候,对其中的数据先描述再组织。上面作为教师身份的是驱动程序,驱动会进行数据的采集和操作系统命令的执行。

image-20221110172733182

总结

  • 操作系统的对硬件的管理体现在对数据的先描述再组织的过程。
  • 描述用struct结构体
  • 组织用链表等数据结构

操作系统就像银行一样,不能完全封装自己(银行窗口完全紧闭),不然客户无法存钱取钱与业务办理。因此银行既要保护自己,也要给上层用户提供服务。因此操作系统会提供部分接口直接访问操作系统,这就是系统接口,供上层开发者使用。

但是这种系统接口功能比较基础,对用户的要求也比较高,所以有心的开发者可以对部分系统调用进行封装,从而形成库,有了库,就有利于上层用户或者开发者进行更好的开发。

三:进程和PCB

程序的本质:存储在磁盘上的文件。

进程的初步概念:程序执行的一个实例,正在执行的程序。

进程的初步内核概念:担当分配资源的实体。

当我们执行了很多程序的时候,形成进程,操作系统是直接对进程的可执行程序进行管理吗?不,还是先描述再组织,将进程的属性包装成struct结构体,在linux中他就叫tast_struct,存放着进程的属性,存在内存(RAM)中。再把这些数据的结构体组织成链表形式。也就是PCB。

操作系统对进程的管理也就变成了对PCB的管理,即为链表的增删查改。

四:进程相关的指令

/proc这是进程系统文件,比如要查看某个pid为1的进程,可以使用ll /proc/1

如果该进程在运行时候,可执行文件删除了,进程不会停止,这个系统带pid的系统目录会失效。

image-20221110175416554

这可以查看某个进程的信息。(ps axj | grep ‘进程名’)

也可以用管道,ps axj|head -1 && ps axj |grep ‘进程名’,查看包括属性的显式

image-20221110175643663

五:getpid和getppid系统调用

getpid和getppid可以获取进程的pid和ppid。 image-20221110180751004

这是pid

image-20221110181046835

这是pid和ppid,我们可以看到父进程是bash。

六:fork系统调用

是用来创建子进程的。fork有2个返回值。

image-20221110181746649

image-20221110181754025

打印结果是2份,因此我们可以知道fork有2个返回值

image-20221110182331830

man fork看了一下,对于fork有2个返回值。返回成功时候,父进程返回子进程的pid,子进程返回0,返回失败时,父进程返回-1。

image-20221110183005088

image-20221110183022350

可以看到,父进程返回值ret是子进程的pid,子进程的返回值是0。

总结

  • fork后创建子进程。后续有2个进程在执行代码
  • 父子进程会共享fork之后的代码
  • 通过返回值的不同,让父子进程执行后续共享的代码的一部分

七:进程状态

一:运行队列和运行状态

  • 一个cpu对应一个运行队列,

  • 进程执行的时候,需要先进入队列排队,让进程入运行队列,不是让可执行程序进入队列,而是让属性的集合task_struct 进入队列

  • 进程在runqueue就是进入了R状态(运行状态),不是运行了才能是运行状态。

二:对于cpu和硬件速度的差异如何处理

cpu的速度很快,外设的速度很慢,一个进程如果在运行队列中,需要访问硬件的时候,就要进行等待,意味着暂时用不到这个进程。进程不一定只占用cpu资源,还会访问外设,所以这如何解决?

操作系统会让这个进程暂时进入阻塞队列中去,让其他的需要cpu资源的进程进入运行队列中。当那个硬件访问完后需要cpu资源了再让那个进程重新进入运行队列。

三:阻塞有什么影响

阻塞过多,内存不够用了,这时候操作系统便会让一些进程的代码和数据保存到磁盘上,这样一来节省了部分空间给别的进程使用,这样的状态叫做挂起状态,但是操作系统是公平的,当别的进程运行完毕,会把挂起状态的进程重新从磁盘中获取,重新进入运行队列。

同时将进程的代码和数据写入磁盘和从磁盘中拿出的过程也叫内存的唤入唤出

八: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 */
}

8.1:R(running)

#include<stdio.h>
int main()
{
while(1);
return 0;
}

image-20221110185000515

R:进程要么在运行队列等待,要么在运行状态

+:有+表示在进程在前台,用户可以使用ctrl+c终止进程,没有+为后台进程,不能用ctrl+c终止。

8.2:S(sleep)

#include<stdio.h>
int main()
{
while(1)
{
printf("我是谁\n");
}
return 0;
}

image-20221110185224033

当使用printf的时候需要和外设显示器打交道,外设速度很慢,因此cpu在这段代码中的时间分配可能就是99%等待外设打印,1%执行算术运算。

S:浅睡眠状态,需要访问外设的时候,一般属于睡眠状态。意味着进程在等待事件完成。可以由操作系统杀掉进程。

8.3:D(disk sleep)

D:深度睡眠状态,当我们高IO的时候就会可能发生,Linux有一条指令可以进入高IO(dd指令),可以试

该状态下,进程只能断电情况下或者自己醒来从而中断D状态,无法由操作系统杀掉该进程。

8.4:T(stopped)

#include<stdio.h>
int main()
{
while(1)
{
printf("我是谁\n");
}
return 0;
}

image-20221110185940337

让上面的代码从S进入T,可以使用kill -19 pid的指令,

image-20221110190205409

我们使用kill -18 pid指令让程序继续进行,可以发现程序从T进入了R,而程序本来是R+,前面说过这是从前台变成了后台状态。

image-20221110190243363

我尝试使用ctrl+c是杀不掉进程的

image-20221110190304679

kill -19 pid后才能杀掉这个后台进程。

T:进程暂停,或者是让进程从前台进入后台状态。

t(tracing stop):当我们使用gdb进行调试进程的时候,也会进入暂停状态,这叫追踪暂停状态。

8.5:X(dead)

X:死亡状态。

8.6:僵尸进程Z(zombie)

子进程退出的时候,等待父进程读取自己的数据和状态的时候,子进程就会处于僵尸状态。就好比生产过程中当工人完成任务了不能马上下班,上级需要获取工人的完成量和状态。

    1 #include<stdio.h>
    2 #include<sys/types.h>
    3 #include<unistd.h>
    4 int main()
    5 {
    6   pid_t id = fork();
    7   if(id < 0) 
    8   {
    9     perror("fork fail\n");
   10     return 0;
   11   }         
E> 12   else if(fork > 0)                                 
   13   {           
   14     //father
   15     printf("father is sleeping pid is %d",getpid());
   16     sleep(30);
   17   }        
   18   else                                          
   19   {
   20     //child  
   21     printf("child is zombie pid is%d",getpid());
   22     sleep(5);                                                                                                                                                                        
   23     return 0;
   24   }
  

image-20221110191738788

image-20221110191757420

子进程先退出,父进程还没有读取子进程的代码的时候,子进程已经进入了Z的状态。

僵尸进程的危害

如果僵尸进程一直存在,也就是父进程一直不读取子进程返回的代码,维护退出状态本身就要数据维护,也属于进程的基本信息,也就是struct_task,也就是说僵尸进程只要存在,PCB就要一直维护。如果一个父进程创建了很多子进程都不回收从而进入Z状态,就会造成内存资源的浪费,会造成内存泄露。

那我们可以手动杀掉这个进程吗?答案不行。

因为这个子进程已经退出,已经是死亡状态,无法手动杀掉。当进程被回收后(后续内容讲解),子进程立马变为X(dead)状态。

8.7:孤儿进程

    1 #include<stdio.h>
    2 #include<sys/types.h>
    3 #include<unistd.h>
    4 int main()
    5 {
    6   pid_t id = fork();
    7   if(id < 0) 
    8   {
    9     perror("fork fail\n");
   10     return 0;
   11   }         
E> 12   else if(fork > 0)                                 
   13   {           
   14     //father
   15     printf("father is sleeping pid is %d",getpid());
   16     sleep(30);
   17   }        
   18   else                                          
   19   {
   20     //child  
   21     printf("child is zombie pid is%d",getpid());
   22     sleep(5);                                                                                                                                                             
   24   }

image-20221110194619036

杀掉父进程后,子进程被一号系统领养,如果不被领养,孤儿进程就无法回收了这样一来就内存泄露了。

九:进程优先级

image-20221110194911509

使用ps -l会查看出进程的优先级,PRI就是优先级,NI可以手动更改叫nice,

优先级=系统默认优先级(80)+ NI值

NI取值为(-20,19)。

用top命令更改NI值,进入top后按r,输入进程的pid,输入NI值。

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

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

相关文章

Hive3 - HiveSQL 特征及操作

一、HiveSQL特征 Hive SQL&#xff08;HQL&#xff09;与SQL的语法大同小异&#xff0c;基本上是相通的&#xff0c;对SQL掌握的可以非常快的上手使用Hive SQL。不过在一些细节上需要特别注意Hive自己特有的语法知识点&#xff0c;下面分别进行介绍。 1. 字段数据类型 Hive数…

【附源码】Python计算机毕业设计烹饪课程预约系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

电脑重装系统c盘如何备份资料

现在越来越多的用户都喜欢重装自己所喜欢的电脑系统&#xff0c;但需要在重新安装系统之前备份自己的电脑。因此有很多用户问重装系统c盘如何备份的文件。今天小编就教下大家重装系统c盘如何备份的教程。 工具/原料&#xff1a; 系统版本&#xff1a;windows7系统 品牌型号&…

多目标应用:非支配排序的鲸鱼优化算法NSWOA优化RBF神经网络实现数据预测(RBF隐藏层神经元个数可以自行设定)

一、非支配排序的鲸鱼优化算法 非支配排序的鲸鱼优化算法&#xff08;Non-Dominated Sorting Whale Optimization Algorithm&#xff0c;NSWOA&#xff09;由Pradeep Jangir和 Narottam Jangir于2017年提出。 NSWOA算法流程如下&#xff1a; 二、RBF神经网络 1988年&#xf…

Spring-Aop面向切面编程

文章目录一、简介1、作用2、AOP核心概念3、五种&#xff08;增强&#xff09;通知类型二、AOP入门小案例&#xff08;注解版&#xff09;1.导入坐标(pom.xml)2.制作连接点(原始操作&#xff0c;Dao接口与实现类)3:定义通知类和通知4:定义切入点5:制作切面6:将通知类配给容器并标…

Linux操作系统

Linux 基础入门 Linux操作系统 操作系统 首先&#xff0c;我们需要知道什么是操作系统&#xff1a; 操作系统是应用程序运行的基础支撑环境操作系统作用是管理与控制计算机系统硬件与软件资源&#xff08;软件与硬件的中间层&#xff09;Intel X86 架构上的常见的操作系统&…

linux基本指令(上)

文章目录1.whomai指令2. pwd指令3. ls 指令1. ls指令2. ls -l指令3.ls -la指令1. cd .2. cd . .4. ls -ld指令5. ls -i指令1. windows 与linux标识文件之间的区别6. ls -R指令4. cd指令1.cd 指令2. cd ~ 指令3.cd -指令5. 根目录1.绝对路径2.相对路径例判断相对路径是否唯一6. …

leetcode-每日一题-119-杨辉三角2(简单,dp)

今天这道题是一道简单的dp题说实话很好想到解法&#xff0c;就是用两个dp来回倒换即可解除&#xff0c;然后也没啥难度所以就不解释了&#xff0c;养成一个好习惯就是设置数组的时候需要malloc动态获取即可&#xff0c;然后使用memset进行初始化&#xff0c;注意memset只能进行…

期货行权(期货行权日)

​ 期权如何行权&#xff1f;期货到期了如何进行实物交割&#xff1f; 期权到期日 Expiration Date&#xff1a;到期日即是指期权合约所规定的&#xff0c;期权购买者可以实际执行该期权的最后日期。 对欧式期权而言&#xff0c;为期权合约可以行权的唯一一天&#xff1b;对…

[附源码]计算机毕业设计JAVAjsp心理测评系统

[附源码]计算机毕业设计JAVAjsp心理测评系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis…

经典图割算法中图的构建及实现:Graph-Cut

经典图割算法中图的:Graph-Cut一&#xff0e;graph-cut&#xff1a;准则函数二&#xff0e;Graph-cut&#xff1a;图的建立1.术语&#xff1a;2.图的建立3. 头文件4. 源文件5. 测试图像讲解目前典型的3种图割算法&#xff1a;graph-cut、grab-but、one-cut。本文主要讲解graph-…

【IEEE2014】EET:基于采样的机器人运动规划中的平衡勘探与开发

EET&#xff1a;基于采样的机器人运动规划中的平衡勘探与开发 摘要&#xff1a; 本文提出了一种用于运动规划的探索/利用树&#xff08;EET&#xff09;算法。EET规划者故意用概率的完整性来换取计算效率。这种权衡使EET规划器能够比最先进的基于采样的规划器多三个数量级。我们…

【蓝桥杯真题练习】STEMA科技素养练习题库 答案版013 持续更新中~

1、人工神经网络是一种模仿动物神经系统设计的机器学习方法,它被用于解决各种传统编程无法解决的问题。“神经网络”一词在英文中是( )。 A.Neural Network B.Neural Engine C.Machine Learning D.Machine Network 答案:A 2、中央处理器(CPU)是手机,电脑…

第五章 Docker 自定义镜像

5-1 认识 Dockerfile 文件 Dockerfile 用于构建 Docker 镜像&#xff0c;Dockerfile 文件是由一行行命令语句组 成 &#xff0c; 基于 这些命 令 即 可以构建一 个镜 像&#xff0c; 比如下面 就 是一 个 Dockefile 文件样例&#xff1a; FROM XXX/jdk:8 MAINTAINER docker_us…

大一学生《Web编程基础》期末网页制作 HTML+CSS+JavaScript 企业网页设计实例

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本

文章目录情况紧急 ⁉️抢❗️抢❗️抢❗️开抢时间说明&#x1f4a8;开抢过程&#x1f4a5;Get_cookie.py开抢结束语&#x1f631;情况紧急 ⁉️ 不管你信不信&#xff0c;这就是俺刚瞧出的代码&#xff01;&#xff01;&#xff01; 现在离20&#xff1a;00还有38分钟&#xf…

持久与速度 鱼和熊掌 MySQL怎么去兼得

前言 我们都知道 MySQL 有一个特性就是持久化储存到磁盘中 我们存进去就要取出来这也是MySQL的速度为什么比不上Redis。但是MySQL 并不是完全就摆烂每次都进行 Select update 的时候都重新去磁盘IO 这样MySQL肯定会更慢 速度快 和 持久化 MySQL 表示我都要 但是两者都要肯定没…

Chapter7.4:线性离散系统的分析与校正考研参考题

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选&#xff0c;仅包含部分经典习题&#xff0c;需要完整版习题答案请自行查找&#xff0c;本系列属于知识点巩固部分&#xff0c;搭配如下几个系列进行学习&#xff0c;可用于期末考试和考研复习。 自动控制原理(…

台式万用表究竟如何选型?手持式和台式选择哪一个?

数字万用表是一种多用途的电子测量仪器&#xff0c;有各种各样的形状和规格&#xff0c;可能要超过任何其他仪器品类&#xff0c;比较常见的就是手持和台式万用表了&#xff0c;那么在选型时选择手持式还是台式万用表呢?今天安泰测试就给大家分享一下&#xff1a; 手持式数字万…

充分复用离线空闲算力,降低了实时计算资源开支

针对提供下游数据报表展示的场景&#xff0c;一般需要走预计算的流程将结果持久化下来&#xff0c;对数据就绪和计算耗时的敏感度都较高&#xff0c;而且查询逻辑相对复杂&#xff0c;Trino/Impala 集群规模相对较小&#xff0c;执行容易失败&#xff0c;导致稳定性欠佳。这个场…