操作系统:进程(一)

news2024/11/20 17:39:12

进程的基本概念

一般的解释是:进程是程序的一个执行实例,是正在执行的程序。我们写的程序编译后是一段二进制的文件。启动的时候加载到系统里面执行,就是以进程的形式执行。也就是说,我们编译后的可执行程序是一个静态的概念,加载到系统中以进程的方式执行,是一个动态的概念。
从系统的角度看:进程是系统资源(cpu 时间,内存)分配的最小实体单位。

进程ID(PID)

每一个进程都有唯一的一个非负整数的ID,这个ID就是PID(process iD)

  • Getpid() :返回当前进程的ID
  • Getppid() : 返回当前进程的父进程的ID。
#include <unistd.h>
#include <sys/types.h>
pid_t getpid(void);
pid_t getppid(void);

父进程和子进程

这里涉及到父进程和子进程的概念。为什么会有父进程和子进程?进程的创建并不像结构体或者类一样,new一下就可以创建出来。进程之前存在着继承的关系。进程B继承于进程A,那么进程A就是进程B的父进程。进程B就是进程A的子进程。
因为进程是系统资源的分配实体,所以进程里面会有很多的系统信息,进程相关的分配的内存,寄存器,数据,PCB等很多的域。如果我们自己创建会是一个很繁琐的过程。在早期的操作系统设计的时候,就会考虑如何方便的创建进程。一个比较方便的办法就是把已经存在的进程的各个域完全拷贝一份,然后再修改不同的地方,就形成了一个新的进程,这样的话,创建的进程和被创建的进程之间就存在继承的关系,也就是父子进程。
在linux操作系统启动的时候,系统会先创建一个Init进程,这个是整个系统中的第一个进程,然后再由这个init进程去创建后面的系统进程和用户进程。所以从这个角度看,一个系统中的所有进程都有一个共同的祖先就是init进程。
父进程和子进程之间不只是复制一份的关系。父进程还需要负责子进程的资源的回收。也就是子进程结束后,有很多资源如果没有人回收的话,一个是会造成资源的浪费,另一个是时间久了,会导致整个系统没有可用的资源了。当前也会存在父进程比子进程先结束的情况,这种时候,init进程就会变成子进程的父进程。对资源进行回收,不过这个时间就会比较长。所以在编程的时候,大家还是最好自己创建的进程在使用完后就行回收,避免资源浪费。

进程退出

  • exit(status)
    这个函数没有返回值,会通过参数指定返回状态,这个返回状态会被父进程接收到,父进程就可以做一些处理。
#include<stdlib.h>
void exit(int status);

如何创建和初始化进程

上面在讲父进程和子进程的时候也提到了,如果先创建一个空的数据结构,再填充每个数据域,工作量是非常大的。所以操作系统采用的方式是通过父进程复制的方式创建新的进程。内核init进程是所有进程的祖先,pid=1, 所以的进程最初都是由init进程复制的方式而来的。
下面是创建新进程的时候用到的两个函数:

  • fork()
    通过fork()函数来创建新的进程(子进程),也就是通过这个函数去执行从父进程到子进程的复制工作。
    这个函数比较特殊的地方是,调用一个,有两个返回结果。
    1. 父进程返回创建的子进程的PID
    2. 子进程返回0
  • exec(…)
    通过上面的函数单纯的进行复制,并没有太大的意义,更多的时候我们还是希望新的进程可以执行新的任务,所以需要exec()这个函数.参数传进来一个program,更换当前的code和data,然后执行传进来的program命令。
#include <unistd.h>
#include <sys/types.h>
//Returns: 0 to child, Pid of child to parent, -1 on error
pid_t fork(void);

需要注意的是通过fork()创建的新的子进程,几乎,但不是完全的与父进程相同。父进程和子进程有不同的PID。
子进程得到一份父进程用户层虚拟机地址空间的完全拷贝。同时也得到父进程已打开的文件描述符的完全拷贝,这意味着子进程可以直接读写父进程中已经打开的任何文件。
下面是一个简单的例子:

1 #include "csapp.h"
2 #include <unistd.h>
3 int main()
4 {
5 		pid_t pid;
6 		int x = 1;
7
8 		pid = fork();
9 		if (pid == 0) { /* child */
10 		   printf("child : x=%d\n", ++x);
11 		  exit(0);
12      }
13
14 	/* parent */
15 	printf("parent: x=%d\n", --x);
16 	exit(0);
17 }

第8行调用fork()函数时,进程就产生了分差,变成了一个父进程一个子进程同时在系统中运行,在父进程中,fork()函数返回子进程的pid, 在子进程中,fork()函数返回0,表示当前是子进程自己。由于x的定义是在fork()之前,所以在执行fork()的时候,x被复制了一份,一个属于子进程,一个属于父进程。
在第10行的打印,是子进程打印的,x为2;第15行为父进程打印的为0.也就是说从fork往后,父进程和子进程的数据就是独立的两份了,相互没有了关系。

再举例如下:

1 #include "csapp.h"
2
3 int main()
4 {
5 		Fork();
6 		Fork();
7 		printf("hello!\n");
8 		exit(0);
9 }

经过第5行的fork(),就会产生一对父子进程,两个进程继续向下走,到第6行,再次fork(),两个进程又分别创建一个子进程。如下图,到第七行打印的时候就有4个进程在打印。所以使用fork()创建进程是一种指数的增长。
在这里插入图片描述

进程的并行

在操作系统中进程是并行运行的,即使是父子进程,从创建出子进程的一刻开始,两个进程就开始并行运行了。所以基于上面的程序虽然会打印4次hello.但我们无法判断是哪个进程先打印,哪个进程后打印的。

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

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

相关文章

035、目标检测-物体和数据集

之——物体检测和数据集 目录 之——物体检测和数据集 杂谈 正文 1.目标检测 2.目标检测数据集 3.目标检测和边界框 4.目标检测数据集示例 杂谈 目标检测是计算机视觉中应用最为广泛的&#xff0c;之前所研究的图片分类等都需要基于目标检测完成。 在图像分类任务中&am…

python图

有向图&#xff1a;图中的每条边都有方向的图叫有向图。此时&#xff0c;边的两个顶点有次序关系&#xff0c;有向边 < u,v>成为从顶点u到顶点v的一条弧&#xff0c;u成为弧尾&#xff08;始点&#xff09;&#xff0c;v成为弧头&#xff08;终点&#xff09;&#xff0c…

rabbitmq默认交换机锁绑定的routingkey-待研究

例如这个是我的一个消息队列&#xff0c;它默认绑定的交换机是 什么类型呢? 看到这个图&#xff0c;感觉应该是一个默认的交换机&#xff0c;因为是default exchange 于是来到交换机来看看其他默认的交换机&#xff1a; 这里可以看到默认的交换机是direct&#xff08;应该没…

1.0 Zookeeper 教程

分类 Zookeeper 教程 ZooKeeper 是 Apache 软件基金会的一个软件项目&#xff0c;它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&…

Android resource/drawable转换成Uri,Kotlin

Android resource/drawable转换成Uri&#xff0c;Kotlin private fun convertResource2Uri(resId: Int): Uri {return Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE "://" resources.getResourcePackageName(resId) / resources.getResourceTypeName(resI…

、如何在企业签名、超级签名、tf签名之间做选择

企业签名 (Enterprise Signing): 用途&#xff1a; 适用于企业内部发布应用&#xff0c;不需要经过App Store审核&#xff0c;可以通过企业内部渠道直接分发给员工或内部用户。限制&#xff1a; 仅限于企业内部使用&#xff0c;无法在App Store上发布或向外部用户分发。 超级签…

python趣味编程-5分钟实现一个打字速度测试(含源码、步骤讲解)

Python速度打字测试是用 Python 编程语言编写的,速度打字测试 Python项目理念,我们将构建一个令人兴奋的项目,通过它您可以 检查 甚至 提高 您的打字速度。 为了创建图形用户界面(GUI),我们将使用 用于处理图形的pygame库。 Python 打字速度测试有利于学生或初学者提高…

生命科学领域 - FAIR原则和如果使数据FAIR化

2016年&#xff0c;《Scientific Data》发表了《科学数据管理和监督的FAIR指导原则》&#xff08;FAIR Guiding Principles for scientific data management and stewardship&#xff09;。文章旨在提供指导方针&#xff0c;以提高数字资产的可发现性、可访问性、互操作性和重用…

微信小程序会议OA首页-开发说明创建项目关于flex布局关于尺寸单位(rpx)关于WXS轮播图会议信息

目录 1. 创建项目 2. 关于flex布局 3. 关于尺寸单位&#xff08;rpx&#xff09; 4. 关于WXS 4. 轮播图 5. 会议信息 1. 创建项目 基于微信原生开发工具&#xff0c;稳定版 Stable Build (1.06.22010310) 创建项目前&#xff0c;请确定有小程序测试账号 使用向导创建一个…

ClickHouse建表优化

1. 数据类型 1.1 时间字段的类型 建表时能用数值型或日期时间型表示的字段就不要用字符串&#xff0c;全String类型在以Hive为中心的数仓建设中常见&#xff0c;但ClickHouse环境不应受此影响。 虽然ClickHouse底层将DateTime存储为时间戳Long类型&#xff0c;但不建议存储Long…

通过bat脚本控制Oracle服务启动停止

1、将Oracle服务全部设置为手动启动 初始安装Oracle之后服务启动状态&#xff1a; 2、服务功能介绍 3、构建服务启动/停止bat脚本 注意&#xff1a;编码选择ANSI(如果编码不是ANSI运行脚本会显示乱码) echo off :main cls echo 当前Oracle服务状态&#xff1a; for /f &quo…

Java中如何通过路径表达式找值:XPath和JsonPath以及SpEL详解及对比

大家好&#xff0c;我是G探险者。 我们编程时&#xff0c;在前后端数据交互和传输过程中&#xff0c;往往需要对报文中的某个字段或者某个标签的值进行解析读取&#xff0c;报文通常是以json或者xml作为数据交换格式&#xff0c;而json和xml这两种格式的报文结构都是具备一定的…

关于Android音效播放,【备忘】

主要还是希望开箱即用。所以才有了这篇&#xff0c;也是备忘。 以下代码适合Android5.0版本以后 private SoundPool soundPool;//特效播放private Map<String,Integer> soundPoolMap;// Builder buildernew SoundPool.Builder();builder.setMaxStreams(4);///最大…

springboot引入第三方jar包放到项目目录中,添加web.xml

参考博客&#xff1a;https://www.cnblogs.com/mask-xiexie/p/16086612.html https://zhuanlan.zhihu.com/p/587605618 1、在resources目录下新建lib文件夹&#xff0c;将jar包放到lib文件夹中 2、修改pom.xml文件 <dependency><groupId>com.lanren312</grou…

(Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序数据说明文档下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matalb…

3D全景视角,足不出户感知真实场景的魅力

近年来&#xff0c;随着科技的快速发展&#xff0c;普通的平面静态视角已经无法满足我们了&#xff0c;不管是视角框架的限制还是片面的环境展示&#xff0c;都不足以让我们深入了解场景环境。随着VR全景技术的日益成熟&#xff0c;3D全景技术的出现为我们提供了全新的视觉体验…

Thrift协议详解

前言特点高效性的体现可拓展性的体现 应用场景示例拓展其他常用协议接口描述语言&#xff08;IDL&#xff09;TBinaryProtocolTCompactProtocolTDebugProtocolTDenseProtocolTJSONProtocol 前言 Thrift协议是一种接口描述语言和二进制通讯协议&#xff0c;它被用来定义和创建跨…

基于传统Session的登录

前言&#xff1a; 本人的一些简历上要回答的点。所以再此整理。 亮点&#xff1a; 使用Filter过滤器进行未登录状态自动跳转到登录页面的拦截&#xff0c;实现统一的权限管理。 1 登陆功能 1.1实体类和结果类 前端页面 约定 res.data.code为1时是登录成功。 数据库的empl…

wangEditor富文本编辑器使用

一、官网 开源 Web 富文本编辑器&#xff0c;开箱即用&#xff0c;配置简单 二、下载安装 npm install --save wangeditor/editor-for-vue 三、在vue中使用 3.1、抽离组件editor.vue 在工程的components目录下新建组件editor <template><div><Toolbar:edi…

若依框架数据源切换为pg库

一 切换数据源 在ruoyi-admin项目里引入pg数据库驱动 <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version> </dependency>修改配置文件里的数据源为pg spring:d…