Linux:进程的概念,进程相关函数

 一、进程的概念

1.进程

     进程是系统进行资源分配和调度的一个独立单元,它是操作系统结构的基础。进程是程序的一次执行过程,包含了程序代码、当前活动、系统资源(如CPU、内存、文件等)的使用情况等信息。每个进程都有自己独立的内存空间和系统资源。 

2.pcb  

  pcb 是 Process Control Block(进程控制块)的缩写,即进程控制块,是操作系统中用于存储进程管理所需信息的数据结构。它记录了操作系统的进程管理所需要的所有信息,包括:

  • PID(进程标识符):唯一标识一个进程。
  • 当前工作路径:进程当前的工作目录,通过chdir等系统调用可以改变。
  • umask:文件创建掩码,影响新创建文件的权限。例如,umask 0002意味着新创建的文件默认不允许组用户和其他用户写入。
  • 打开的文件列表:进程打开的所有文件及其相关信息,如文件描述符、文件模式等。
  • 信号相关设置:处理异步事件,如中断、错误等。进程可以定义对不同信号的处理方式(忽略、捕捉或默认处理)。
  • 用户ID和组ID:执行该进程的用户和组的身份标识。
  • 进程资源的上限:系统为该进程分配的资源上限,如最大打开文件数、最大内存使用量等。可以通过ulimit -a命令查看或设置这些限制。

3.进程和程序的区别

  1. 静态与动态
    • 程序:是静态的,它是一组指令和数据的集合,存储在非易失性存储介质(如硬盘)上。程序本身不执行任何操作,它只是等待被执行。
    • 进程:是动态的,它是程序在计算机上的一次执行过程。它包含了程序代码、数据以及系统分配给该程序的各种资源(如内存空间、文件描述符等)。进程是系统进行资源分配和调度的一个独立单元。
  2. 存在性与生命周期
    • 程序:是永存的,只要存储介质没有损坏,程序就可以一直存在。
    • 进程:是暂时的,有生命周期,包括创建、运行、等待、挂起、终止等状态。一旦进程执行完毕或被系统终止,它就不再存在。
  3. 状态变化
    • 程序:没有状态变化,它只是静态的代码和数据集合。
    • 进程:有状态变化,如运行状态、就绪状态、阻塞状态等。进程的状态会随着执行过程中的事件(如I/O操作、时间片结束等)而发生变化。
  4. 并发性
    • 程序:没有并发性,它只是一个代码和数据的集合,不会自己执行。
    • 进程:具有并发性,系统中可以同时运行多个进程,这些进程之间可能并发执行,也可能并行执行(在多处理器或多核处理器上)。
  5. 资源竞争
    • 程序:不直接涉及资源竞争,因为它不直接执行。
    • 进程:进程之间会存在资源竞争,因为它们可能同时需要访问CPU、内存、I/O设备等资源。操作系统通过调度算法来管理这些资源,确保进程的公平性和高效性。
  6. 与程序的关系
    • 一个程序可以多次运行,每次运行都会创建一个新的进程。因此,一个程序可以对应多个进程。
    • 一个进程可以执行一个或多个程序,特别是在现代操作系统中,一个进程可以加载并执行多个模块或库。
  7. 内存分布
    • 在许多操作系统中(如Linux),进程的地址空间被划分为用户空间和内核空间。用户空间通常位于低地址区域(如0-3G),用于存储进程的代码、数据等;内核空间位于高地址区域(如3G-4G),用于存储操作系统代码和数据,以及实现进程调度、内存管理等核心功能。这种划分是虚拟的,通过内存管理单元(MMU)和页表实现物理内存和虚拟内存之间的映射。

4.进程的分类

进程分类: 1、交互式进程

                   2、批处理进程 shell脚本

                   3、 守护进程

*5.进程的状态:

         3个状态,就绪→执行态→阻塞(等待,睡眠)基本操作系统
    

linux中的状态,运行态,睡眠态,僵尸,暂停态。

6.进程的作用

  1. 资源封装:进程封装了运行程序所需的资源,使得操作系统能够方便地对这些资源进行管理和调度。
  2. 执行程序:进程是程序执行的载体,操作系统通过创建进程来执行程序,实现程序的动态运行。
  3. 实现并发:操作系统通过创建多个进程,可以在同一时间段内执行多个任务,从而提高系统的整体效率和吞吐量。
  4. 系统安全:通过进程隔离,操作系统可以防止不同进程之间的相互干扰,保证系统的安全性和稳定性。

7.并发与并行的区别

  1. 定义
    • 并发:指两个或多个事件在同一时间间隔内发生,但这些事件并不是同时发生的。在操作系统中,并发通常指的是多个进程或线程在宏观上同时运行,但在微观上(即CPU的指令执行层面)是交替执行的。
    • 并行:指两个或多个事件在同一时刻同时发生。在并行计算中,多个任务可以同时被执行,因为它们被分配到不同的处理器或处理单元上。
  2. 资源需求
    • 并发通常不需要额外的硬件资源,它主要通过时间片轮转、上下文切换等机制来实现多个任务的交替执行。
    • 并行则需要额外的硬件资源来支持,如多核处理器、分布式计算环境等,以便能够同时执行多个任务。
  3. 效率与速度
    • 并发虽然可以在宏观上提高系统的整体效率,但在单个任务的执行速度上并没有明显的提升。
    • 并行则能够显著提高单个任务的执行速度,因为它允许多个任务同时执行,从而减少了总体执行时间。
while (1) {  发视频  
}  while (1) {  上下左右  
}
  • 如果这两个任务在同一台计算机上执行,并且只有一个CPU核心可用,那么它们将通过并发的方式执行,即操作系统通过时间片轮转等方式使这两个任务交替执行。
  • 如果这台计算机有多个CPU核心,且这两个任务被分配到不同的CPU核心上执行,那么它们将并行执行,即同时执行。

需要注意的是,并发和并行是操作系统和硬件层面的概念,而上述代码示例并没有直接体现这些概念。在实际应用中,要实现并发或并行,通常需要使用多线程或多进程等编程技术

进程的调度

进程调度是操作系统内核的主要功能之一,它决定了哪个进程可以获得CPU资源并运行。进程调度的目标是公平、高效地分配CPU资源,以满足进程的运行需求。以下是进程调度的几个关键点:

  1. 调度算法
    • 轮转调度(Round-Robin, RR):将CPU时间分成若干个时间片,每个进程在一个时间片内执行,时间片结束后切换到下一个进程。这种算法可以提高CPU的利用率,但可能会导致上下文切换开销增加。
    • 先进先出(First-In, First-Out, FIFO):也称为先来先服务(FCFS),按照进程到达系统的先后顺序进行调度,先到达的进程先执行。这种算法简单直观,但可能会导致长作业等待时间过长。
    • 优先级调度:根据进程的优先级进行调度,优先级高的进程先执行。这种算法可以根据进程的重要性进行调度,但可能会导致低优先级进程饿死。
    • 短作业优先(Shortest Job First, SJF):选择执行时间最短的进程。这种算法可以提高系统的整体效率,但同样可能导致长作业饥饿。
    • 其他算法:如多级反馈队列调度、多级队列调度等,这些算法结合了上述算法的某些特点,以更好地适应不同的应用场景。
  2. 调度时机
    • 进程创建时:当新进程被创建时,需要被加入到调度队列中等待CPU资源。
    • 进程终止时:当进程执行完毕或异常终止时,需要释放其占用的CPU资源,并重新调度其他进程。
    • 进程阻塞时:当进程因等待某个事件(如I/O操作完成)而阻塞时,需要将其从CPU上撤下,并调度其他进程执行。
    • 进程唤醒时:当被阻塞的进程因等待的事件完成而被唤醒时,需要将其重新加入到调度队列中等待CPU资源。
  3. 调度过程
    • 收集系统信息:操作系统需要收集有关系统中所有进程的信息,如进程的状态、优先级、需要的资源等。
    • 选择进程:根据调度算法和调度策略选择下一个要执行的进程。
    • 分配CPU:将选中的进程分配到CPU上,并将其状态设置为运行状态。
    • 执行进程:进程在CPU上执行其指令和数据。
    • 回收CPU:当进程执行完毕或需要被替换时,回收其占用的CPU资源。

进程上下文切换

进程上下文切换是操作系统内核在CPU上对于进程(包括线程)进行的一种活动,主要目的是在多个进程之间共享CPU资源。以下是进程上下文切换的几个关键点:

  1. 概念
    • 上下文切换可以认为是内核在CPU上对于进程进行的活动,包括挂起一个进程、存储其上下文信息、检索下一个进程的上下文信息、恢复其在CPU上的执行状态,并跳转到程序计数器所指向的位置以继续执行。
  2. 发生时机
    • 中断发生时:当发生中断(如硬件中断、软件中断)时,CPU会暂停当前执行的进程,并保存其上下文信息,然后跳转到中断处理程序执行。当中断处理完成后,CPU会恢复之前被挂起的进程的上下文信息,并继续执行。
    • 进程调度时:当需要进行进程调度时(如时间片用完、进程阻塞/唤醒等),操作系统内核会保存当前执行进程的上下文信息,并检索下一个要执行的进程的上下文信息,然后恢复其在CPU上的执行状态。
  3. 上下文信息
    • 上下文信息是指进程在被调度执行前的状态信息,包括程序计数器(PC)、栈指针、寄存器的值等。这些信息用于恢复进程的执行状态,以便进程可以从上次暂停的地方继续执行。上下文信息通常存储在PCB(进程控制块)中,以便操作系统可以快速获取和更新这些信息。
  4. 性能影响
    • 上下文切换是操作系统内核中的一项重要活动,但它也会带来一定的性能开销。频繁的上下文切换会增加CPU的负载和延迟,降低系统的整体性能。因此,在设计操作系统和应用程序时,需要合理控制上下文切换的频率和开销。
内核的其他主要功能

除了进程调度和进程上下文切换外,操作系统的内核还负责以下主要功能:

  • 硬件管理:管理计算机的硬件资源,如CPU、内存、I/O设备等。
  • BIOS接口:提供与BIOS(基本输入输出系统)的接口,以便操作系统能够访问计算机的底层硬件。
  • I/O管理:处理输入/输出操作,包括与外设的通信和数据传输。
  • 文件系统:管理磁盘上的文件和目录结构,提供文件的创建、读取、写入、删除等操作。
  • 驱动管理:管理各种设备驱动程序,

二、查询进程相关命令

*1.ps aux

    查看进程相关信息

        1.就绪态、运行态    R
        2.睡眠态、等待态    
            可唤醒等待态    S
            不可唤醒等待态    D
        3.停止态    T
        4.僵尸态    Z
        5.结束态    

  2.top

根据CPU占用率查看进程相关信息

 3.kill和killall发送一个信号

    kill -2 PID  15
    发送信号+PID对应的进程,默认接收者关闭

  
    killall -9 进程名
    发送信号 进程名对应的所有进程
    killall a.out

*4.fork();

   pid_t fork(); (叉子)
    一次调用,会返回两次。不需要传参数
    子进程先运行和是父进程先进程,顺序不确定。
    变量不共享。
    子进程复制父进程的0到3g空间和父进程内核中的PCB,但id号不同。
    功能:通过该函数可以从当前进程中克隆一个同名新进程。
          克隆的进程称为子进程,原有的进程称为 父进程。
          子进程是父进程的完全拷贝。
          子进程的执行过程是从fork函数之后执行。
          
          子进程与父进程具有相同的代码逻辑。

    返回值:int 类型的数字。
            在父进程中:成功 返回值是子进程的pid号 >0
                        失败 返回-1;
            在子进程中:成功 返回值 0
                        失败 无

练习:让2个while同时进行

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(int argc, const char *argv[])
{pid_t ret=fork();if(ret>0){while(1){printf("aaa\n");sleep(1);}}else if(ret==0){while(1){printf("ccc\n");sleep(1);}}else {perror("fork error\n");return 1;}return 0;
}

运行结果会出现   aaa  aaa  是因为:进程是随机的。

5.getpid

pid_t getpid(void);
    功能:
        获得调用该函数进程的pid
    参数:
        缺省
    返回值:
        进程的pid

       
   6.getppid

  pid_t getppid(void);
    功能:
        获得调用该函数进程的父进程pid号
    参数:
        缺省
    返回值:
        返回父进程id号
练习:

fork()&&fork()||fork()

几个进程?  五个  看最后一层有多少个进程

分析:fork()它返回值有两种情况,大于0,等于0,&&如果左边为1,右边执行,如果为0,右边不执行,|| 如果左边为1,右边不执行,如果左边为0,右边执行,按照这个思想去分析。

练习:动态生成n个子进程,并打印输出各自进程的pid号。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{int n =5;int i = 0 ;for(i=0;i<n;i++){pid_t pid = fork();if(pid>0){}else if(0 == pid){printf("child pid:%d\n",getpid());exit(0);}else {perror("fork");return 1;}}return 0;
}

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

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

相关文章

AUTOSAR_EXP_ARAComAPI.pdf的第4章笔记

4 Fundamentals 为了理解AUTOSAR_EXP_ARAComAPI.pdf的第4章内容&#xff0c;生搬硬套的翻译了一把&#xff0c;准备先囫囵吞枣&#xff0c;再仔细理解。因为这些内容的理解也不是一时半会儿的。所以先放上来。 AUTOSAR_EXP_ARAComAPI.pdf的概述 因此&#xff0c;ara::com不提…

VS2022 - 制作自己的C#类库dll,并输出Unity识别的pdb调试信息文件

然后编写库代码&#xff0c;设置dll生成目录 *** 输出unity可以识别的pdb调试信息文件 *** 右键项目-属性-生成-高级-调试信息&#xff1a;可移植(Portable PDB) 这是因为Unity只能识别MDB和Portable PDB文件 这样设置后&#xff0c;把dll和pdb文件放入到Unity中同文件夹下&…

002、架构_概览

GoldenDB 主要由管理节点、计算节点、数据节点、全局事务节点等模块组成&#xff0c;各个节点无需共享任何资源&#xff0c;均为独立自治的通用计算机节点&#xff0c;之间通过高速互联的 网络通讯&#xff0c;从而完成对应用数据请求的快速处理和响应。 管理节点在数据库中主要…

【JVM】剖析字符串与数组的底层实现(一)

剖析字符串与数组的底层实现 字符数组的存储方式 JVM有三种模型: 1.Oop模型:Java对象对应的C对象2.Klass模型:Java类在JVM对应的C对象3.handle模型 字符串常量池 即String Pool&#xff0c;但是JVM中对应的类是StringTable&#xff0c;底层实现是一个hashtable,如代码所示 …

三级_网络技术_42_综合题(命令)

一、 如图所示&#xff0c;某园区网用10Gbps的POS技术与intemet相连&#xff0c;POS接囗的帧格式是SDH。在R3上配置一个oopback接口&#xff0c;"P地址为10.2.15.1&#xff0c;路由协议的选择方案是&#xff0c;园区网内部采用OSPF动态路由协议&#xff0c;园区网与Inter…

如何使用ssm实现基于面向对象的学生事务处理系统分析与设计

TOC ssm138基于面向对象的学生事务处理系统分析与设计jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化…

go中 panicrecoverdefer机制

go的defer机制-CSDN博客 常见panic场景 数组或切片越界&#xff0c;例如 s : make([]int, 3); fmt.Println(s[5]) 会引发 panic: runtime error: index out of range空指针调用&#xff0c;例如 var p *Person; fmt.Println(p.Name) 会引发 panic: runtime error: invalid m…

AJAX(4)——XMLHttpRequest

XMLHttpRequest 定义&#xff1a;XMLHttpRequest(XHR)对象用于与服务器交互。通过XMLHttpRequest可以在不刷新页面的情况下请求特定URL&#xff0c;获取数据。这允许网页在不影响用于操作的情况下&#xff0c;更新页面的局部内容。XMLHttpRequest在AJAX编程中被大量使用 关系…

MATLAB 手动实现点云投影滤波器 (76)

点云投影到邻近的精确拟合平面,减少噪声点,此为投影滤波器 MATLAB 手动实现点云投影滤波器(76) 一、投影滤波器简介二、实现步骤二、算法实现1.代码2.效果这里用到的投影方法和平面拟合方法以及生成平面方法都在以往文章有所实现,有兴趣可参考: MATLAB点云处理总目录 一…

C++动态规划及九种背包问题

目录 目录 一&#xff0c;动态规划 一&#xff09;&#xff0c;动态规划的定义 二&#xff09;&#xff0c;动态规划其他的相关概念&#xff08;也是使用条件&#xff09; 1&#xff0c;重叠子问题 2&#xff0c; 最优子结构 3&#xff0c;无后效性 三&#xff09;&…

dompdf导出pdf中文乱码显示问号?、换行问题、设置图片大小

环境&#xff1a;PHP 8.0 框架&#xff1a;ThinkPHP 8 软件包&#xff1a;phpoffice/phpword 、dompdf/dompdf 看了很多教程&#xff08;包括GitHub的issue、stackoverflow&#xff09;都没有解决、最终找到解决问题的根本&#xff01; 背景&#xff1a;用Word模板做转PDF…

【JavaEE初阶】IP协议

目录 &#x1f4d5;引言 &#x1f334;IP协议的概念 &#x1f333;IP数据报 &#x1f6a9;IPv4协议头格式 &#x1f6a9;IPv6的诞生 &#x1f3c0;拓展 &#x1f384;IP地址 &#x1f6a9;IP地址的格式&#xff1a; &#x1f6a9;IP地址的分类 &#x1f3c0;网段划分…

【第57课】SSRF服务端请求Gopher伪协议无回显利用黑白盒挖掘业务功能点

免责声明 本文发布的工具和脚本&#xff0c;仅用作测试和学习研究&#xff0c;禁止用于商业用途&#xff0c;不能保证其合法性&#xff0c;准确性&#xff0c;完整性和有效性&#xff0c;请根据情况自行判断。 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利&#xff0…

Unity动画模块 之 Animator中一些常见参数

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 我发现我忘了写Animator了&#xff0c;正好有些不常用的参数还没怎么认识,笔记来源于唐老狮 1.状态窗口参数 2.连线参数…

如何使用ssm实现学生公寓管理系统的设计与实现

TOC ssm106学生公寓管理系统的设计与实现jsp 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;…

Qt第十八章 XML和Json格式解析

文章目录 JSON格式解析Json生成案例 XML简介与HTML的区别格式XML解析流的方式DOM XML生成 JSON与XML的区别比较 JSON 格式 JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名 六个构造字符 开始和结束数组&#xff1a;[ ]开始和结束对象&#x…

简易STL实现 | Vector的实现

1、内存管理 1、std::vector 维护了两个重要的状态信息&#xff1a;容量&#xff08;capacity&#xff1a;当前 vector 分配的内存空间大小&#xff09;和大小&#xff08;size&#xff1a; vector 当前包含的元素数量&#xff09; 2、当容量不足以容纳新元素时&#xff0c;s…

SSH 远程登录报错:kex_exchange_identification: Connection closed.....

一 问题起因 在公司,使用ssh登录远程服务器。有一天,mac终端提示:`kex_exchange_identification: Connection closed by remote host Connection closed by UNKNOWN port 65535`。 不知道为啥会出现这样的情形,最近这段时间登录都是正常的,不知道哪里抽风了,就提示这个。…

巴恩斯利蕨数学公式及源码实现——JavaScript版

为什么要写这篇文章 本篇接《张侦毅&#xff1a;巴恩斯利蕨数学公式及源码实现》。之前文章中源码的编程语言用的是Java&#xff0c;JDK的版本为8&#xff0c;现在我的JDK版本已经升级到22了&#xff0c;在新版本JDK中&#xff0c;原来的JApplet方法已经被废弃&#xff0c;不能…

鸿蒙实现在图片上进行标注

一.实现思路 现在需求是&#xff1a;后端会返回在这张图片上的相对位置&#xff0c;然后前端这边需要在图片上进行标注&#xff0c;就是画个框框圈起来&#xff0c;返回的数据里包括当前框的x,y坐标和图片大小&#xff0c;大体思路就是使用canvas绘制&#xff0c;使用鸿蒙的st…