池州哪家做网站/怎么自己创建网页

池州哪家做网站,怎么自己创建网页,深圳做网站需要多少费用,web网站开发进度规划表Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习 linux 进程~ ​❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 Linux专栏&#xff1a;https://blog.csdn.net/2302_80328146/category_12815302…

Ciallo~(∠・ω< )⌒☆ ~ 今天,我将和大家一起学习 linux 进程~

​❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️

澄岚主页:椎名澄嵐-CSDN博客

Linux专栏:https://blog.csdn.net/2302_80328146/category_12815302.html?spm=1001.2014.3001.5482

​❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️


目录

壹  基本概念与基本操作

1.1 task_ struct

1.2 查看进程

1.3 创建进程

贰  进程状态

2.1 进程状态的概念

2.2 运行 阻塞 挂起

2.3 进程状态查看

2.4 僵尸进程

2.5 孤儿进程

叁  进程优先级

3.1 基本概念

3.2 查看系统进程

3.3 PRI and NI

3.4 查看进程优先级的命令

3.5 竞争、独立、并行、并发

肆  进程切换

伍  Linux2.6内核进程O(1)调度队列

5.1 优先级

5.2 活动队列

5.3 过期队列

5.4 active指针和expired指针

~完~


壹  基本概念与基本操作

进程是程序的一个执行实例,正在执行的程序等,或者说担当分配系统资源(CPU时间,内存)的实体。

进程信息(PCB)被放在一个叫做进程控制块的数据结构中,Linux操作系统下的PCB是: task_struct。进程的所有属性都可以直接或间接的通过task_struct找到。

进程 = PCB(struct_task)+ 自己的代码和数据 ~

对进程的管理就变成了对链表的增删查改 ~

1.1 task_ struct

task_ struct 中包含:

标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

1.2 查看进程

历史上我们执行的所有指令,工具,自己的程序,运行起来都是进程~

我们可以通过系统调用getpid获取进程标示符~

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{while(1){sleep(1);printf("我是一个进程~,我的pid: %d\n", getpid());}
}   

每次执行的进程值都不同~

终止进程可以使用 ctrl + C 或 kill -9~ 

进程的信息可以通过/proc 系统文件夹查看 ~

进程结束后此进程的pid为名的文件夹会被销毁 ~

因为cwd默认当前目录,所以fopen创建文件时会在当前目录下生成~

更改目录可以使用 chdir (也是系统调用)~

  1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 int main()5 {6     chdir("/home/zmzz");7     fopen("Ciallo.txt","a");8     while(1)9     {10         sleep(1);11         printf("我是一个进程~,我的pid: %d,我的父进程id: %d\n", getpid(), getppid());12     }13 }   

getppid() 可以查看父进程,父进程不会变(bash命令行解释器本质是一个进程~)

每有一个用户就会有一个bash

1.3 创建进程

fork可以用来创建子进程~

  1 #include <stdio.h>2 #include <unistd.h>3 #include <sys/types.h>4 int main()5 {6     printf("父进程开始运行:pid= %d\n", getpid());7     fork();8     printf("进程开始运行:pid= %d\n", getpid()); 9 }      

fork有两个返回值~

一个父进程可以有多个子进程,是1:n的关系,父进程也需要知道子进程的pid进行控制,所以fork会给父子不同的返回值~

在fork函数中return id;语句执行前子进程已经被创建和调度了~所以fork会返回两次~

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{printf("父进程开始运行:pid= %d\n", getpid());pid_t id  = fork();if (id < 0){perror("fork fail~");return 1;}else if (id == 0){// childwhile(1){sleep(1);printf("我是一个子进程~,我的pid: %d,我的父进程id: %d\n", getpid(), getppid());}}else{// fatherwhile(1){sleep(1);printf("我是一个父进程~,我的pid: %d,我的父进程id: %d\n", getpid(), getppid());}}printf("进程开始运行:pid= %d\n", getpid());
}

进程具有独立性,父子任何一方进行修改数据,OS会把修改的数据在底层拷贝一份,让目标进程修改这个拷贝~这个拷贝叫做采用写时拷贝~

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int gval = 100;int main()
{printf("父进程开始运行:pid= %d\n", getpid());pid_t id  = fork();if (id < 0){perror("fork fail~");return 1;}else if (id == 0){printf("我是一个子进程~,我的pid: %d,我的父进程id: %d, gval: %d\n", getpid(), getppid(), gval);sleep(5);// childwhile(1){sleep(1);printf("子进程修改变量:%d->%d\n", gval, gval+10);gval += 10; // 修改printf("我是一个子进程~,我的pid: %d,我的父进程id: %d\n", getpid(), getppid());}}else{// fatherwhile(1){sleep(1);printf("我是一个父进程~,我的pid: %d,我的父进程id: %d, gval: %d\n", getpid(), getppid(), gval);}}printf("进程开始运行:pid= %d\n", getpid());
}


贰  进程状态

2.1 进程状态的概念

进程状态本质上就是task_struct内的一个整数。不同的整数代表不同的状态。

2.2 运行 阻塞 挂起

运行:进程在调度队列中,进程的状态都是running。

阻塞:等待某种设备或资源就绪。(键盘,显示器,网卡,磁盘,摄像头,话筒等)

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运行状态(running):并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里
  • S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠或者浅睡眠(interruptible sleep))。
  • D磁盘休眠状态(Disk sleep):有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
  • t停止状态(tracing stopped):  被debug,断点,进程被暂停了。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

2.3 进程状态查看

ps aux / ps axj 命令
  • a:显示一个终端所有的进程,包括其他用户的进程。
  • x:显示没有控制终端的进程,例如后台运行的守护进程。
  • j:显示进程归属的进程组ID、会话ID、父进程ID,以及与作业控制相关的信息
  • u:以用户为中心的格式显示进程信息,提供进程的详细信息,如用户、CPU和内存使用情况等

2.4 僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。

创建子进程的目的是为了帮父进程完成某种事情的,父进程需要知道子进程结果相关的信息。此信息会被存在task_struct中。如果父进程一直不回收子进程的退出信息,那么Z状态的PCB会一直存在,会引起内存泄漏问题。

僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{pid_t id = fork();if(id == 0){//childint count = 5;while(count){printf("我是子进程,我正在运行:%d\n", count);sleep(1);count--;}}else{//parentwhile(1){printf("我是父进程,正在运行...\n");sleep(1);}}return 0;
}// while :; do ps ajx | head -1; ps ajx | grep myprocess; sleep 1; done

2.5 孤儿进程

父进程先退出,子进程被1号systemd(操作系统)进程领养,这个子进程就称之为“孤儿进程”。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{pid_t id = fork();if(id == 0){//childwhile(1){printf("我是一个子进程, pid = %d, ppid = %d\n", getpid(), getppid());sleep(1);}}else{// fatherint cnt = 5;while(cnt){printf("我是一个父进程, pid = %d, ppid = %d\n", getpid(), getppid());cnt--;sleep(1);}}return 0;
}// while :; do ps ajx | head -1 && ps ajx | grep myprocess;sleep 1;done

 1号进程:

变成孤儿进程后,此进程会成为后台进程,ctrlC不能终止,需使用:

kill -9 此进程pid

叁  进程优先级

3.1 基本概念

进程优先级就是进程得到CPU资源的先后顺序~ 

CPU资源稀缺,所以导致要通过优先级确认谁先谁后的问题~

优先级是能得到资源,谁先谁后的问题。而权限是能不能得到资源的问题~

优先级也是一种数字, int, 值越低,优先级越高,反正,优先级越低~ 基于时间片的分时操作系统,考虑公平性,所以优先级可能变化,但变化幅度不会太大~ 

3.2 查看系统进程

ps -al | head -1 && ps -al | grep myprocess

• UID : 代表执行者的身份


• PID : 代表这个进程的代号
• PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
• PRI :代表这个进程可被执行的优先级,其值越小越早被执行
• NI :代表这个进程的NICE值

 top r 10命令后:

3.3 PRI and NI

PRI即进程的优先级,或者说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高~
nice值表示进程可被执行的优先级的修正数值
所以,调整进程优先级,在Linux下,就是调整进程nice值,PRI=80+NICE值
Linux优先级范围为[60, 99],nice其取值范围是-20至19,一共40个级别。

3.4 查看进程优先级的命令

用top命令更改已存在进程的nice:

  • top
  • 进入top后按“r”–>输入进程PID–>输入nice值

3.5 竞争、独立、并行、并发

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

肆  进程切换

比如一个大学生要去当兵,去之前他得向辅导员申请保留学籍,一年之后回来时他又得向辅导员申请恢复学籍,这就相当于一次切换,学校就是CPU,导员是调度器,大学生就是进程,学籍是进程运行的临时数据(CPU内寄存器中的内容,当前进程的上下文数据),保留学籍恢复学籍分别相当于保存和恢复进程上下文数据,当兵就是从CPU上剥离下来了。

当前进程要将自己的进程硬件上下文保存到进程的task_struct中(TSS任务状态段)。


伍  Linux2.6内核进程O(1)调度队列

下图是Linux2.6内核中进程队列的数据结构~

一个CPU拥有一个runqueue, 如果有多个CPU就要考虑进程个数的负载均衡问题~

5.1 优先级

  • 普通优先级:100~139(x - 60 + (140 - 40))
  • 实时优先级:0~99(不关心)

5.2 活动队列

  • 时间片还没有结束的所有进程都按照优先级放在该队列
  • nr_active: 总共有多少个运行状态的进程
  • queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!相当于一个哈希表管理的一个个链式队列
  • 从该结构中,选择一个最合适的进程,过程是怎么的呢?

1. 从0下表开始遍历queue[140]
2. 找到第一个非空队列,该队列必定为优先级最高的队列
3. 拿到选中队列的第一个进程,开始运行,调度完成!
4. 遍历queue[140]时间复杂度是常数!但还是太低效了!

  • bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!

5.3 过期队列

过期队列和活动队列结构一模一样,过期队列上放置的进程,都是时间片耗尽的进程,当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算。

5.4 active指针和expired指针

  • active指针永远指向活动队列
  • expired指针永远指向过期队列

活动队列上的进程会越来越少,过期队列上的进程会越来越多,在合适的时候,只要交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!


~完~

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

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

相关文章

Java面试第十一山!《SpringCloud框架》

大家好&#xff0c;我是陈一。如果文章对你有帮助&#xff0c;请留下一个宝贵的三连哦&#xff5e; 万分感谢&#xff01; 目录 一、Spring Cloud 是什么​ 二、Spring Cloud 核心组件​ 1. 服务发现 - Eureka​ 2. ​负载均衡 - Ribbon​ 3. 断路器 - Hystrix​ ​​4. …

Spring配置文件-Bean实例化三种方式

无参构造方法实例化 工厂静态方法实例化 工厂实例方法实例化

SpringBoot学习(三)SpringBoot整合JSP以及Themeleaf

目录 Spring Boot 整合 JSP1. 配置依赖2. 创建WEB目录结构&#xff0c;配置JSP解析路径3. 创建Controller类4. 修改application.yml5. 添加jstl标签库的依赖6. JSP页面7. 创建启动类 Spring Boot 整合 Thymeleaf1. 添加Thymeleaf依赖2. Controller3. 修改application.yml配置&a…

普通鼠标的500连击的工具来了!!!

今天介绍的这款软件叫&#xff1a;鼠标录制器&#xff0c;是一款大小只有54K的鼠标连点器&#xff0c;软件是绿色单文件版。抢票&#xff0c;拍牌&#xff0c;摇号都能用上。文末有分享链接 在使用先我们先设置快捷键&#xff0c;这样我们在录制和停止录制的时候会更方便。 软件…

【MySQL】基本查询(表的增删查改+聚合函数)

目录 一、Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 二、Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重 2.2 WHERE 条件2.2.1 比较运算符2.2.2 逻辑运算符2.2.3 案…

火山引擎(豆包大模型)(抖音平台)之火山方舟的Prompt的使用测试

前言 在大模型的使用过程当中&#xff0c;Prompt的使用非常的关键。原来&#xff0c;我对Prompt的理解不深&#xff0c;觉得Prompt的产生并不是很有必要。但是&#xff0c;自从使用了火山方舟中的“Prompt优解”之后&#xff0c;感受加深了&#xff0c;觉得Prompt是我们和大模型…

SpringBoot入门-(2) Spring IOC机制【附实例代码】

SpringBoot入门-(2) Spring IOC机制 Spring Spring是一个当前主流的轻量级的框架&#xff0c;发展到形状已经不仅仅是一个框架&#xff0c;而是形成以Spring为基础的生态圈&#xff0c;如(Spring Boot,Spring Cloud,Spring Security等) Spring 两大核心技术 控制反转(IoC)面…

Excel 小黑第12套

对应大猫13 涉及金额修改 -数字组 -修改会计专用 VLOOKUP函数使用&#xff08;查找目标&#xff0c;查找范围&#xff08;F4 绝对引用&#xff09;&#xff0c;返回值的所在列数&#xff0c;精确查找或模糊查找&#xff09;双击填充柄就会显示所有值 这个逗号要中文的不能英…

基于Spring Boot的冷链物流系统的设计与实现的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

牛客周赛85 题解 Java ABCDEFG

A小紫的均势博弈 判断输入的 n 是奇数还是偶数 import java.io.*; import java.math.*; import java.util.*;public class Main {static IoScanner sc new IoScanner();static final int mod(int) (1e97);static void solve() throws IOException {int nsc.nextInt();if(n%2…

python——UI自动化(1) selenium之介绍和环境配置

一、selenium介绍 selenium是一个第三方库&#xff0c;python有很多库&#xff1b; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式&#xff0c;用代码去实现自动化操作和验证的行为。 2、ui自动化的优点&#xff1f; &#xff08;1&#xff09;解决重复性的功能测…

15 数据结构及算法应用

15 数据结构及算法应用 15.1 算法策略区分 15.1.1、分治法 特征:把一个问题拆分成多个小规模的相同子问题&#xff0c;一般可用递归解决。 经典问题:斐波那契数列、归并排序、快速排序、矩阵乘法、二分搜索、大整数乘法、汉诺塔。 15.1.2、贪心法 (一般用于求满意解) …

【蓝桥杯python研究生组备赛】005 数学与简单DP

题目1 01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。 输出最大价值。 输入格式 第一行两个整数&a…

2024年国赛高教杯数学建模E题交通流量管控解题全过程文档及程序

2024年国赛高教杯数学建模 E题 交通流量管控解题 原题再现 随着城市化进程的加快、机动车的快速普及&#xff0c;以及人们活动范围的不断扩大&#xff0c;城市道路交通拥堵问题日渐严重&#xff0c;即使在一些非中心城市&#xff0c;道路交通拥堵问题也成为影响地方经济发展和…

npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本的处理方法

1、安装了node.js后&#xff0c;windows powershell中直接输入npm&#xff0c;然后就报错 2、出现原因&#xff1a;权限不够 系统禁用了脚本的执行&#xff0c;所以我们在windows powershell输入npm -v的时候&#xff0c;就会报上面的错误。 3、解决 Set-ExecutionPolicy Un…

蓝桥杯单片机之AT24C02(基于自己对AT24C02的学习和理解)

一、先用抽象法说明原理&#xff0c;让原理变得简单易懂&#xff1a; 1、向AT24C02写入数据&#xff1a; 有个关系户&#xff0c;他想安排自己的儿子进某个大厦里某个楼层的公司&#xff0c;那么他就要先找到这个公司的地址&#xff0c;然后再找到该公司是第几楼&#xff0c;最…

【高项】信息系统项目管理师(八)项目质量管理【3分】

项目质最管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求。以满足干系人目标的各个过程。项目质量管理以执行组织的名义支持过程的持续改进活动,项目质量管理需要兼顾项目管理与项目可交付成果两个方面,它适用于所有项目无论项目的可付成果具有何种特性。质…

python-leetcode 48.括号生成

题目&#xff1a; 数字n代表生成括号的对数&#xff0c;设计一个函数&#xff0c;用于生成所有可能并且有效的括号组合。 方法一&#xff1a;回溯 可以生成所有 2**2n 个 ‘(’ 和 ‘)’ 字符构成的序列&#xff0c;然后检查每一个是否有效即可 为了生成所有序列&#xff0c…

3D点云数据处理中的聚类算法总结

1.欧式聚类&#xff1a; 基于点的空间距离&#xff08;欧几里得距离&#xff09;来分割点云&#xff0c;将距离较近的点归为同一簇。 欧式聚类需要的参数&#xff1a;邻域半径R,簇的最小点阈值minPts&#xff0c;最大点数阈值maxPts。 实现效率&#xff1a; O(n * log n) 实现…

火星探测发展概述2025.3.20

一.火星探测历程 1.1 探索启蒙 火星探测的启蒙阶段可追溯至20世纪60年代,标志着人类对这颗神秘行星的科学探索正式拉开帷幕。这一时期的标志性事件包括: 1960年10月至1964年11月间,苏联和美国进行了6次火星探测尝试,但均以失败告终。 1964年11月28日,美国成功发射“水手…