Linux | 进程概念详解:冯诺依曼体系结构、进程基本概念、PCB、进程组织、fork()创建子进程、进程运行逻辑

news2024/11/13 0:02:13

文章目录

  • 进程概念
    • 1、冯诺依曼体系结构
    • 2、进程
      • 2.1基本概念
      • 2.2描述进程-PCB
      • 2.3组织进程
      • 2.4查看进程
      • 2.5通过系统调用获取进程标识符
      • 2.6通过系统调用创建进程-fork初识
        • ==头文件与返回值==
        • fork函数的调用逻辑和底层逻辑

进程概念

1、冯诺依曼体系结构

目前我们认识的计算机中,都是由一个个硬件构成

  • 输入单元:键盘、鼠标、写字板等
  • 中央处理器(CPU):含有运算器和控制器等
  • 输出单元:显示器,打印机等

对于冯诺依曼一些结构,有以下几点注意:

  • 存储器指的是内存
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写, 不能访问外设
  • 外设(输入设备或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取
  • 总结就是:所有设备只能直接和内存打交道

总的来说,对冯诺依曼体系结构的理解,不能停留在概念上,要深入到对软件数据流的理解上,例如,解释从登陆上qq开始和某个好友聊天这个过程中数据的流动过程:

2、进程

2.1基本概念

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

2.2描述进程-PCB

进程信息被放在进程控制块(一个数据结构),叫做PCB,Linux操作系统下的PCB是task_struct
进程 = 内核数据结构(PCB) + 代码和数据

task_struct内容分类

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

2.3组织进程

可以在内核源代码里找到,所有运行系统里的进程都以task_struct链表的形式存在内核里

2.4查看进程

如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。

大多数进程信息同样可以使用top和ps这些用户级工具来获取

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.5通过系统调用获取进程标识符

  • 进程id(PID)
  • 父进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 	printf("pid: %d\n", getpid());
 	printf("ppid: %d\n", getppid());
 	return 0;
}

2.6通过系统调用创建进程-fork初识

  • 使用man手册运行man fork认识fork函数
  • fork有两个返回值
  • 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
头文件与返回值
  • 头文件:unistd.h

  • 函数原型:pid_t fork(void);

  • 父进程中,fork返回新创建子进程的进程ID

  • 子进程中,fork返回0

fork函数的调用逻辑和底层逻辑

在上文介绍PCB的时候有提到过,进程由内核数据结构和代码、数据两部分组成。因此每个进程都会有自己的PCB即task_struct结构体。当调用了fork函数后,系统创建子进程,即创建一个属于子进程的task_struct,将父进程的大部分属性拷贝过去(不在内的如pid、ppid),由于父子进程属于同一个程序,他们的代码是共用的,但是两个进程同时访问一个变量的时候会出现冲突问题,因此子进程会将它将要访问的数据做一份额外的拷贝,也就是子进程访问拷贝出来的数据,然后父子进程就有了属于各自的数据,对变量的操作也是独立的。

fork函数创建子进程过程

  • 创建子进程PCB
  • 填充PCB对应的内容属性
  • 让子进程和赴京城指向同样的代码
  • 父子进程都是有独立的task_struct,已经可以被CPU调度运行了

问:为什么fork函数调用完后会返回两个值,这和寻常的函数不是不一样么?

在fork函数中,创建子进程的步骤完成后,在return返回之前,父子进程已经可以被CPU调度运行了,也就是说,在return前fork函数执行了父子两个进程,return是作为父子进程的共有程序,他们都会各自返回一个值,因此整体看fork函数会返回两个值,分别属于调用fork函数中父子进程的返回值。

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
	int ret = fork();
 	printf("hello proc : %d!, ret: %d\n", getpid(), ret);
 	sleep(1);
 	return 0;
}
  • 由于父子进程的代码是一样的,因此如果需要使得父子进程执行不一样的代码,可以使用if加上返回值的条件限定来进行父子进程分流

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    int main()
    {
     	int ret = fork();
    	 if(ret < 0){
     		perror("fork");
    		return 1;
     }
     else if(ret == 0){ //child
     	printf("I am child : %d!, ret: %d\n", getpid(), ret);
     }else{ //father
     	printf("I am father : %d!, ret: %d\n", getpid(), ret);
     }
     return 0;
    }
    

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

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

相关文章

dm 到 dm 的 HS 同步部署

一、数据库部署 完成两节点数据库部署并初始化&#xff0c;配置参数如下&#xff1a; 节点 192.168.2.132 192.168.2.133 数据库版本 DM8 DM8 实例名 DM1 DM2 端口号 5236 5236 数据文件路径 /home/dmdba/dmdata /home/dmdba/dmdata 二、 dmhs 部署 1. 部署…

户外无线麦克风哪个牌子好,领夹麦克风十大品牌排行榜推荐

​为了在数字时代的浪潮中有效传达自己的思想和感情&#xff0c;选择合适的声音工具变得尤为重要。无线领夹麦克风就是这样一种工具&#xff0c;它能够帮助我们在任何环境下都保持最佳的语音传递效果。经过慎重考虑和市场调研&#xff0c;我为大家推荐几款性能卓越且价格合理的…

测试报告----功能测试

目录 一、项目背景 二、项目功能 &#xff08;1&#xff09;页面1&#xff1a;用户注册 &#xff08;2&#xff09;页面2&#xff1a;登陆页面 &#xff08;3&#xff09;页面3&#xff1a;信息主页 &#xff08;4&#xff09;页面4&#xff1a;详情页面 ​编辑&#xf…

获取当前路由器的外网IP(WAN IP)

GPT-4o (OpenAI) 获取当前路由器的外网IP&#xff08;WAN IP&#xff09;可以通过以下几种方法&#xff1a; 1. 访问路由器管理页面&#xff1a; - 通常路由器的管理页面可以通过在浏览器中输入路由器的IP地址来访问&#xff08;例如&#xff0c;192.168.0.1 或 192.168.1…

接口基础知识9:详解response body(响应体)

课程大纲 一、定义 HTTP响应体&#xff08;HTTP Response Body&#xff09;&#xff1a;服务器返回给客户端的数据部分&#xff0c;‌它包含了服务器对客户端请求的响应内容&#xff08;如客户端请求的资源、客户端请求的执行结果&#xff09;。 与请求类似&#xff0c;HTTP …

使用python实现3D聚类图

实验记录&#xff0c;在做XX得分预测的实验中&#xff0c;做了一个基于Python的3D聚类图&#xff0c;水平有限&#xff0c;仅供参考。 一、以实现三个类别聚类为例 代码&#xff1a; import pandas as pd import numpy as np from sklearn.decomposition import PCA from sk…

【Prometheus】监控系统

目录 一.Prometheus概述 1.Prometheus的认识与了解 2.Prometheus的特点 3.Prometheus存储引擎 TSDB 的特点优势 4.Prometheus 的生态组件 Prometheus server Client Library Exporters Service Discovery Alertmanager Pushgateway Grafana 5.Prometheus 的…

二叉树(四)

一、二叉树的性质 二、练习 1.某二叉树共有399个节点&#xff0c;其中有199个度为2的节点&#xff0c;则二叉树中的叶子节点数为&#xff08; &#xff09;。 A.不存在这样的树 B.200 C.198 D.199 答案&#xff1a;B 参考二叉树的性质第三条 2.在具有2…

如何将系统/数据/程序从一个硬盘驱动器迁移到另一个硬盘驱动器

何时需要硬盘迁移软件 大多数时候&#xff0c;计算机用户考虑迁移硬盘的原因是&#xff1a; 旧硬盘太小&#xff0c;无法存储不断增加的数据&#xff0c;您需要将这些数据转移到更大的硬盘上。 您购买了比当前硬盘更大更快的新硬盘&#xff0c;并且想要将程序和数据移动到新硬…

数据库分库分表的介绍

为什么要分库分表 把存于一个库的数据分散到多个库中&#xff0c;把存于一个表的数据分散到多个表中。如果说读写分离是为了分散数据库读写操作压力&#xff0c;分库分表就是为了分散存储压力&#xff0c;一般情况下&#xff0c;单表数据量到达千万级别&#xff0c;就可以考虑…

怎么才能真正学好网络安全?一文搞懂网络安全体系

文章目录 前言 网络安全研发具体干什么&#xff1f;二进制安全具体干什么&#xff1f;网络渗透具体干什么&#xff1f;网络渗透方向的工作有下面几个方向&#xff1a;网络安全的学习路线网络安全的学习路线大纲网络安全初体验学习方法 如何入门学习网络安全【黑客】 【----帮助…

suricata编译安装和运行

目录 编译安装 运行 调试 编译安装 apt -y install autoconf automake build-essential cargo \ libjansson-dev libpcap-dev libpcre2-dev libtool \ libyaml-dev make pkg-config rustc zlib1g-dev apt-get install libpcre3-dev wget https://www.openin…

Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

google浏览器chrome用户数据(拓展程序,书签等)丢失问题

一、问题背景 我出现这个情况的问题背景是&#xff1a;因为C盘块满了想清理一部分空间&#xff08;具体看这&#xff1a;windows -- C盘清理_c盘softwaredistribution-CSDN博客&#xff09;&#xff0c;于是找到了更改AppDatta这个方法&#xff0c;但因为&#xff0c;当时做迁移…

ZooKeeper 的四种 Znode (数据节点)类型

ZooKeeper 的四种 Znode &#xff08;数据节点&#xff09;类型 1. PERSISTENT&#xff08;持久节点&#xff09;2. EPHEMERAL&#xff08;临时节点&#xff09;3. PERSISTENT_SEQUENTIAL&#xff08;持久顺序节点&#xff09;4. EPHEMERAL_SEQUENTIAL&#xff08;临时顺序节点…

Zookeeper 如何保证事务的顺序一致性

Zookeeper 如何保证事务的顺序一致性 1、ZXID&#xff1a;唯一事务标识2、两阶段提交协议3、同步与复制 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Apache ZooKeeper 通过几个关键机制来确保事务的顺序一致性&#xff0c;这些机制包括全…

【正点原子K210连载】第三十一章 视频播放实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第三十一章 视频播放…

案例分析:多线程锁该如何优化?

我们在前面几篇中&#xff0c;了解到可以使用 ThreadLocal&#xff0c;来避免 SimpleDateFormat 在并发环境下引起的时间错乱问题。其实还有一种解决方式&#xff0c;就是通过对parse 方法进行加锁&#xff0c;也能保证日期处理类的正确运行 其实锁对性能的影响&#xff0c;是非…

.NET系列 定时器

net一共&#xff14;种定时器 System.Windows.Forms.Timer 类型 》》WinForm专用System.Windows.Threading.DispatcherTime类型》》WPF专用System.Threading.Timer类型》》》它使用 ThreadPool 线程来执行定时操作System.Timers.Timer类型 》》这种很老了。 它使用基于底层计时…

leetcode刷题-动态规划part02

代码随想录动态规划part02|62.不同路径 、63.不同路径II 、343. 整数拆分、 62.不同路径63.不同路径 II343. 整数拆分 再看本题思路并不容易想&#xff0c;一刷建议可以跳过。如果学有余力&#xff0c;可以看视频理解一波。 96.不同的二叉搜索树 跳过 62.不同路径 leetcode题目…