Linux的学习之路:12、地址空间(续)与进程的创建、终止和等待

摘要

本章将讲述上章没说的一些东西以及进程创建终止与等待

目录

摘要

一、地址空间(续)

二、创建

三、终止

四、等待

五、思维导图


一、地址空间(续)

上篇文章中介绍了地址空间,但是没有说为什么会有地址空间,那么为什为会有地址空间呢?

这里我是总结了三点:

1、凡是非法的访问或者映射,OS都会识别到,并终止你这个进程,那么有效的保护了物理内存吗?

因为地址空间和页表是OS创建并维护的,是不是也就意味着凡是想使用地址空间和页表进行映射,也一定要在OS的监管之下看来进行访问,也便保护了物理内存中的所有的合法数据包括各个进程以及内核相关的有效数据

2、因为有地址空间的存在,因为有页表的映射的存在我们的物理内存中,是哦不是可以对未来的数据进行任意位置的加载呢?

当然可以,物理内存的分配就可以和进程的管理,就可以做到没有关系,内存管理模块和进程管理模块就完成了解耦合,所以我们在c、c++的语言上new、malloc空间的时候,本质上是在哪申请的呢?答案是虚拟空间

这时又出现一个问题如果我申请了物理空间,但是如果我不立马使用,是不是造成空间的浪费?

答案是确实浪费了,因为有地址空间的存在,所以上层申请空间,其实是在地址空间上申请的,物理内存可以甚至一个字节都不给你,而当你真正进行堆物理地址空间的访问的时候,才执行内存相关管理,帮你申请内存,构建页表的映射关系,然后在进行内存访问。

3、因为在物理内存中理论上可以在任意位置加载,那么是不是物理内存中的所有数据和代码是乱序的,但是以为页表的存在,它可以将地址空间上的虚拟地址和物理地址进行映射,那么是不是在进程视角所有内存分布都可以是有序的,地址空间说白了就是OS给进程画的大饼,结合第二条进程要访问物理内存中的数据和代码,可能目前并没有在物理内存中,同样的,也可以让不同的进程映射到不同的物理内存,是不是变得很容易做到,就这样实现了进程的独立性

进程的独立性,可以通过地址空间+页表的方式实现,所以地址空间+页表的存在就可以将内存进行有序化

二、创建

在之前文章中说过fork函数的用法,这里将继续用进程进行讲解。

在fork的使用我知道它是有分流功能的,并且在子进程中更改变量后会,父进程不会更改,在上篇文章说了是因为页表的存在,那么,fork创建子进程,操作系统都做了什么呢?我这里总结了下面六点

1、分配新的内存块和内核数据结构:操作系统首先为子进程分配新的内存块和内核数据结构,这些结构用于存储子进程的相关信息。

2、复制父进程的数据结构:操作系统将父进程的部分数据结构内容拷贝至子进程。这些数据结构包含了进程的状态、环境变量、打开的文件描述符等信息。

3、添加子进程到系统进程列表:操作系统将新创建的子进程添加到系统的进程列表中,以便进行管理和调度。

4、设置子进程的PID:每个进程都有一个唯一的进程标识符(PID)。操作系统为新创建的子进程分配一个唯一的PID。

5、复制父进程的代码和数据:虽然子进程在创建时复制了父进程的数据结构,但通常并不会复制父进程的代码和数据段。相反,子进程和父进程共享相同的代码段,而数据段则采用写时拷贝(Copy-on-Write, COW)技术。这意味着在子进程实际修改数据之前,父子进程共享相同的数据。当子进程尝试修改数据时,操作系统会为该数据创建一份副本,并允许子进程修改其自己的数据副本,而父进程的数据保持不变。

6、返回进程ID:fork函数在父进程中返回新创建的子进程的PID,而在子进程中返回0。这样,通过检查fork的返回值,进程可以判断自己是父进程还是子进程。

所以fork创建子进程后,系统是不是又多了一个进程,这个肯定是的,进程=内核数据结构+进程代码和数据,这个数据一般是从磁盘中来,也就是c/c++的程序,加载之后的结果。

然后在上篇文章中说的创建进程后,系统会不会直接拷贝一份数据吗?也就是深拷贝,这个当然不是,因为就算拷贝了数据用可能用不到,所以就会造成浪费,那么OS怎么做才会不浪费,也可以进行不同的修改是怎么造成的?一般来说即使是OS也无法提前知道那些空间可能会被写入,所以OS选择使用了写时拷贝,将父子进程未来的数据进行分离。

三、终止

进程终止有下面三种情况

1、代码运行完毕,结果正确

2、代码运行完毕,结果不正确

3、代码异常终止

进程终止前两种我知道是因为运行的结果,可是第三个有哪些呢?进程常见退出方法有正常终止和异常退出return退出有下面几种情况

1、从main返回

2、调用exit

3、_exit
异常退出:ctrl + c,信号终止

如下图我这里是用echo $?这个命令进行查看最近一条获得返回值,因为这里是利用ctrl+c进行停止,所以不是0,错误码表如下方代码

 

EPERM		    1    /* Operation not permitted*/
ENOENT		    2    /* No such file or directory*/
ESRCH		    3    /* No such process*/
EINTR		    4    /* Interrupted system call*/
EIO			    5    /* I/O error*/
ENXIO		    6    /* No such device or address*/
E2BIG 		    7    /* Argument list too long*/
ENOEXEC		    8    /* Exec format error*/
EBADF		    9    /* Bad file number*/
ECHILD 		    10   /* No child processes*/
EAGAIN 	        11   /* Try again*/
ENOMEM		    12   /* Out of memory*/
EACCES		    13   /* Permission denied*/
EFAULT          14   /* Bad address*/
ENOTBLK         15   /* Block device required*/
EBUSY           16   /* Device or resource busy*/
EEXIST          17   /* File exists*/
EXDEV           18   /* Cross-device link*/
ENODEV          19   /* No such device*/
ENOTDIR         20   /* Not a directory*/
EISDIR          21   /* Is a directory*/
EINVAL          22   /* Invalid argument*/
ENFILE          23   /* File table overflow*/
EMFILE          24   /* Too many open files*/
ENOTTY          25   /* Not a typewriter*/
ETXTBSY         26   /* Text file busy*/
EFBIG           27   /* File too large*/
ENOSPC          28   /* No space left on device*/
ESPIPE          29   /* Illegal seek*/
EROFS           30   /* Read-only file system*/
EMLINK          31   /* Too many links*/
EPIPE           32   /* Broken pipe*/
EDOM            33   /* Math argument out of domainof func */
ERANGE          34   /* Math result notrepresentable */
EDEADLK         35   /* Resource deadlock wouldoccur */
ENAMETOOLONG    36   /* File name too long */
ENOLCK          37   /* No record locks available*/
ENOSYS          38   /* Function not implemented*/
ENOTEMPTY       39   /*Directory not empty */
ELOOP           40   /* Too many symbolic linksencountered */
EWOULDBLOCK   EAGAIN /*Operation would block */
ENOMSG          42   /* No message of desired type*/
EIDRM           43   /* Identifier removed*/
ECHRNG          44   /* Channel number out of range*/
EL2NSYNC        45   /* Level2 not synchronized */
EL3HLT          46   /* Level 3 halted*/
EL3RST          47   /* Level 3 reset*/
ELNRNG          48   /* Link number out of range*/
EUNATCH         49   /* Protocol driver notattached */
ENOCSI          50   /* No CSI structure available*/
EL2HLT          51   /* Level 2 halted*/
EBADE           52   /* Invalid exchange*/
EBADR           53   /* Invalid request descriptor*/
EXFULL          54   /* Exchange full*/
ENOANO          55   /* No anode*/
EBADRQC         56   /* Invalid request code*/
EBADSLT         57   /* Invalid slot*/
EDEADLOCK       EDEADLK
EBFONT          59   /* Bad font file format*/
ENOSTR          60   /* Device not a stream*/
ENODATA         61   /* No data available*/
ETIME           62   /* Timer expired*/
ENOSR           63   /* Out of streams resources*/
ENONET          64   /* Machine is not on thenetwork */
ENOPKG          65   /* Package not installed*/
EREMOTE         66   /* Object is remote*/
ENOLINK         67   /* Link has been severed*/
EADV            68   /* Advertise error*/
ESRMNT          69   /* Srmount error*/
ECOMM           70   /* Communication error on send*/
EPROTO          71   /* Protocol error*/
EMULTIHOP       72    /*Multihop attempted */
EDOTDOT         73   /* RFS specific error*/
EBADMSG         74   /* Not a data message*/
EOVERFLOW       75    /* Valuetoo large for defined data type */
ENOTUNIQ        76    /* Namenot unique on network */
EBADFD          77   /* File descriptor in badstate */
EREMCHG         78   /* Remote address changed*/
ELIBACC         79   /* Can not access a neededshared library */
ELIBBAD         80   /* Accessing a corruptedshared library */
ELIBSCN         81   /* .lib section in a.outcorrupted */
ELIBMAX         82   /* Attempting to link in toomany shared libraries */
ELIBEXEC        83   /* Cannotexec a shared library directly */
EILSEQ          84   /* Illegal byte sequence*/
ERESTART        85   /*Interrupted system call should be restarted */
ESTRPIPE        86   /*Streams pipe error */
EUSERS          87   /* Too many users*/
ENOTSOCK        88   /* Socketoperation on non-socket */
EDESTADDRREQ    89   /* Destination address required*/
EMSGSIZE        90   /*Message too long */
EPROTOTYPE      91   /*Protocol wrong type for socket */
ENOPROTOOPT     92   /*Protocol not available */
EPROTONOSUPPORT 93   /* Protocol not supported */
ESOCKTNOSUPPORT 94   /* Socket type not supported*/
EOPNOTSUPP      95   /*Operation not supported on transport endpoint*/
EPFNOSUPPORT    96   /* Protocol family not supported*/
EAFNOSUPPORT    97   /* Address family not supported by protocol*/
EADDRINUSE      98   /*Address already in use */
EADDRNOTAVAIL   99   /* Cannot assign requested address*/
ENETDOWN        100  /*Network is down */
ENETUNREACH     101  /*Network is unreachable */
ENETRESET       102  /*Network dropped connection because of reset */
ECONNABORTED    103  /* Software caused connection abort*/
ECONNRESET      104  /*Connection reset by peer */
ENOBUFS         105  /* No buffer space available*/
EISCONN         106  /* Transport endpoint isalready connected */
ENOTCONN        107  /*Transport endpoint is not connected */
ESHUTDOWN       108  /*Cannot send after transport endpoint shutdown*/
ETOOMANYREFS    109  /* Too many references: cannot splice*/
ETIMEDOUT       110  /*Connection timed out */
ECONNREFUSED    111  /* Connection refused */
EHOSTDOWN       112  /* Hostis down */
EHOSTUNREACH    113  /* No route to host */
EALREADY        114  /*Operation already in progress */
EINPROGRESS     115  /*Operation now in progress */
ESTALE          116  /* Stale NFS file handle*/
EUCLEAN         117  /* Structure needs cleaning*/
ENOTNAM         118  /* Not a XENIX named type file*/
ENAVAIL         119  /* No XENIX semaphoresavailable */
EISNAM          120  /* Is a named type file*/
EREMOTEIO       121  /*Remote I/O error */
EDQUOT          122  /* Quota exceeded*/
ENOMEDIUM       123  /* Nomedium found */
EMEDIUMTYPE     124  /* Wrongmedium type */
ECANCELED       125  /*Operation Canceled */
ENOKEY          126  /* Required key not available*/
EKEYEXPIRED     127  /* Keyhas expired */
EKEYREVOKED     128  /* Keyhas been revoked */
EKEYREJECTED    129  /* Key was rejected by service*/

四、等待

之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息

这里将讲述wait和waitpid两个函数进行演示。

wait函数如下:

pid_t wait(int*status);

返回值:
成功返回被等待进程pid,失败返回-1。
参数:
输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

waitpid函数如下:

pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
当正常返回的时候waitpid返回收集到的子进程的进程ID;
如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
参数:
pid:
Pid=-1,等待任一个子进程。与wait等效。
Pid>0.等待其进程ID与pid相等的子进程。
status:
WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
options:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进
程的ID。

如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。如果不存在该子进程,则立即出错返回

wait和waitpid,都有一个status参数,该参数是一个输出型参数,由操作系统填充。如果传递NULL,表示不关心子进程的退出状态信息。否则,操作系统会根据该参数,将子进程的退出信息反馈给父进程。status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特位)

 

测试如下

8 #include <sys/wait.h>29 #include <stdio.h>30 #include <stdlib.h>31 #include <string.h>32 #include <errno.h>33 #include <unistd.h>34 int main()35 {36     pid_t pid=fork();                                                                                                                                                                                         37     if(pid<0)38     {39         perror("fork");40     }41     else if(pid==0)42     {43         sleep(20);44         exit(10);45     }46     else47     {48         int st;49         int ret=wait(&st);50         if(ret>0&&(st&0X7F)==0)51         {52             printf("子错误码:%d\n",(st>8)&0XFFF);53         }54 55         else if(ret>0)56         {57             printf("信号码:%d\n",st&0x7F);58         }59     }60 }

五、思维导图

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

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

相关文章

通过WSL在阿里云上部署Django项目MySQL

前端用Vue&#xff0c;后端用Django&#xff0c; nginx&#xff0c;Mysql 参照&#xff1a; 通过WSL在阿里云上部署Vue项目_阿里云 wsl-CSDN博客 阿里云重登录 采用Ubuntu系统&#xff0c; apt update #检查是否已经安装 mysql --version systemctl status mysql apt insta…

hook某银行加固app

分析 要在未修复dex并打包情况下对其app内在类进行hook&#xff0c;单纯的hook会由于加固的问题而导致加载不到内在想hook的类。因此需要进行加载加固的classloader。 在此之前需要先了解Context 在Android中&#xff0c;只有Application、Activity以及Service有自己的Contex…

Gradle系列(3)——Gradle extension(gradle扩展),如何自定义gradle扩展,AppPlugin,AppExtension原理

文章目录 1.什么是Extensions2.如何自定义Extension3.问题来了——如何通过自定义Extension给Plugin传递数据4.BaseAppModuleExtension和AppPlugin部分原理BuildTypes是如何创建并传递数据给AppPlugin的&#xff1f;AppPlugin是如何接收数据的&#xff1f;buildTypeContainer流…

HDLbits 刷题 -- Mux256to1

Create a 1-bit wide, 256-to-1 multiplexer. The 256 inputs are all packed into a single 256-bit input vector. sel0 should select in[0], sel1 selects bits in[1], sel2 selects bits in[2], etc. Expected solution length: Around 1 line. 译&#xff1a; 创建一个…

CESS 受邀出席香港Web3.0标准化协会第一次理事会议,共商行业未来

2024 年 4 月 5 日&#xff0c;CESS&#xff08;Cumulus Encrypted Storage System&#xff09;作为香港 Web3.0 标准化协会的副理事会成员&#xff0c;于香港出席了 2024 年度第一次理事会会议。此次会议汇聚了来自不同领域的知名企业和专家&#xff08;参会代表名单见文末&am…

Linux——守护进程

在这篇文章中我介绍了关于tcp网络套接字&#xff0c;关于网络套接字编程的问题我会再次讲述一点东西&#xff0c;然后介绍关于守护进程的知识。 1. 关于网络套接字编程的一些问题 在进行套接字编程时我们一定是得先有套接字&#xff0c;并且我们在使用socket的一些接口时&…

MyBatis 源码分析 - 映射文件解析过程

1.简介 在上一篇文章中&#xff0c;我详细分析了 MyBatis 配置文件的解析过程。由于上一篇文章的篇幅比较大&#xff0c;加之映射文件解析过程也比较复杂的原因。所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来&#xff0c;独立成文&#xff0c;于是就有了本篇文章…

新标准日本语 课后练习

自学错误可能较多&#xff0c;听力题不需要听力的就没听录音 第二十課 スミスさんはピアノを弾くことができます 練習&#xff11;&#xff0d;&#xff11; &#xff11;張さんは日本の歌を歌うことができます 张先生会唱日本歌 &#xff12;小野さんは自転車に乗ることがで…

设计模式代码实战-模版方法模式

1、问题描述 小明喜欢品尝不同类型的咖啡&#xff0c;她发现每种咖啡的制作过程有一些相同的步骤&#xff0c;他决定设计一个简单的咖啡制作系统&#xff0c;使用模板方法模式定义咖啡的制作过程。系统支持两种咖啡类型&#xff1a;美式咖啡&#xff08;American Coffee&#…

RAID 5实训

Raid 5 配置实训 实验结构&#xff1a; 实验步骤 环境准备&#xff0c;Linux操作虚拟机下添加3个及以上的磁盘用于raid 10阵列构建所用&#xff08;本次实验4个&#xff0c;一个用于备用&#xff09;创建raid 5 磁盘阵列格式化并挂载磁盘阵列存储速度检查是否提升安全性能检查…

DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

C++进阶——继承

前言&#xff1a;从这篇文章开始&#xff0c;我们进入C进阶知识的分享&#xff0c;在此之前&#xff0c;我们需要先来回顾一个知识&#xff1a; C语言有三大特性&#xff0c;分别是封装、继承和多态&#xff0c;而我们前边所分享的各种容器类&#xff0c;迭代器等&#xff0c;…

数据结构----链表算法题目

1.移除链表的元素 这个题目我们有多种解决方案 &#xff08;1&#xff09;思路A&#xff1a;遍历整串数据&#xff0c;如果是我们想要删除的数据&#xff0c;就让这个数字后面的数字全部向前移动直到整传数字全部遍历完成&#xff1b;这个方法的时间复杂度是N的平方&#xff…

ARM作业day8

温湿度数据采集应用&#xff1a; 由上图可知&#xff1a; 控制温湿度采集模块的引脚是PF14&#xff08;串行时钟线&#xff09;和PF15&#xff08;串行数据线&#xff09;&#xff1a;控制温湿度采集模块的总线是AHB4&#xff0c;通过GPIOF串口和RCC使能完成初始化操作。 控制…

MAC-OS低版本升级到高版本——亲测有效

关于MAC-OS 10.13.6 升级到10.15的实战 一.MAC 欧司如何查看他的系统版本 查看信息如图 二.,去官网下载新的MAC OS 系统 官网地址&#xff1a;如何下载和安装 macOS - 官方 Apple 支持 (中国) 三.点击安装 四.具体步骤可以参考官网 在兼容的 Mac 电脑上下载并安装最新或以前…

最新版idea 合并分支方法

前言 以下是最新版的idea2024&#xff0c;如果有人找不到按键可能是因为版本不同。 操作步骤 看右小角我的分支是submit&#xff0c;现在我要将test合并到我的submit分支上 找到test分支&#xff0c;选择update&#xff0c;这一步会拉取相应分支内容等同于pull 选择merge 选…

I2C,UART,SPI(STM32、51单片机)

目录 基本理论知识&#xff1a; 并行通信/串行通信&#xff1a; 异步通信/同步通信&#xff1a; 半双工通信/全双工通信: UART串口&#xff1a; I2C串口&#xff1a; SPI串口&#xff1a; I2C在单片机中的应用&#xff1a; 软件模拟&#xff1a; 51单片机&#xff1a;…

PHP-file_get_contents(练习1)

[题目信息]&#xff1a; 题目名称题目难度PHP-file_get_contents(练习1)1 [题目考点]&#xff1a; file_get_contents() 把整个文件读入一个字符串中。 该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持&#xff0c;还会使用内存映射技术来增…

同城O2O系统开发实战:外卖送餐APP的技术架构与实现

今天&#xff0c;我们将深入探讨同城O2O系统开发实战中&#xff0c;外卖送餐APP的技术架构与实现。 一、概述 外卖送餐APP是一种典型的O2O应用&#xff0c;通过移动互联网技术&#xff0c;将用户与商家连接起来&#xff0c;实现用户在线订餐&#xff0c;商家配送服务的模式。…

Git分布式版本控制系统——在IDEA中使用Git(一)

一、在IDEA中配置Git 本质上还是使用的本地安装的Git软件&#xff0c;所以需要在IDEA中配置Git 打开IDEA的设置页面&#xff0c;按照下图操作 二、在IDEA中使用Git获取仓库 1、本地初始化仓库 2、从远程仓库克隆 方法一&#xff1a; 方法二&#xff1a; 三、.gitignore文件…