【Linux后端服务器开发】进程与地址空间概述

news2024/11/25 11:25:08

目录

一、进程创建

二、进程状态

1. 运行状态R

2. 睡眠状态S

3. 僵尸状态Z

4. 孤儿进程

三、进程优先级 PRI

四、地址空间的层次结构

五、虚拟地址和物理地址


一、进程创建

  • fork()函数创建子进程,若创建成功,则给父进程返回子进程的pid,给子进程返回0
  • 父子进程关系:子进程ppid == 父进程pid
  • 父子进程可同时运行,互不干扰
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main() 
{
    pid_t id = fork();
    if (id == 0) 
    {
        while (1) 
        {
            printf("这是一个子进程,pid=%d, ppid=%d\n", getpid(), getppid());
            sleep(1);
        }
    }
    else 
    {
        while (1) 
        {
            printf("这是一个父进程,pid=%d, ppid=%d\n", getpid(), getppid());
            sleep(1);
        }
    }
    return 0;
}

进程特性:

  • 竞争性:系统进程数目众多,但cpu只有少数,所有进程之间根据优先级有了竞争性
  • 独立性:多进程运行,需要独享各种资源,各个进程之间互不干扰
  • 并行:多个进程在多个cpu上,分别同时进行运行
  • 并发:多个进程在一个cpu上,采用进程切换的方式,在一段时间内让多个进程得以推进

进程在切换的时候,进行上下文保护,上下文是寄存器内的数据

进程在恢复的时候,进行上下文修复

二、进程状态

查看进程状态: ps ajx | head -1 && ps ajx | grep "myproc"

  • 杀死进程: kill -9 pid
  • 暂停进程: kill -19 pid
  • 继续进程: kill -18 pid
  • 进程状态带+号,代表是前台进程,否则是后台进程
  • 前台进程在终端运行,后台进程不受终端控制

进程状态STAT:

  • R:running,运行状态
  • X:dead
  • Z:zombie,僵尸状态,进程退出了但是还没被(父进程/os)回收
  • T:stopped,暂停状态
  • D:disk sleep,深度睡眠状态,改状态下的进程无法被os杀死
  • S:sleeping,睡眠状态

1. 运行状态R

int main() 
{
    while (1);
    return 0;
}

 

2. 睡眠状态S

程序运行的时候,99%以上的时间在等待加载,1%的时间在执行

int main() 
{
    while (1) 
    {
        printf("pid = %d\n", getpid());
    }
}

3. 僵尸状态Z

子进程结束了,但是父进程和os并没有回收子进程,子进程进入僵尸状态

int main() 
{
    pid_t id = fork();
    if (id == 0) 
    {
        while (1) 
        {
            printf("子进程:pid=%d, ppid=%d\n", getpid(), getppid());
            sleep(5);
            exit(1);
        }
    }
    while (1) 
    {
        printf("父进程:pid=%d, ppid=%d\n", getpid(), getppid());
        sleep(1);
    }
}

4. 孤儿进程

父进程结束了,但是子进程还在运行

孤儿进程会被os领养,变成后台进程

int main() 
{
    pid_t id = fork();
    if (id == 0) 
    {
        while (1) 
        {
            printf("子进程:pid=%d, ppid=%d\n", getpid(), getppid());
            sleep(1);
        }
    }
    else 
    {
        while (1) 
        {
            printf("父进程:pid=%d, ppid=%d\n", getpid(), getppid());
            sleep(5);
            exit(1);
        }
    }
}

三、进程优先级 PRI

  • linux支持进程运行中,进行优先级调整(修改nice值)
  • 最终优先级 = 原优先级 + nice值
  • 每一次设置,原优先级都默认变为80
  • 优先级的数值越小,优先级别越高
  • nice的取值范围[-20, 19]

四、地址空间的层次结构

测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct AddRoom 
{
    int code_start;
    int code_end;

    int init_start;
    int init_end;

    int heap_start;
    int heap_end;

    int stack_start;
    int stack_end;
    //...
};  //虚拟地址空间数据结构

int g_unval;
int g_val = 100;

int main(int argc, char* argv[], char* env[]) 
{
    printf("code addr: %p\n", main);
    const char* str = "hello";
    printf("the const str addr: %p\n", str);
    printf("init globle addr: %p\n", &g_val);
    printf("uninit globle addr: %p\n", g_unval);

    char* heap_mem0 = (char*)malloc(10);
    char* heap_mem1 = (char*)malloc(10);
    char* heap_mem2 = (char*)malloc(10);
    char* heap_mem3 = (char*)malloc(10);
    printf("heap addr: %p\n", heap_mem0);
    printf("heap addr: %p\n", heap_mem1);
    printf("heap addr: %p\n", heap_mem2);
    printf("heap addr: %p\n", heap_mem3);
    printf("stack addr: %p\n", &heap_mem0);
    printf("stack addr: %p\n", &heap_mem1);
    printf("stack addr: %p\n", &heap_mem2);
    printf("stack addr: %p\n", &heap_mem3);

    for (int i = 0; i < argc; ++i) 
    {
        printf("argv[%d]: %p\n", i, argv[i]);
    }
    for (int i = 0; env[i]; ++i) 
    {
        printf("env[%d]: %p\n", i, env[i]);
    }
    return 0;
}

运行结果:

五、虚拟地址和物理地址

测试代码:

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

int g_val = 100;

int main() 
{
    pid_t id = fork();
    if (id < 0) 
    {
        printf("子进程创建失败\n");
        return 1;
    }
    else if (id == 0) 
    {
        int cnt = 0;
        while (1) 
        {
            printf("子进程: pid=%d, ppid=%d, g_val=%d, &g_val=%p\n", 
                    getpid(), getppid(), g_val, &g_val);
            sleep(1);
            ++cnt;
            if (cnt == 5) 
            {
                g_val = 300;
                printf("子进程已将全局变量修改为 300 \n");
            }
        }
    }
    else 
    {
        while (1) 
        {
            printf("父进程: pid=%d, ppid=%d, g_val=%d, &g_val=%p\n", 
                    getpid(), getppid(), g_val, &g_val);
            sleep(1);
        }
    }
    return 0;
}

执行结果:

原理:

虚拟地址存在的意义:

  • 阻止非法访问,保护物理内存数据
  • 内存管理模块与进程管理模块进行了解耦合
  • 防止物理空间内存浪费
  • 地址空间+页表,将内存分部有序化
  • 实现对程序的分批加载,分批换出

虚拟地址转换为物理地址:

  • 地址空间是进程能看到的资源窗口
  • 页表决定进程真正拥有资源的情况
  • 合理的对地址空间空间+页表进行资源划分,我们可以对一个进程的所有资源进行分类管理

  • 先用虚拟地址的前10位查页目录
  • 再用虚拟地址的中间10位查页表
  • 最后用虚拟地址的后12位查页内偏移
  • 磁盘内每一个页帧的大小为4KB,对应最大页内偏移量为2^12
  • 页表只有在需要使用的时候才被创建

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

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

相关文章

Python基础教程:异常处理try...except语句

Python是一门非常灵活且易于学习的编程语言&#xff0c;在日常开发中被广泛应用。然而&#xff0c;由于各种原因&#xff0c;我们的代码可能会出现异常情况&#xff0c;例如输入错误、文件读写异常等等。Python异常处理是Python中重要的一部分&#xff0c;为了保证程序的稳定性…

用表格制作网页

利用表格制作网页 实验目标 该网页将利用设计页面的布局&#xff0c;制楚雄师院的页面简介。通过该种制作&#xff0c;我们可以体会到表格在布局设计中的实际运用&#xff0c;体会如何使用表格来控制页面中的元素对象&#xff0c;已达到自然&#xff0c;生动的配置构成元素…

Linux无法访问github解决方案【修改/etc/hosts文件,加上GitHub网站的IP地址】

ChatGPT神中神&#xff01; 省流&#xff1a;修改/etc/hosts文件&#xff0c;加上GitHub网站的IP地址。 "Failed connect to github.com:443; 拒绝连接" 错误通常表示你的系统无法建立与GitHub的安全连接。这可能是由于网络问题、防火墙设置或代理配置等原因引起的。…

unbuntu 22.04 安装和卸载企业微信

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 记录有关在ubuntu22.04上安装和卸载企业微信 以及企业微信无法打开问题处理 1. 正文 1.1 安装 下载wine环境 http://archive.ubuntukylin.com/softwar…

apache hudi 初见

git clone https://gitee.com/apache/Hudi.git docker pull yml 文件里面的镜像 然后 docker-compose -f docker-compose_hadoop284_hive233_spark244.yml -p 6p6 up -d 然后就是 在这里插入代码片# Licensed to the Apache Software Foundation (ASF) under one or more …

MySQL之InnoDB存储结构 | 京东物流技术团队

1 InnoDB存储引擎 InnoDB存储引擎最早由Innobase Oy公司开发&#xff08;属第三方存储引擎&#xff09;。从MySQL 5.5版本开始作为表的默认存储引擎。该存储引擎是第一个完整支持ACID事务的MySQL存储引擎&#xff0c;特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读&…

机器学习实战 | 股票价格预测项目(深度学习初级)

目录 简介技术流程1. 载入依赖包2. 读取数据集3. 从数据集中分析价格4. 对数据排序5. 数据标准化6. 创建、训练和保存LSTM网络7. 使用LSTM模型进行股票价格预测8. 可视化预测和实际结果 完整程序 简介 准备写个系列博客介绍机器学习实战中的部分公开项目。首先从初级项目开始。…

面试题之spring源码

IOC的底层原理 &#xff1a; Spring是如何循环依赖的。&#xff08;三级缓存&#xff0c;提前曝光&#xff09;&#xff1a; 循环依赖的定义:循环依赖就是循环引用&#xff0c;也就是两个或两个以上bean对象互相持有对方&#xff0c;最终形成闭环&#xff0c;比如A依赖B,B依赖C…

文件夹加密软件怎么选?文件夹加密软件盘点

文件夹是电脑储存数据的重要工具&#xff0c;那么该如何保护文件夹的数据安全呢&#xff1f;使用合适的文件夹加密软件可能是最简单的方法。那么文件夹加密软件该怎么选呢&#xff1f; 文件夹加密超级大师 文件夹加密超级大师可以说是最全能的文件夹加密软件&#xff0c;它拥有…

自己编写chrome插件

1.首先你需要一个menifest.json文件 {"manifest_version": 3,"name": "My Extension","version": "2.0","action": {"default_popup": "popup.html","default_icon": "icon.…

winform弹出消息自动消失

winform弹出消息自动消失 弹出消息后&#xff0c;在指定时间毫秒后消失.消息中包含异常消息&#xff0c;自动一直展示&#xff0c;点击关闭显示&#xff1b; 效果如图 using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks;usi…

保姆级系列教程-玩转Fiddler抓包教程(1)-HTTP和HTTPS基础知识

1.简介 有的小伙伴或者童鞋们可能会好奇地问&#xff0c;不是讲解和分享抓包工具了怎么这里开始讲解HTTP和HTTPS协议了。这是因为你对HTTP协议越了解&#xff0c;你就能越掌握Fiddler的使用方法&#xff0c;反过来你越使用Fiddler&#xff0c;就越能帮助你了解HTTP协议。 Fid…

全网最全,项目管理工具大合集!

早上好&#xff0c;我是老原。 很久没给大家更新工具&#xff0c;本以为之前更新的也够大家用了&#xff0c;没想到还是有很多小友来私信老原好用工具。 关注我比较久的粉丝都知道&#xff0c;我提倡的工具在精不在多&#xff0c;更多的把精力放在自身上&#xff0c;还有啥不…

Vue使用百度地图API详细教程

Vue使用百度地图详细教程 先提供几个文档 Vue-Baidu-map文档&#xff1a;https://dafrok.github.io/vue-baidu-map/#/zh/index 百度地图JavaScript文档&#xff1a;https://lbsyun.baidu.com/index.php?titlejspopularGL 1、申请百度API密钥 控制台->应用管理->我的应…

博途字符串和FIFO编程应用(SCL源代码)

FIFO的其它介绍请参看下面文章链接: PLC堆栈(FIFO)操作之栈级联_三菱plc控制系统的堆栈的工作原理_RXXW_Dor的博客-CSDN博客这篇博文主要讲下各种缓存栈的级联,提供一个分析问题的扩展思路,这个级联什么时候适合在项目里使用需要具体分析。级联实现数据队列的一级级递推传送…

Redis 安装

目录 1、准备安装环境 2、上传安装文件 3、解压安装文件 4、进入安装目录 5、运行编译命令 6、前台启动 ​编辑7、后台启动 8、验证服务 9、关闭服务 10、开启启动 1、准备安装环境 由于 Redis 是基于 C 语言编写的&#xff0c;因此首先需要安装 Redis 所需要的依赖…

Python(一):为什么我们要学习Python?

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

星辰天合受邀参加 2023 全球数字经济大会

7 月 4 日至 7 日&#xff0c;以“数据驱动发展&#xff0c;智能引领未来”为主题的2023全球数字经济大会在北京隆重举办。作为国内技术领先的数据基础设施提供商&#xff0c;星辰天合以北京优秀信创企业代表的身份&#xff0c;受北京信息化协会邀请&#xff0c;参加了 2023 全…

ICC2:copy block方法

open_lib new.nlib open_lib old_lib copy_block -from_block old_block -to_block new.nlib:old_block save_lib new.nlib close_lib 如果是从同一个lib下的block copy到同个lib里&#xff0c;那就open_lib后直接copy就好了&#xff0c;操作时用current_block new_name_b…

多元回归预测 | Matlab基于高斯过程回归(GPR)的数据回归预测,matlab代码,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于高斯过程回归(GPR)的数据回归预测,matlab代码,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码