linux 进程

news2024/9/29 23:38:53

文章目录

    • 1、进程的状态
    • 2、进程的组织
    • 3、进程的控制
      • 3.1、进程的创建
        • fork 函数
          • fork 拷贝和共享
          • fork 原理
          • fork 的写时复制
        • exec 函数族
          • exec 原理
      • 3.2、进程的终止
        • exit 函数
        • * 僵死进程
        • * 孤儿进程
      • 3.3、进程的阻塞和唤醒
      • 3.4、进程的切换
    • 4、进程间通信
    • 5、进程调度算法

进程是可执行程序的实例,是资源分配和调度的基本单位。

进程:动态执行的程序 + 虚拟内存 + 虚拟 CPU

1、进程的状态

进程的基本状态

  • 运行态 Running:进程正在占用 CPU。
  • 就绪态 Ready:进程具备执行条件,等待获取 CPU。
  • 阻塞态 Blocked:进程等待某一事件而暂停运行。

在这里插入图片描述

一个进程从运行态到阻塞态是主动行为,而从阻塞态到就绪态是被动行为,需要其他进程的协助

此外,进程的状态还包括

  • 创建态 New:进程正在被创建
  • 结束态 Exit:进程正在从系统中消失

为减少阻塞态的进程占用物理内存,在虚拟内存管理的操作系统中,通常会把阻塞态的进程换出到硬盘,等待再次运行时,再从硬盘换入到物理内存。这种进程没有占用物理内存的情况称为挂起态。ctrl + z

挂起态分为

  • 阻塞挂起态:进程在外存并等待某个事件的出现
  • 就绪挂起态:进程在外存,但只要进入内存,就能立刻执行

在这里插入图片描述

查看进程的状态

# 查看进程状态
ps -elf 'UNIX风格
ps aux  'BSD风格

# 查看系统的内存占用
free

# 动态显示系统当中的进程
top

2、进程的组织

进程映像(进程实体):PCB + 程序段 + 数据段

  • 进程控制块 PCB:描述进程的基本情况和运行状态,进而控制和管理进程。
  • 程序段:进程调度到 CPU 执行的代码段,可被多进程共享
  • 数据段

PCB 是进程存在的唯一标识。创建进程就是创建进程映像中的 PCB,撤销进程就是撤销进程的 PCB。其中存储了各种静态信息,包括进程描述信息、进程控制和管理信息、资源分配清单、CPU 相关信息等。

例如:进程描述信息

  • 进程标识符 PID:唯一标识进程
  • 用户标识符 UID:进程归属的用户,用于共享和保护
// 返回调用进程的 PID
pid_t getpid(void);
// 返回父进程的 PID(创建调用进程的进程)
pid_t getppid(void);

// 获取用户ID
uid_t getuid(void);
// 获取有效用户ID 
uid_t geteuid(void);

// 获取组ID
gid_t getgid(void);
// 获取有效组ID
gid_t getegid(void);   

为了方便进程的调度和管理,内核将各进程的 PCB 组织起来,常用的方法有链接方式和索引方式。

链接方式:内核把相同状态的 PCB 链接到一个双向循环链表,组成任务队列。链表的节点类型为 task_struct ,也就是进程控制块 PCB。不同状态对应不同的任务队列,例如:就绪队列和阻塞队列

在这里插入图片描述

索引方式:将相同状态的进程组织在一个索引表中,索引表的表项指向相应的 PCB,不同状态对应不同的索引表等。

3、进程的控制

3.1、进程的创建

创建进程的过程(创建原语)

  • 为新进程分配 PID,并申请一个空白的 PCB
  • 为进程分配资源
  • 初始化 PCB
  • 将 PCB 插入到就绪队列,等待被调度运行;

fork 函数

父进程通过调用 fork 函数创建一个子进程。子进程是父进程的拷贝,子进程继承了父进程的地址空间(地址空间相同但是独立),共享文件。最大区别在于二者拥有不同的 PID。

fork 函数只被调用一次,却会返回两次:在父进程中,fork 返回子进程的 PID。在子进程中,fork 返回 0 。

// 返回值:子进程返回值为 0,父进程返回子进程的 PID。
pid_t fork(void);
fork 拷贝和共享
  • 用户态拷贝:堆、栈、数据段、代码段,进程上下文,文件流,文件缓冲区
  • 内核态:部分拷贝(文件描述符数组),部分共享(文件描述符指向的文件对象)
fork 原理
  • 上半部:拷贝地址空间,修改子进程 task_struct,调整 PID 和 PPID 。随后,将子进程放入就绪队列等待调度,并将子进程的 fork 的返回值修改为 0,父进程的返回值设置为子进程的 PID。该过程不可抢占。
  • 下半部:将返回值返回给两个进程,随后修改 PC 指针,让各进程继续执行后续的命令
fork 的写时复制

写时复制(Copy on Write, COW):fork 调用时页表复制,并且将两个进程的每个页面标记为只读,父子进程共用一块物理内存。当有进程试图写操作时,触发缺页中断,从而进行物理内存的复制,并更新其页表项指向这个新的物理内存,然后恢复这个页面的可写权限。总之,谁修改,谁拷贝内存,子进程指向这块新内存。

在这里插入图片描述

写时复制的最充分地使用了稀有的物理内存,只有在发生写操作的时候,系统才会去复制物理内存,从而避免物理内存的复制过程导致进程长时间阻塞。

exec 函数族

在当前进程的上下文加载并执行一个程序

fork 函数在子进程中运行相同的程序,新的子进程是父进程的一个副本;exec 函数在当前进程的上下文加载并运行一个新的程序,会覆盖当前进程的地址空间。

exec 原理
  • 代码段,数据段被替换
  • 堆栈清空
  • PC指针重新返回代码段的开始

例:实现 system 函数功能

#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

extern char **environ;

int Mysystem(const char* CMD) {
    if (CMD == NULL) {
        return 1;
    }

    if(fork() == 0) {
        execl("/bin/sh", "sh", "-c", CMD, NULL);
        _exit(127);
    }
    wait(NULL);
}

// 测试样例:./mysystem date 实现 sysytem("date")
int main(int argc,char*argv[]) {
    Mysystem(argv[1]);
    return 0;
}

3.2、进程的终止

终止进程的过程(撤销原语)

  • 根据被终止进程的 PID,检索 PCB,读取该进程的状态
  • 若进程处于运行态,立即终止该进程的执行,然后将 CPU 资源分配给其他进程;
  • 如果进程还有子进程,则将该进程的子进程交给 init 进程(pid = 1)回收
  • 将该进程所拥有的全部资源,或归还给其父进程,或归还给操作系统;
  • 将该 PCB 从所在队列中删除

exit 函数

以 status 退出状态来终止进程。

#include <unistd.h>
void _exit(int status);

当一个进程由于某种原因终止时,内核并不是立即把它从系统中删除。相反,进程被保持在一种已终止的状态,直到被它的父进程回收。当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程,至此该进程被终止。

* 僵死进程

僵死进程:一个终止但并未被回收的进程。

父进程需要及时回收已终止的子进程。因为僵死进程即使没有运行,仍然消耗系统的内存资源。

父进程调用 wait 或 waitpid 函数来等待它的子进程终止或停止。

#include <sys/types.h>
#include <sys/wait.h>

// 随机等待一个子进程
pid_t wait(int *status);
// 等待指定 pid 的子进程
pid_t waitpid(pid_t pid, int *status, int options);

* 孤儿进程

孤儿进程:父进程先于子进程退出。自动被养父 init 进程(pid = 1)收养。当一个孤儿进程退出后,它的资源清理会交给它的父进程(init 进程)来处理。但在此之前,它一直消耗系统的资源,要尽量避免。

3.3、进程的阻塞和唤醒

阻塞进程的过程:进程等待事件,主动调用 Block 原语

  • 找到将要被阻塞进程 PID 对应的 PCB
  • 如果该进程为运行状态,则保护其现场,将其状态转为阻塞态,停止运行
  • 将该 PCB 插入到相应事件的等待队列,将 CPU 调度给其他就绪进程

唤醒进程:其他相关进程调用,Wakeup 原语

唤醒进程的过程如下:

  • 在该事件的等待队列中找到相应进程的 PCB
  • 将其从队列中移出,并置其状态为就绪态
  • 把该 PCB 插入就绪队列中,等待调度

Block 原语和 Wakeup 是一对作用相反的原语,必须成对使用。

3.4、进程的切换

进程切换:处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程运行环境产生了实质性变化。

调度是指资源分配给哪一进程的行为,是一种决策;切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换。

进程切换的过程

  • 保存 CPU 上下文,包括程序计数器和其他寄存器
  • 更新 PCB信息
  • 把进程的 PCB 移入相应的队列
  • 选择另一个进程执行,更新 PCB
  • 更新内存管理的数据结构
  • 恢复 CPU 上下文

4、进程间通信

进程间主要通信方式有:管道、共享内存、信号、信号量、消息队列、套接字

参考我的博客:linux 进程间通信

5、进程调度算法

进程调度算法

  • 先来先服务:选择最先进入队列的
  • 短作业优先:选择完成时间最短的
  • 优先级调度:选择优先级别最高的
  • 高响应比优先:选择响应比最高的
  • 时间片轮转:总是选择就绪队列中第一个进程,但仅能运行一个时间片
  • 多级反馈队列:时间片轮转 + 优先级调度

参考

  • 进程管理
  • 深入理解计算机系统

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

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

相关文章

特斯拉无人驾驶解读

来源于Tesla AI Day Tesla无人驾驶算法的核心任务就是如何理解我们所看到的一切呢?也就是说,不使用高端的设备,比如激光雷达,仅仅使用摄像头就能够将任务做得很好。Tesla使用环绕型的8个摄像头获得输入。 第一步是特征提取模块Backbone,无论什么任务都离不开特征…

chatgpt怎么安装?国内怎么玩chatgpt?

关于chatgpt的传言最近真的是闹得沸沸扬扬&#xff0c;主要是这个chatgpt人工智能的冲击力实在是太大了&#xff0c;它学习了大量的语言知识&#xff0c;具有很强的语言能力&#xff0c;无论是写作&#xff0c;还是诗歌&#xff0c;甚至是代码都是不在话下&#xff0c;美国大学…

【数据库】 如何对数据库进行操作

目录 一&#xff0c;SQL语句基础 1&#xff0c; SQL简介 &#xff08;1&#xff09; SQL语句分类 &#xff08;2&#xff09;SQL语句的书写规范 二&#xff0c;数据库操作 1、查看 &#xff08;1&#xff09;查看所有数据库 &#xff08;2&#xff09;查看有没有指定的数…

ubuntu20下Qt5.14.2+OpenCV(含Contrib)-4.5.0环境搭建

Qt若要能处理图片和视频&#xff0c;就必须安装OpenCV&#xff0c;而OpenCV中很多的高级功能如人脸识别等都包含在Contrib扩展模块中&#xff0c;需要将Contrib与OpenCV一起联合编译&#xff0c;目前所用这两个版本都是4.5.0版。 一、下载OpenCV OpenCV的官方下载地址为http:…

SSM整合SpringSecurity简单使用

一、SpringSecurity 1.1 什么是SpringSecurity Spring Security 的前身是 Acegi Security &#xff0c;是 Spring 项目组中用来提供安全认证服务的框架。(官网地址) Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发…

用网络调试助手测试PLC-Reocrder收听模式的过程

目录 一、测试环境 二、步骤及要点说明 1、PLC-Recorder的通道配置 2、PLC-Recorder启动采集 3、配置网络调试助手 4、启动调试助手的连接&#xff0c;并点击“启动批量发送” 5、停止发送&#xff0c;查看发送和接收的情况 三、小结 一、测试环境 Windows10操作系统&a…

Docker进阶 - 11. Docker Compose 编排服务

注&#xff1a;本文只对一些重要步骤和yml文件进行一些讲解&#xff0c;其他的具体程序没有记录。 目录 1. 原始的微服务工程编排(不使用Compose) 2. 使用Compose编排微服务 2.1 编写 docker-compose.yml 文件 2.2 修改并构建微服务工程镜像 2.3 启动 docker-compose 服务…

数据结构(二):单向链表、双向链表

数据结构&#xff08;二&#xff09;一、什么是链表1.数组的缺点2.链表的优点3.链表的缺点4.链表和数组的区别二、封装单向链表1. append方法&#xff1a;向尾部插入节点2. toString方法&#xff1a;链表元素转字符串3. insert方法&#xff1a;在任意位置插入数据4.get获取某个…

RNN神经网络初探

目录1. 神经网络与未来智能2. 回顾数据维度和神经网络1. 神经网络与未来智能 2. 回顾数据维度和神经网络 循环神经网络&#xff0c;主要用来处理时序的数据&#xff0c;它对每个词的顺序是有要求的。 循环神经网络如何保存记忆功能&#xff1f; 当前样本只有 3 个特征&#x…

git基本概念图示【学习】

基本概念工作区&#xff08;Working Directory&#xff09;就是你在电脑里能看到的目录&#xff0c;比如名字为 gafish.github.com 的文件夹就是一个工作区本地版本库&#xff08;Local Repository&#xff09;工作区有一个隐藏目录 .git&#xff0c;这个不算工作区&#xff0c…

新方案:从错误中学习,点云分割中的自我规范化层次语义表示

前言 LiDAR 语义分割通过直接作用于传感器提供的原始内容来完成细粒度的场景理解而受到关注。最近的解决方案展示了如何使用不同的学习技术来提高模型的性能&#xff0c;而无需更改任何架构或数据集。遵循这一趋势&#xff0c;论文提出了一个从粗到精的设置&#xff0c;该设置从…

查找与排序 练习题

1、下列排序算法中&#xff0c;▁▁B▁▁ 是稳定的。 A.简单选择排序 B.冒泡排序 C.希尔排序 D.快速排序 解析&#xff1a;稳定排序是每次排序得到的结果是唯一的&#xff0c;不稳定排序得到的结果不唯一。 稳定&#xff1a;冒泡排序、归并排序、基数排序 不稳定&#x…

DolphinSchedule基于事件驱动的高性能并发编程

文章目录前言前置知识异步编程基于时间驱动的异步编程模式&#xff08;EAP Event-based Asynchronous Pattern &#xff09;实现EAPDolphinSchedule结合Netty实现Master与Worker之间的高性能处理能力的设计方案设计代码实现总结前言 研究DolphinSchedule的内因在于对调度系统并…

内存访问局部性特征

分享一道360的C语言笔试题。x是一个行列均为1000的二维数组&#xff0c;下面代码运行效率最高的是哪个&#xff1f; 二维数组大家都很熟悉&#xff0c;正常人遍历二维数组都是一行一行来的&#xff0c;为什么很少有人按列去遍历&#xff1f; 这道笔试题其实考察的就是遍历效率…

#车载基础软件——AUTOSAR AP技术形态

车载基础软件——AUTOSAR AP技术形态 我是穿拖鞋的汉子! 今天是2023年2月11日,时间好快,疫情解封已好几个月,生活节奏也在逐渐恢复到三年前的节奏。可能是感觉疫情与自己距离变远了,大家也开始慢慢的不再恐惧! 老规矩分享一段喜欢的文字,避免自己成为高知识低文化的工…

【安全】nginx反向代理+负载均衡上传webshell

目录 一、负载均衡反向代理下上传webshell Ⅰ、环境搭建 ①下载蚁剑&#xff0c;于github获取官方版&#xff1a; ②下载docker&docker-compose ③结合前面启动环境 ④验证 负载均衡下webshell上传 一、负载均衡反向代理下上传webshell 什么是反向代理&#xff1f; 通常的代…

大数据框架之Hadoop:入门(三)Hadoop运行环境搭建(开发重点)

3.1虚拟机环境准备 详见&#xff1a;yiluohan1234/vagrant_bigdata_cluster: 利用virtualbox快速搭建大数据测试环境 (github.com) 单纯只是安装虚拟机的话&#xff0c;注释掉40到115行。按照教程安装即可。 在 /opt 目录下创建 module、 software 文件夹 [roothdp101 ~]# m…

一、Java并发编程之线程、synchronized

黑马课程 文章目录1. Java线程1.1 创建和运行线程方法一&#xff1a;Thread方法二&#xff1a;Runnable&#xff08;推荐&#xff09;lambda精简Thread和runnable原理方法三&#xff1a;FutureTask配合Thread1.2 查看进程和线程的方法1.3 线程运行原理栈与栈帧线程上下文切换1.…

1. SpringMVC 简介

文章目录1. SpringMVC 概述2. SpringMVC 入门案例2.1 入门案例2.2 入门案例工作流程3. bean 加载控制4. PostMan 工具1. SpringMVC 概述 SpringMVC 与 Servlet 功能等同&#xff0c;均属于 Web 层开发技术。SpringMVC 是 Spring 框架的一部分。 对于 SpringMVC&#xff0c;主…

Python导入模块的3种方式

很多初学者经常遇到这样的问题&#xff0c;即自定义 Python 模板后&#xff0c;在其它文件中用 import&#xff08;或 from...import&#xff09; 语句引入该文件时&#xff0c;Python 解释器同时如下错误&#xff1a;ModuleNotFoundError: No module named 模块名意思是 Pytho…