Linux系统编程·进程概念

news2024/11/27 6:20:16

在这里插入图片描述

你好,我是安然无虞。

文章目录

  • 自学网站
  • 上文回顾
    • 进程控制块—PCB
  • 查看进程
  • 初识系统调用
  • 初始fork函数
  • 练习题

自学网站

推荐给老铁们两款学习网站:
面试利器&算法学习:牛客网
风趣幽默的学人工智能:人工智能学习
首个付费专栏:《C++入门核心技术》

上文回顾

下面我们对于上篇文章重点部分进行回顾:
在这里插入图片描述
进程就是可执行程序+该进程所对应的内核数据结构

进程控制块—PCB

前面我们说到:
进程 = 可执行程序 + 该进程所对应的内核数据结构。
那“进程所对应的内核数据结构”是啥呢?
进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
很多时候我们称其为PCB,而我们现在所学习的Linux操作系统,它的PCB叫做 task_struct
(可以这样想:PCB是汽车,而Linux中具体的PCB——task_struct是宝马)
程序是文件吗?是的,而文件在磁盘中。
操作系统中可能存在大量进程,操作系统要不要将所有的进程管理起来呢?当然要,对进程的管理,本质是对进程数据的管理,所以本质也就是对进程的内核数据结构的管理
这就好像我们前面说的那个学生的例子,所以为什么管理进程要有PCB呢?
先描述,再组织。(其实这也就解释了为什么说我们之前在实现数据结构的时候,总是先定义一个结构体)
比如定义顺序表:

typedef int SLTDataType;
struct SeqList
{
	SLTDataType* a;
	size_t size;
	size_t capacity;
}

task_struct 的内容分类:

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

写到这,可能有老铁会问,进程这块我们学习什么呢?我们学的就是进程控制块里的属性,就是上面所列出来的内容,大家在这里简单了解知道即可,后面会一一详细说明。

查看进程

注意哦, 我们经常使用的指令, 像ls, touch…这些指令在启动之后本质上也是进程.
好的, 那么我们怎么查看进程呢?
看下面一段程序:

#include<stdio.h>

int main()
{
    while(1)
        printf("Hello Linux.\n");
    
    return 0;
}

方式一: ps axj(最常用)
在这里插入图片描述
方式二: 通过 proc 查看
在这里插入图片描述
注意: proc 是内存文件系统, 存放着当前系统的实时进程信息. 每一个进程在系统中, 都会存在一个唯一的标识符(pid -> process id), 就如同学生在学校里有一个专门的学号一样.

我们经常会听到当前路径, 何为当前路径呢?
当前路径就是当前进程所在的路径, 进程自己会维护.
那么 pid 和当前路径这些都在哪里呢? 它们属于进程的内部属性, 在进程的进程控制块当中, 也就是PCB(task_struct)结构中.

初识系统调用

下面我们来使用第一个系统接口, 通过系统调用获取进程标识符.
看下面一段程序:

#include<stdio.h>
#include<unistd.h>

int main()
{
    printf("pid : %d\n", getpid());//系统接口
    printf("ppid: %d\n", getppid());
    return 0;
}

执行程序:
在这里插入图片描述
再次执行程序:
在这里插入图片描述
请老铁对比这两次这行结果, 有什么不同吗? 我们发现 pid 是变化的, 但是 ppid 没有发生变化, 诶呀, 这是什么意思? 所以,这也就引入了下面的一个问题: 创建进程有很多方法, 如 ./你的程序(./myProcess), 每次执行./myProcess 时, 进程 pid 发生变化, 但是父进程 ppid 不变, 那为什么 ppid 不变, 父进程是谁呢? 几乎我们在命令行上执行的所有指令(包括你的 cmd), 都是bash进程的子进程.

初始fork函数

认识 fork 函数:在这里插入图片描述
返回值:
在这里插入图片描述
看下面一段程序:

#include<stdio.h>
#include<unistd.h>

int main()
{
    int ret = fork();
    printf("hello proc\n");
    sleep(1);
    
    return 0;
}

运行程序:
在这里插入图片描述
什么情况, 为什么会打印两次呢?

fork 函数很特殊, 它的作用就是创建子进程, 它有两个返回值, 给父进程返回子进程的 pid, 给子进程返回0.
父子进程代码共享, 数据按照写时拷贝的方式来共享或独立.

肯定有老铁会疑惑, 为什么 fork 会给父进程返回子进程的 pid, 给子进程返回0呢?
因为父进程必须要有标识子进程的方案, fork 之后, 给父进程返回子进程的 pid; 而我们的子进程最重要的是要知道自己被创建成功了, 因为子进程找父进程的成本非常低, 直接调用 getppid() 即可.

看下面一段程序:

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

int main()
{
    pid_t id = fork();//返回值id==0,子进程; >0,父进程
    if(id == 0)
    {
        //子进程
        while(1)
        {
            printf("我是子进程, 我的pid : %d, 我的父进程 : %d\n", getpid(), getppid());
            sleep(1);
        }
    }
    else
    {
        //父进程
        while(1)
        {
            printf("我是父进程, 我的pid : %d, 我的父进程 : %d\n", getpid(), getppid());
            sleep(1);
        }
    }

    return 0;
}

在这里插入图片描述
我们之前在学习C语言的时候, if 和 else 可以同时执行吗? 我们知道是不可以的, 那在我们的C语言中有没有可能两个以上的死循环同时运行, 这也是不可能的.
但是在上面的代码中却可以!
fork 之后, 父进程和子进程会共享代码, 一般都会执行后续的代码, 所以这也就解释了为什么会打印两次, fork 之后, 父子进程的返回值不同, 可以通过不同的返回值进行判断, 让父子进程执行不同的代码块.

为什么 fork 会返回两次, 有两个返回值?
fork 之后, 操作系统做了什么?
OS多了一个进程(子进程).

task_struct + 进程的代码和数据
task_struct + 子进程的代码和数据

子进程的 task_struct 对象内部的数据从哪里来呢? 基本是从父进程那里继承(拷贝)下来的.

子进程执行代码, 计算数据的, 子进程的代码从哪里来呢? 和父进程执行同样的代码, fork 之后, 父子进程代码共享(不同的返回值, 让不同的进程执行不同的代码块), 而数据会按照写时拷贝的方式来共享或独立.

练习题

1.下面关于系统调用的描述中,错误的是()
A.系统调用把应用程序的请求传输给系统内核执行
B.系统调用函数的执行过程应该是在用户态
C.利用系统调用能够得到操作系统提供的多种服务
D.是操作系统提供给编程人员的接口
E.系统调用给用户屏蔽了设备访问的细节
F.系统调用保护了一些只能在内核模式执行的操作指令

解析:
系统调用是操作系统向上层提供的用于访问内核特定功能的接口。应用程序通过系统调用将自己需要完成的功能传递给内核,进行执行完成;
系统调用的运行过程是在内核态完成的,操作系统并不允许用户直接访问内核,也就是说用户运行态并不满足访问内核的权限;
用户只需要将自己的请求以及数据通过系统调用接口传递给内核,内核中完成对应的设备访问过程,最终返回结果;
系统向上层提供系统调用接口用于访问内核服务或功能的很大原因也是因为这样可以最大限度的保护内核的稳定运行。

2.下列有关进程的说法中,错误的是? [多选]
A.进程与程序是一一对应的
B.进程与作业是一一对应的
C.进程是静态的
D.进程是动态的过程

解析:
程序是静态的指令集合,保存在程序文件中, 进程是程序的一次运行过程中的描述。

作业是用户需要计算机完成的某项任务,是要求计算机所做工作的集合

一个程序可以同时运行多次,也就有了多个进程;
一个作业任务的完成可由多个进程组成,且必须至少由一个进程组成;
程序是静态的,而进程是动态的

3.系统感知进程的唯一实体是()
A.进程id
B.进程控制块
C.进程管理器
D.进程名

解析:
进程是操作系统对于程序运行过程的描述,而这个描述学名叫做进程控制块-PCB,它是操作系统操作系统管理以及调度控制程序运行的唯一实体

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

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

相关文章

添加滚动彩色提醒通知公告代码

分享一个动态的滚动多样化的彩色提醒通知公告&#xff0c;代码是自适应的&#xff0c;放在很多地方都可以用&#xff0c;在wordpress、emlog等建站cms中&#xff0c;都可以在自定义侧边栏中&#xff0c;用来网站、博客的美化也是非常不错的选择。 使用说明: wordpress&#xff…

网络编程04-UDP的广播、组播

目录 一、UDP广播通信 1、什么是广播 2、特点 3、广播地址 4、实现广播的过程&#xff08;一定是使用UDP协议&#xff09; 广播发送端 广播接收方 练习1&#xff1a; 把广播通信进行实现 发送端 接收端 二、UDP组播&#xff08;群聊&#xff09; 1、概念 2、组播特…

(最新版2022版)剑指offer之动态规划题解

&#xff08;最新版2022版&#xff09;剑指offer之动态规划题解[剑指 Offer 42. 连续子数组的最大和][剑指 Offer 47. 礼物的最大价值][剑指 Offer 46. 把数字翻译成字符串][剑指 Offer 48. 最长不含重复字符的子字符][剑指 Offer 48. 矩形覆盖][剑指 Offer 买卖股票的最好时机…

小侃设计模式(五)-建造者模式与模板方法模式

1.概述 建造者模式&#xff08;Builder Pattern&#xff09;又叫生成器模式&#xff0c;是一种对象构建模式&#xff0c;它可以将复杂对象的建造过程抽象出来&#xff08;抽象类别&#xff09;&#xff0c;这个抽象过程的不同实现方法可以构造出不同表现&#xff08;属性&…

家庭主妇问题

一 问题描述 X 村的人们住在美丽的小屋里。若两个小屋通过双向道路连接&#xff0c;则可以说这两个小屋直接相连。X 村非常特别&#xff0c;可以从任意小屋到达任意其他小屋&#xff0c;每两个小屋之间的路线都是唯一的。温迪的孩子喜欢去找其他孩子玩&#xff0c;然后打电话给…

C++中TCP socket传输文件

在两个文件中都定义文件头和用到的宏&#xff1a; #define MAX_SIZE 10 #define ONE_PAGE 4096 struct FileHead {char str[260];int size; }; 在客户端发送接收阶段&#xff1a; //1.发送文件头char path[260] {0};cout<<"请输入文件路径"<<endl;cin…

数字图像处理MATLAB

数字图像处理MATLAB 基&#xff08;本&#xff09;操&#xff08;作&#xff09; 图片读取 Aimread(test.bmp); imshow(A);2. 图像写入 Aimread(test.bmp); imwrite(A,test-bak.bmp); Bimread(test-bak.bmp); imshow(B);3. 图像文件信息查询 infoimfinfo(test.bmp);4. 显示…

【创建型】生成器模式(Builder)

目录生成器模式(Builder)适用场景生成器模式实例代码&#xff08;Java&#xff09;生成器模式(Builder) 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 适用场景 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方…

【SpringBoot笔记22】SpringBoot框架集成Redis数据库

这篇文章&#xff0c;主要介绍SpringBoot框架如何集成Redis数据库。 目录 一、SpringBoot集成Redis 1.1、引入依赖 1.2、配置redis连接信息 1.3、添加RedisTemplate配置类 1.4、编写测试类 1.5、运行测试 一、SpringBoot集成Redis Redis是一个非关系型数据库&#xff0c…

PCIe ECAM机制访问PCIE的配置空间

1.PCIe ECAM机制 PCI Express Enhanced Configuration Access Mechanism (ECAM)是访问PCIe配置空间的一种机制。是将PCIe的配置空间映射到MEM空间&#xff0c;使用MEM访问其配置空间的一种实现。可参考NCB-PCI_Express_Base_5.0r1.0-2019-05-22.pdf的第7.2.2小节。 其地址映射…

上海亚商投顾:沪指录得6连阳 两市成交再度破万亿

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日横盘震荡&#xff0c;收盘集体小幅上扬&#xff0c;日K线均录得6连阳。虚拟现实概念股集体拉升&#…

【SA-Token】授权 鉴权中心微服务

授权 鉴权中心微服务 1 什么是JWT 1.2 JWT 的基本概念 1.3 JSON Web Token jwt 是一个开放标准 它定义了一种紧凑的、自包含的方式 用于作为JSON 对象在各方之间安全地传输信息 1.4.那些场景下可以考虑使用JWT &#xff1f; ​ 1.用户授权 信息交换 1.5 JWT的结构及其含义 …

镜频抑制滤波器对射频接收前端输出噪声的影响

射频接收前端包括LNA、Filter、Mixer等部件&#xff0c;从噪声因子级联的角度讲&#xff0c;希望接收链路第一级为高增益、低噪声系数放大器&#xff0c;以期望得到较低的系统噪声系数&#xff0c;提高接收灵敏度。除LNA外&#xff0c;接收链路还有一个关键的部件——镜频抑制滤…

精读大型网站架构:前端架构模块化的方法及困境,自研框架Trick

模块化的方法 网页和网页之间有很多相似或者相同的模块&#xff0c;模块化就是把这些模块抽离并独立管理。而模块化的方法&#xff0c;就是把模块的HTML、CSS和JavaScript文件独立出来&#xff0c;然后通过某种方法关联到使用这些模块的网页上。 在介绍模块化的具体方法之前&…

consul--基础--05--api

consul–基础–05–api 1、介绍 主要接口是RESTful HTTP API&#xff0c;该API可以用来增删查改nodes、services、checks、configguration。所有的endpoints主要分为以下类别 kv&#xff1a;Key/Value存储agent&#xff1a;Agent控制catalog&#xff1a;管理nodes和serviceshe…

数据结构-例题实训作业-二叉树相关

第1关:以先序的方式建立二叉树 任务描述 本关任务:以先序的方式建立二叉树并显示(顺时针90度后看) 相关知识 为了完成本关任务,你需要掌握: 1.二叉树的概念 2.二叉树的先序遍历方式 3.二叉树的遍历。 编程要求 在以下空白处补写代码,以先序方式完成二叉树的建立。 //…

计算机组成原理浮点数表示

浮点数表示 浮点数的表示分为阶码和尾数&#xff1b; 比如3.026*1011;阶码是11;尾数是3.026&#xff1b; 对于阶码&#xff1a; 阶符为正&#xff0c;小数点向后移n位&#xff08;n表示阶的大小&#xff09;; 阶符为负&#xff0c;小数点向前移n位&#xff08;n表示阶的大小&a…

基础IO(上)——Linux

文章目录1.储备知识2. 文件描述符2.1 c接口2.2 直接使用系统接口2.3 open函数返回值2.4 文件描述符fd2.5 周边文件3. 重定向3.1 输出重定向3.2 输出重定向3.3 追加重定向3.4 dup4. 如何理解一切皆文件&#xff1f;1.储备知识 对文件的操作范畴&#xff1a; 在系统角度理解文件 …

R语言生物群落数据统计分析

R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂&#xff0c;涉及众多统计分析方法。本教学以生物群落数据分析中的最常用的统计方法回归和混合效应模型、多元统计分析技术及结构方程等数量分析方法为主线&#xff0c;通过多个来…

中医-通过舌象判断身体状况

本文分享通过舌象判断身体的整体状况&#xff08;中医角度&#xff09;&#xff0c;得出一个可供辨证的参考&#xff0c;并且可以根据舌象做出相关的饮食调整&#xff0c;本文主讲理论&#xff0c;相关舌象图片易引人不适&#xff0c;如需找相关图片&#xff0c;可根据本文中的…