进程【Linux系统编程】

news2024/11/19 13:41:06

一、先谈硬件——冯诺依曼体系结构 

存储器:内存(硬盘是外存) 

输入设备:鼠标、键盘、摄像头、话筒、磁盘、网卡……

输出设备:显示器、播放器硬件、磁盘、网卡……

输入输出设备是外部设备,简称外设。

中央处理器(CPU):

运算器:对我们的数据进行计算任务(算数运算、逻辑运算)

控制器:对我们的计算硬件流程进行一定的控制。

以上每一个部分都是独立的个体,也就是说,各个硬件单元必须用“线”链接起来。

“线”分两类:1、系统总线(CPU和内存之间) 2、IO总线(内存和外设之间)

不考虑缓存的情况,CPU只能对内存进行读写,不能访问外设。

所有设备都只能直接和内存打交道。

二、再谈软件——操作系统(Operator System)

操作系统是一款进行管理的软件。

why?

1、操作系统帮助用户管理好下面的软硬件资源(手段)。

2、为了给用户提供一个良好的(稳定、高效、安全)运行环境(目的)。

how?

先描述再组织。

操作系统里面会有各种数据,但操作系统不相信任何用户!

操作系统为了保证自己的数据安全,也为了保证给用户能够提供服务,操作系统以接口的方式给用户提供调用的入口,来获取系统内部的数据。

接口是操作系统提供的用C实现的,自己内部的函数调用——系统调用。

所有访问操作系统的行为,都只能通过系统调用完成。

操作系统的核心功能:内存管理、进程管理、文件管理、驱动管理。

三、再谈进程

一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程。

操作系统如何将进程管理起来?先描述,再组织。

任何一个进程,加载到内存时,形成真正的进程时,操作系统要先创建进程属性的结构体对象------PCB(process control block:进程控制块)

进程 = 内核PCB数据结构对象 + 你自己的代码和数据

描述进程-PCB 

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

task_struct内容分类 

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

 怎么组织

在Linux中是如何组织进程的,Linux内核中,最基本的组织进程task_struct的方式,是采用双向链表组织的。

查看进程

在Linux中,ps axj 指令可查到当前正在运行的进程。

ls /proc 查看当前系统中所有进程

 终止一个进程:kill -9 PID

  

 怎么获取PID,系统调用接口:getpid

PPID:getppid

当我们每次登录Xshell时,系统会为我们创建一个bash进程即创建一个命令行解释进程,我们在对话框中输入的指令都是bash进程的子进程 。

fork:创建一个子进程

.\指令层面创建进程

fork()代码层面创建进程。

当我们调用fork()函数时,它会创建一个子进程,并给子进程返回0,给父进程返回子进程的pid,然后分两个执行流,id>0的进程是老的进程。 

1、为什么fork()要给子进程返回0,给父进程返回子进程的pid?

返回不同的返回值,是为了区分让不同的执行流,执行不同的代码块!

一般来说,fork()之后的代码父子共享。

子进程只有一个父进程,它只需要通过getppid就可以确定父进程,但是父进程可能有多个子进程,所以它需要拿到子进程的pid来确定子进程。

2、一个函数是如何做到两个返回值?如何理解?

任何平台,进程在运行时,是具有独立性的。

数据层面的写时拷贝:在父子进程刚创建时,数据和代码确实是共享的,但是,当子进程要修改数据时,操作系统会另外在拷贝一份它要改的数据来给子进程更改。

4、fork()函数在干什么?干了什么?

5、如果父子进程创建好后,谁先运行?

谁先运行,由调度器决定,不确定。

进程状态 

1、一般操作系统学科中的:运行、阻塞、挂起

1、运行状态 R(在CPU上的和在运行队列中的都叫运行态)

 一个进程把自己放到cpu上运行,并不是要运行完才把自己放下来。

每个进程都有一个 时间片的概念,在一个时间段内,所有进程代码都会被执行,并发执行

所以,我们的代码中一定会存在大量的把进程从CPU上拿下来或者放上去的动作------进程切换

2、阻塞状态

每一个设备都有一个等待队列(系统里有很多等待队列,进程也有等待队列),进程想等那个设备,如果状态没有就绪,是不可读的,此时,此时,这个进程就自动把自己的PCB链入该设备的等待队列里,如果已经可读了,这个进程就把自己放运行队列里。

 3、阻塞挂起状态

如果操作系统中的内存资源严重不足了,就会在保证正常运行的情况下,省出来内存资源。

会阻塞状态的进程的PCB保留,将代码和数据放到外设中(换出),此时的状态就叫挂起,当下次资源就绪,把这个进程要放入运行队列时,再把代码和数据从新换入进来。

电脑中除了C\D\E盘这些分区,还有一个swap(交换分区)。

2、具体Linux状态是如何维护的?

R(running)运行状态 R+:带+号表示前台运行。

S(sleeping)阻塞状态 (浅度睡眠,可以被唤醒,随时响应外部变化)

D(disk sleep)阻塞状态 (深度睡眠 该状态下进程不可被kill,不响应操作系统的任何请求)

 T(stopped)暂停状态

 t(tracing stopped)暂停状态 打断点时,到断点处会变为t状态

        kill -19 PID (发19号信号,让目标进程处于stop状态)

X(dead):终止态,资源被回收后,才会变成X状态

Z(zombie僵尸):进程一般退出时,如果父进程没有主动回收子进程信息,子进程会一直让自己处于Z状态,进程的相关资源尤其是task_struck结构体不能被释放。 

如果父进程一直不回收这个进程的资源,那么就会一直占用资源,导致内存泄露

孤儿进程:如果父进程先挂了,子进程的PPID就变成了1(1号进程就是操作系统)

        

进程优先级 

PRI:优先级,一个整型数组,数字越小,优先级越高。

NI:nice值,优先级修正数据

PRI(new) = PRI(old)(这个值是80)+nice

程序(进程)地址空间 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
    pid_t id = fork();
    if(id < 0){
        perror("fork");
        return 0;
    }
    else if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
        g_val=100;
        printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
    }
    else{ 
        //parent
        sleep(3);
        printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
    }
    sleep(1);
    return 0;
}
//与环境相关,观察现象即可
child[3046]: 100 : 0x80497e8
parent[3045]: 0 : 0x80497e8

父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:
变量内容不一样,所以父子进程输出的变量绝对不是同一个变量
但地址值是一样的,说明,该地址绝对不是物理地址!
在Linux地址下,这种地址叫做 虚拟地址
我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理。

当创建子进程时,子进程为什么能继承父进程的环境变量呢?

当子进程启动时,父进程已经将环境变量信息加载了,当你创建子进程时,父进程里的数据必定有页表进程虚拟地址到物理地址的映射,当子进程创建页表时,子进程也自然会将父进程的环境变量信息继承下来。

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

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

相关文章

做一个最新版的淘宝客返利程序源码有多难?

我们都知道淘宝客返利程序成为了很多人的创业和赚钱的工具。这种程序允许通过推广淘宝商品来获得佣金。然而&#xff0c;你知道构建这样一个淘宝客返利程序有多难吗&#xff1f;今天我们就从最基本的API说起&#xff0c;现在我将介绍构建一个最新版淘宝客返利程序所需的关键API…

学习学不进去的时候怎么办?

01 人生很难只有欢声笑语,学习道路也一样。 有时候,我们会面临进退两难的情形: 明明知道应该学,却仿佛被定格在原地,一步也迈不出去。 这种状态为通常被称为“学不进去”&#xff0c;这时该怎么办? 其实, “学不进去”的原因可谓千头万绪,但归根结底,大抵可归为两类: 外在环境…

Python--练习:使用while循环求1..100的和

案例&#xff1a;使用while循环求1..100的和 思考&#xff1a; 先套用原有基础模式&#xff0c;之后再思考其他的。 while循环的基本语法&#xff1a; 对于循环次数已知的情况&#xff0c;建议使用while循环 因为是知道次数的&#xff0c;所以可以用一个计数器。程序里面&am…

【前端】图片裁剪路径绘制及图片不规则裁剪

说明 项目中可能需要用户根据展示的图片&#xff0c;然后绘制需要裁剪的路径&#xff0c;再根据绘制的坐标进行裁剪&#xff0c;以下是前端的裁剪路径绘制的代码示例&#xff0c;后端可以根据当前的获取到的坐标进行裁剪&#xff0c;裁剪的坐标保存在coordinate数组中。 代码 …

Hadoop3教程(二十八):(生产调优篇)NN、DN的多目录配置及磁盘间数据均衡

文章目录 &#xff08;148&#xff09;NN多目录配置&#xff08;149&#xff09;DataNode多目录配置及磁盘间数据平衡磁盘间数据均衡 参考文献 &#xff08;148&#xff09;NN多目录配置 NN多目录的意思是&#xff0c;本地目录可以配置成多个&#xff0c;且每个目录存放内容相…

用 Python 这样去创建词云不是更美嘛?

什么是词云&#xff1f;在网络上我们经常可以看到一张图片&#xff0c;上面有一大堆大小不一的文字&#xff0c;这便是词云。词云一般是根据输入的大量词语生成的&#xff0c;如果某个词语出现的次数越多&#xff0c;那么相应的大小就会越大。 Python 中有一个专门用来生成词云…

Spring的 @ControllerAdvice 之 ResponseBodyAdvice对响应结果进行增强

Spring的 ControllerAdvice 之 ResponseBodyAdvice对响应结果进行增强 1. 使用背景2. 使用方法3. 结果 1. 使用背景 对响应结果进行统一结果处理时&#xff0c;有时会出现有的接口未进行封装&#xff0c;为了解决该问题&#xff0c;可使用ControllerAdvice 注解对响应结果进行…

三辊闸机的应用领域和特点

三辊闸机是一种常用于门禁控制的设备&#xff0c;它具有以下应用和优点&#xff1a; 应用&#xff1a; 门禁控制&#xff1a;三辊闸机可以用于各种场合的门禁控制&#xff0c;如小区、写字楼、学校、医院等。考勤管理&#xff1a;三辊闸机可以与考勤系统集成&#xff0c;用于…

机器学习-K-近邻(KNN)算法

目录 一 . K-近邻算法&#xff08;KNN&#xff09;概述 二、KNN算法实现 三、 MATLAB实现 四、 实战 一 . K-近邻算法&#xff08;KNN&#xff09;概述 K-近邻算法&#xff08;KNN&#xff09;是一种基本的分类算法&#xff0c;它通过计算数据点之间的距离来进行分类。在…

算法通关村第二关-青铜终于学会链表了

大家好我是苏麟 , 今天来学反转链表 . 反转链表 描述 : 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 LeetCode 206.反转链表 : 206. 反转链表 牛客 BM1 反转链表 : 分析 : 本题有两种方法&#xff0c;带头结点和不带头结点&am…

【C语言精髓之指针】结构体指针(->与.两个运算符的区别)

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 通信与信息专业大二在读 * copyright 2023.10* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人同意&#xff0c;且需标明转载源* language C/C* IDE Base on Mic…

下载安装Microsoft ODBC Driver for SQL Server和配置SQL Server ODBC数据源

1. 下载SQL Server ODBC驱动&#xff1a; Microsoft ODBC Driver for SQL Server - ODBC Driver for SQL Server | Microsoft Learn 2. 安装SQL Server ODBC驱动&#xff1a; 运行安装程序&#xff0c;出现如下图所示页面&#xff1b; 选择下一步&#xff1b;选择我同意许可协…

git学习——第2节 时光机穿梭

我们已经成功地添加并提交了一个readme.txt文件&#xff0c;现在&#xff0c;是时候继续工作了&#xff0c;于是&#xff0c;我们继续修改readme.txt文件&#xff0c;改成如下内容&#xff1a; Git is a distributed version control system. Git is free software. 现在&…

uni——底部弹框显示,底部导航隐藏

案例 在uni-app中&#xff0c;如果你在tabbar页面显示一个底部弹框&#xff0c;底部导航默认是会依旧显示的。如果你想在弹框显示时隐藏底部导航&#xff0c;你可以使用uni.hideTabBar和uni.showTabBar方法来控制底部导航的显示和隐藏。 export default {methods: {openPopup(…

汽车空调工作总结

工作总结 2022年3月加入公司&#xff0c;公司在河南&#xff0c;从事车载空调等相关项目&#xff0c;我的岗位是嵌入式软件工程师&#xff0c;在工作中也遇到了很多机遇和挑战&#xff0c;也学到了非常多的东西&#xff0c;在这里给大家分享下总结经验。 关于工作、公司 毕业…

线上答题活动小程序结合线下大屏复盘总结

线上答题活动小程序结合线下大屏复盘总结 ~ 说来话长&#xff0c;这个活动也接近尾声了&#xff0c;从刚开始着手开发&#xff0c;到现在已过去半年&#xff0c;好不夸张的&#xff0c;当时从4月份开始接触&#xff0c;现在已经十月份了 该小程序我发下主界面截图&#xff0…

ant提供对所有系统属性的访问

ant提供对所有系统属性的访问&#xff0c;就好像这些系统属性已经用 <property>任务定义过一样。 例如&#xff0c;下面的build文件中通过${os.name}获取操作系统名称&#xff0c;通过${java.home}获取Java的安装路径&#xff1a; <project name"demo_project&…

2023年最新版CorelDraw(cdr)软件下载安装教程

CorelDRAW 2023是Corel公司推出的最新版本的图形设计软件。CorelDRAW是一款功能强大的矢量图形编辑工具&#xff0c;被广泛用于图形设计、插图、页面布局、照片编辑和网页设计等领域。 1. 新增的设计工具&#xff1a;CorelDRAW 2023引入了一些全新的设计工具&#xff0c;使用户…

Adobe产品2024

一、软件下载&#xff1a; 二、软件介绍&#xff1a; Adobe公司旗下的产品在影视后期、平面设计等领域有着无可取代的地位。在创意和设计领域中&#xff0c;产品有多达 21 个&#xff0c;包括 Photoshop、Illustrator、InDesign、Premiere Pro、After Effects 和 Acrobat Pro …

LED显示屏系统组成及工作过程

LED显示屏是一种平板显示器&#xff0c;由一个个小的LED模块面板组成&#xff0c;用来显示文字、图像、视频等各种信息的设备&#xff0c;广泛应用于商业传媒、文化演出市场、体育场馆、信息传播、新闻发布、证券交易等不同环境和场景的需要。 LED显示屏系统是基于LED显示屏设备…