[Linux入门]---进程的概念

news2024/10/6 23:15:58

文章目录

  • 1.进程的概念
    • ①描述进程-PCB
    • ②task_struct-PCB的一种
    • ③task_ struct内容分类
  • 2.查看进程
  • 3.通过系统调用获取进程表示符
  • 4.通过系统调用创建进程---fork初识

1.进程的概念

在我们的电脑开机的时候,操作系统会被加载到内存中,点击多个应用进行时,那么将有多个应用的进程会被加载到内存中的操作系统上。说明一个操作系统不仅仅可以运行一个进程,而且可以运行多个进程!既然,有多个进程了,那么就需要将这些进程有条不紊地管理起来,那操作系统是如何管理进程的呢?先描述,在组织:任何一个进程加载到内存中形成真正的进程时,操作系统要创建描述进程的结构体对象;接下来便是将这些进程信息块组织起来,使用双链表的数据结构进行管理!
在这里插入图片描述
在很多人的理解中,一个加载到内存中的程序叫做进程,或者正在运行的程序叫做进程,其实这些都是片面的理解!假如你被复旦大学录取了,难道就可以说你是复旦大学的学生了吗?当然不是的!你被录取了表明你的档案信息已经被该大学收录了,而要想真正成为该大学的学生!到开学的时候,你要拿着录取通知书到复旦大学入学报到,这个时候你才真正成为了复旦大学的学生!同理,进程应该包括描述进程的信息和需要处理的代码和数据!

①描述进程-PCB

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
  • 进程=内核PCB数据结构对象+自己的数据和代码

②task_struct-PCB的一种

  • Linux中描述进程的结构体叫做task_struct
  • 课本上称之为PCB(process control block)Linux操作系统下的PCBtask_struct

③task_ struct内容分类

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

2.查看进程

  • PID为子进程标志,相当于学生的学号。
  • 进程的信息可以通过 /proc 系统文件夹查看
    输入ls /proc/指令,可以看到不同PID的文件
    在这里插入图片描述+ 大多数进程信息同样可以使用top和ps这些用户级工具来获取

创建myprocess.c文件,如下:

#include<stdio.h>                                                                                                                                                    
#include<unistd.h>    
int main()    
{    
    while(1)    
    {    
        printf("我是一个进程....\n");    
        sleep(1);    
    }    
    return 0;    
} 

创建自动化构建文件Makefile文件,如下:

myprocess:myprocess.c                                                                                                                                                
    gcc -o $@ $^    
.PHONY:clean    
clean:    
    rm -rf myprocess   

Xshell代码运行的结果如下:
在这里插入图片描述
在另一个窗口输入如下指令:

$ ps ajx | head &&ps ajx | grep myprocess//获取含myprocess的进程PID

指令运行的结果如下:
在这里插入图片描述

./myprocess为正在运行的可执行程序,grep --color=auto myprocess为刚才我们运行的获取PID指令中包含了myprocess,说明输入的指令在系统中变成了进程运行

可以使用如下指令过滤掉grep myprocess进程:

$ ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep

关闭进程的指令:

$ ps -9 进程的PID//杀进程

查看进程文件:
在这里插入图片描述

$ ls /proc/4356/ -l //获取PID为4356的进程文件详细信息

进程文件详细信息部分截图如下:
在这里插入图片描述

3.通过系统调用获取进程表示符

在前面操作系统的学习中,操作系统通过数据结构将描述的进程信息组织起来管理,我们作为普通用户很难和操作系统打交道,所以不能直接获取当前进程PID;但是可以通过操作系统上层封装的系统调用接口,获取PCB结构描述的信息,接下来让我们认识两个系统调用接口:

getpid():获取子进程PID的信息。
getppid():获取父进程PPID的信息。
在这里插入图片描述

创建proc.c文件,写入如下代码:

#include<stdio.h>    
#include<sys/types.h>    
#include<unistd.h>    
int main()    
{    
  printf("我是一个子进程,pid为:%d\n",getpid());    
  printf("我是一个父进程,ppid为:%d\n",getppid());    
    return 0;                                                                                             
}  

代码运行的结果为:
在这里插入图片描述

重新运行./proc文件,其子进程一直在变(比如某学生高考失利进入复旦大学时,他可以获得一个学号,当他第二年复读再次考入复旦大学时,他又获得一个学号,而这两个学号是不同的),而父进程一直都不变。

$ ps ajx | head -1 && ps ajx | grep 3216 //父进程

在这里插入图片描述

父进程ppidbash命令行进程,给我们输入指令的!

4.通过系统调用创建进程—fork初识

使用man指令,查找fork函数的信息
在这里插入图片描述
解释:

fork函数创建一个新的进程,让当前的父进程返回当前的子进程,创建新的子进程返回0。

eg1:

#include<stdio.h>    
#include<sys/types.h>    
#include<unistd.h>    
     
int main()    
{    
    printf("我是使用fork()之前的语句\n");    
    pid_t ret=fork();    
    printf("我是使用fork()之后的语句\n");    
    return 0;    
}  

代码运行的结果为:
在这里插入图片描述

可以发现fork()函数创建新的子进程,当前的进程执行了printf语句,创建的进程执行了一遍的printf语句,所以fork()后面的语句被执行两遍。

eg2:

#include<stdio.h>    
#include<sys/types.h>    
#include<unistd.h>        
int main()    
{    
   printf("begin: 我是一个进程,pid:%d,ppid:%d\n",getpid(),getppid());    
   pid_t ret=fork();    
   if(ret==0)    
   {    
       while(1)    
       {    
           printf("我是子进程,pid:%d,ppid:%d\n",getpid(),getppid());    
           sleep(1);                                                                                                                                                
       }    
   }    
   else if(ret>0)    
   {    
       while(1)    
       {    
           printf("我是父进程,pid:%d,ppid:%d\n",getpid(),getpid());    
           sleep(1);    
       }    
   }    
   return 0;    
}    

代码运行的结果为:
在这里插入图片描述
指令:

while :; do ps ajx | head -1 ; ps ajx | grep proc |grep -v grep;sleep 1;done

在另一个窗口执行该指令:
在这里插入图片描述

使用fork函数创建新的进程,使用if语句,根据父进程返回当前的子进程(返回的值大于0),旧的子进程返回0,实现分流执行不同的代码。

问题1:为什么fork函数返回子进程,父进程返回当前的子进程?

一般而言fork函数之后的代码,父子进程共享;返回不同的值,让不同的执行流,执行不同的代码!

问题2:fork函数如何做到返回两次?

①创建子进程PCB;②填充PCB的内容;③让父子进程共享同一份代码;④父子进程的task_struct,可以被CPU调用…最后执行return语句返回,return语句之前fork函数的主要工作已经完成了(即创建新的子进程),所以return语句为父子进程共享的语句,所以父进程返回一次,子进程返回一次。

问题3:fork干了什么事?

进程之间是不会相互影响,相互独立:①fork创建了子进程,子进程依据父进程为模板PCB模板创建自己的PCB,指向父进程的代码;②那指向的数据是否相同呢?子进程和父进程刚开始指向的数据相同,当操作系统检测到子进程要修改数据时会开空间,会发生写时拷贝,但不是把父进程的数据全部拷贝,子进程只会拷贝自己能使用的数据,避免造成资源浪费。
在这里插入图片描述

问题4:一个变量怎么会有不同的内容?

我们已经知道了fork函数可以返回两次,并且同一个变量可以接收两次不同的值(即访问不同的内存)!那是怎么做到一块地址空间是怎么接收呢?我们后面再进行学习🎉🎉🎉

问题5:如果父子进程被创建好,fork往后,哪个进程被先运行呢?

哪个进程先运行,是由调度器(挑选进程)决定的,我们是不能确定的!

问题6:执行不同命令时子进程不同,但这些子进程的父进程都为bash进程,为什么呢?

bash内部也是通过fork函数创建子进程的,bash进程执行接收新的命令、打印出命令行提示符等任务,而bash创建的子进程执行解释新的命令,所以我们当前运行的所有的命令都是bash的进程。

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

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

相关文章

【校招VIP】前端js语言考点之ES6

考点介绍&#xff1a; es6就是es5的升级版&#xff0c;es5是js的通用标准&#xff0c;绝大多数浏览器都支持其语法&#xff0c;但是es6则不同&#xff0c;如果es6的代码需要在浏览器上运行&#xff0c;那就先将es6转换为es5。如果在es6中使用模块化机制&#xff0c;需要将个模块…

OAuth2.0客户端基于oltu搭建

之前提到了cas-server这个项目其本身是支持OAuth2.0协议的,因此我们可以简单搭建一个OAuth客户端,本次使用到的是Apache的oltu oltu介绍 Apache Oltu 是一个开源的 OAuth 库&#xff0c;用于帮助开发者实现 OAuth 1.0 和 OAuth 2.0 协议。OAuth 是一种用于授权和认证的协议&a…

Learn Prompt- Midjourney 图片生成:Image Prompts

Prompt 自动生成 前不久&#xff0c;Midjourney 宣布支持图片转 prompt 功能。 原始图片​ blueprint holographic design of futuristic Midlibrary --v 5Prompt 生成​ 直接输入 /describe 指令通过弹出窗口上传图像并发送&#xff0c;Midjourney 会根据该图像生成四种可…

图片无损放大在线工具分享

在论文写作过程中 忘了将图片保存330dpi怎么办&#xff1f;截图的图片放论文&#xff0c;十分模糊怎么办&#xff1f; 图片模糊、不清晰转高清的神器 【传送门】 推荐理由:无广告、速度快、在线版&#xff0c;随时用。

数据结构之【泛型】

泛型&#xff1a;定义阶段不明确具体类型&#xff0c;产生对象时明确具体类型。 //Object是Java中的最高参数统一化&#xff0c;能够接受所有的引用类型&#xff1b; //有了包装类的自动拆装箱之后&#xff0c;Object还能够接收基本类型数值&#xff08;自动装箱&#xff09; …

前端JavaScript中的 == 和 ===区别,以及他们的应用场景,快来看看吧,积累一点知识。

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、等于操作符 二、全等操作符 三、区别 小结 一、等于操作符 等于操作符用两个等于号&#xff08; &am…

基于微信小程序的校园餐饮配送系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言学生微信小程序端的主要功能有&#xff1a;配送员微信小程序端的主要功能有&#xff1a;商家微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&am…

单调栈和单调队列可以很简单

大家好&#xff0c;我是 方圆。我觉得单调栈和单调队列的题目很有特点&#xff0c;而且理解了它的特点能够很轻松容易地解决一系列题目&#xff0c;所以决定用这篇帖子记录一下&#xff0c;也想以此来帮助在刷同样类型题目的朋友们。如果大家想要找刷题路线的话&#xff0c;可以…

每日一题~组合总数III

原题链接&#xff1a;216. 组合总和 III - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 思路分析&#xff1a; 这是一个组合的问题&#xff0c;所以我们可以使用深度优先搜索&#xff08;DFS&#xff09;的方式将所有的情况都列举出来&#xff0c;然后将其中…

企业怎么申请OV SSL证书?

随着互联网的发展&#xff0c;越来越多的企业开始使用SSL证书来保护网站的安全。而OV SSL证书作为机构验证型的证书&#xff0c;能够重点强调网站安全、企业可信形象的网站&#xff0c;保密传输更加安全。那么&#xff0c;企业怎么申请OV SSL证书呢&#xff1f;接下来&#xff…

计算机视觉与深度学习-经典网络解析-GoogLeNet-[北邮鲁鹏]

这里写目录标题 GoogLeNet参考GoogLeNet模型结构创新点Inception结构&#xff0c;它能保留输入信号中的更多特征信息去掉了AlexNet的前两个全连接层&#xff0c;并采用了平均池化引入了辅助分类器 GoogLeNet GoogLeNet的设计主要特点是引入了Inception模块&#xff0c;这是一种…

聚观早报 | 杭州亚运开幕科技感拉满;腾讯官宣启动「青云计划」

【聚观365】9月25日消息 杭州亚运开幕科技感拉满 腾讯官宣启动「青云计划」 FF任命新全球CEO 比亚迪夺得多国销冠 iPhone 15/15 Pro销售低于预期 杭州亚运开幕科技感拉满 杭州第19届亚洲运动会开幕式23日晚在杭州奥体中心主体育馆举行&#xff0c;这届开幕式可谓科技感拉…

【linux进程(一)】深入理解进程概念--什么是进程?PCB的底层是什么?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux进程 1. 前言2. PCB初认…

Java基本数据类型只有八种?第九种告诉你

一、前言 今天看了一下Oracle官网的JVM规范&#xff0c;发现基本数据不止有八种。 这个东西一直都是说着八种&#xff0c;官网把returnAddress放在八种基本数据类型一起说的&#xff0c;我们可以理解为第九种&#xff01; 常说的八种用于存储常见的数值和字符数据&#xff0…

计算机等级考试—信息安全三级真题六

目录 一、单选题 二、填空题 三、综合题 一、单选题

阿里云ESS弹性伸缩核心概念与基本使用

文章目录 1.ESS弹性伸缩基本概念1.1.弹性伸缩概念1.2.弹性伸缩应用场景1.3.弹性伸缩的应用模式 2.开通ESS弹性伸缩服务3.为KodCloud云盘集群创建弹性伸缩组3.1.创建伸缩组3.2.设置伸缩组的名称、类型、移除策略、健康检查3.3.设置组内实例数、冷却时间、网络类型、扩缩容策略、…

python循环判断

运算符短路逻辑python优先级 思维导图for循环 运算符 运算符含义and左边和右边同时为True,结果为Trueor左右两边其中一个为True,结果为Truenot如果操作数为True(False)&#xff0c;结果为False(True) 短路逻辑 从左到右&#xff0c;只有当第一操作数的值无法确定逻辑运算的结…

电脑开机慢怎么办?这样解决快速且有效!

“明明电脑用了才没多久&#xff0c;为什么开机那么慢呀&#xff1f;经常开个机需要好几分钟&#xff0c;这很耽误我的工作&#xff0c;请问有什么方法可以解决这个问题吗&#xff1f;” 电脑是现代生活不可或缺的工具&#xff0c;然而&#xff0c;当我们面对电脑开机缓慢的问题…

3D目标检测实战 | 图解KITTI数据集与数据格式

目录 1 数据集简介2 传感器坐标系3 数据集下载与组织4 数据内容说明4.1 矫正文件calib4.2 图像文件image4.3 点云文件velodyne4.4 标签文件label4.5 平面文件plane 1 数据集简介 KITTI数据集是一个广泛应用于自动驾驶和计算机视觉领域的公开数据集。该数据集由德国卡尔斯鲁厄理…

shell脚本自动化执行jar包

需要用shell脚本来自动化执行jar包&#xff0c;以后可以用jenkins来CI/CD&#xff0c;记录一下对应实现。 实现需求 以命令行执行shell传入的第一个参数为jar名进行执行。对应jar已存在执行进程&#xff0c;关闭对应进程后再执行。以后台方式执行对应的jar包&#xff0c;输出…