(初)进程概念

news2024/11/16 23:30:14

目录

认识冯诺依曼系统

操作系统(Operator System) 

设计OS的目的:

定位:

如何理解管理:

 总结:

系统调用和库函数概念:

进程

基本概念 :

描述进程PCB

task_struct - PCB的一种

task_struct内容分类

组织进程:

查看进程:

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

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

进程状态 

进程状态查看:

孤儿进程 

 进程优先级

基本概念:

查看系统进程:

 PRI and NI

环境变量 

常见的环境变量

环境变量相关的命令

环境变量的组织方式 

 


认识冯诺依曼系统

 

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

以下是强调的几点:

  1. 这里的存储器指的是内存 
  2. 不考虑缓存的情况下,这里的CPU只能对内存进行读写,不能访问外设
  3. 外设(输入或输出设备)要输入或者输入数据,也只能写入内存或者从内存中读取
  4. 一句话,所有的设备都只能直接和内存打交道

操作系统(Operator System) 

任何计算机都包含一个基本的程序集合,叫做操作系统。笼统的理解,操作系统包括:

  • 内核(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(函数库,shell程序等)

设计OS的目的:

  • 为硬件交互,管理所有的软硬件资源
  • 为用户程序提供一个良好的执行环境

定位:

  • 在整个计算机软硬件架构中,操作系统的定位是:一款纯正搞管理的软件

如何理解管理:

  • 描述被管理对象
  • 组织被管理对象

 

 总结:

计算机管理硬件:

1.描述起来,用struct结构体

2.组织起来,用链表或者其他高级数据结构

系统调用和库函数概念:

  • 在开发角度,操作系统对外表现出一个整体,但是会暴露自身的部分接口供上层开发使用,这部分由操作系统系统的接口叫做系统调用
  • 系统调用在使用上,功能比较基础,对用户的要求也比较高,所以就有开发商对系统调用进行了适当的封装从而形成了库,有了库就更利于上层用户或开发者进行二次开发

进程

基本概念 :

概念:程序的一个执行实例,正在执行的程序

内核观点:担当分配系统资源(cpu时间,内存)的实体 

描述进程PCB

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

task_struct - PCB的一种

  • 在linux下,描述进程的结构体叫做tast_struct

  • tast_struct 是linux内核的一种数据结构,他会被装载到RAM(内存)里并且包含着进程的信息

task_struct内容分类

  • 标示符:描述本进程的唯一代码标示,用来区别其他进程

  • 状态:任务状态,退出代码,退出信号等

  • 优先级:相对于其他进程的优先级

  • 程序计数器:程序中即将被执行的下一条指令的地址

  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针

  • 上下文数据:进程执行时处理器的寄存器中的数据[休学例子,要加图cpu,寄存器]

  • I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表等

  • 记账信息:可能包括处理器时间总和,使用时钟数总和,时间限制,记账号等

  • 其他信息

组织进程:

可以在内核源代码中找到他。所有运行在系统里的进程都已tast_struct链表的形式存在内核里

查看进程:

进程的信息可以通过/proc 系统文件来查看

如:要获取pid为1的进程的信息,就需要/proc/1 , 大多数进程信息同样可以使用top和ps这些用户级工具来获取。

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

  • 进程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;
}

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

  • 运行man fork来认识fork
  • fork 有两个返回值
  • 父子进程代码共享,数据各自开辟一份空间,私有一份(采用写时拷贝) 
  • fork后通常要用 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);
    }
    sleep(1);
    return 0;
}

进程状态 

  • R 运行状态(running): 并不意味着进程一定在运行中,它表明进程不是在运行中就是在运行队列里
  • S 睡眠状态(sleeping):意味着进程在等待事件的完成(这里叫做可中断睡眠)
  • D 磁盘休眠状态(disk sleep):叫做不可中断睡眠,在这个状态下的进程通常会等待IO的结束
  • T 停止状态(stopped):可通过发送SIGSTOP 信号来停止 T 进程。这个被暂停的 T 进程可以通过发送SIGCONT信号让进程继续运行
  • X 死亡状态(dead) :这个状态只是一个返回状态,不会在任务列表中看到这个状态
  • Z 僵尸进程(zombie):当进程退出且父进程没有读取到子进程的退出码的时候就会出现,僵尸进程会以终止状态保存在进程表中,并且会一致等待父进程读取退出状态码。所以子进程退出,父进程还在运行,但父进程没有读取子进程的进程状态,子进程就会进入Z状态

下面创建一个维持30s的僵尸进程:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id > 0)
    { //parent
        printf("parent[%d] is sleeping...\n", getpid());
        sleep(30);
    }
    else
    {
        printf("child[%d] is begin Z...\n", getpid());
        sleep(5);
        exit(EXIT_SUCCESS);
    }
    return 0;
}

僵尸进程的危害:

  • 进程的退出状态必须被维持下去,因为他要告诉他的父进程,他交给子进程的任务完成的怎么样了。这样如果父进程一直不去读取子进程状态的话,那么子进程就会一直处于僵尸状态
  • 进程退出状态也需要用数据维护,也属于进程的基本信息,所以在task_struct(PCB)中,如果Z状态一直不结束,PCB就要一直进行维护
  • 所以如果一个父进程创建的很多子进程但是却不回收,就会造成资源的浪费,因为数据结构的对象本身就要占用内存
  • 综上僵尸进程会导致内存泄漏

进程状态查看:

ps aux  / ps axj 命令


孤儿进程 

  • 父进程提前退出,子进程后退出,子进程进入Z状态
  • 父进程先于子进程退出,那么子进程就称之为“孤儿进程”
  • 孤儿进程被1号init进程领养,当然要有init进程进行回收
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
    pid_t id = fork();
    if (id < 0)
    {
        perror("fork");
        return 1;
    }
    else if (id == 0)
    { // child
        printf("I am child, pid : %d\n", getpid());
        sleep(10);
    }
    else
    { // parent
        printf("I am parent, pid: %d\n", getpid());
        sleep(3);
        exit(0);
    }
    return 0;
}

 进程优先级

基本概念:

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的Linux很有用,可以极大的改善系统性能
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以改善性能

查看系统进程:

 

  • UID: 代表执行者的身份
  • PID:代表这个进程的代号
  • PPID:代表这个进程是由哪个进程发展衍生而来,即父进程的代号
  • PRI:代表这个进程可被执行的优先级,其志越小越早被执行
  • NI:代表这个进程nice值

 PRI and NI

  • PRI就是进程的优先级,通俗点就是程序被CPU执行的先后顺序,此值越小进程的优先级越高

  • NI就是我们说的nice值了,表示进程可被执行的优先级修正数值

  • PRI值越小越快被执行,加入nice值后PRI(new) = PRI(old) + nice 

  • 这样nice值为负值的时候,该程序优先级会变高,越快被执行

  • 调整优先级在Linux下就是调整进程nice值,nice取值是-20至19 共40个级别

  • 需要强调的是,进程的nice值不是进程的优先级,nice值和优先级不是一个概念,但是nice值会影响到优先级变化

其他概念:

  1. 竞争性:系统进程数目多,而CPU资源只有少量,所以进程之间是具有竞争性的。
  2. 独立性:多进程运行,需要独享各种资源,在运行期间不受干扰
  3. 并行:多个进程在多个CPU下分别同时进行运行
  4. 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程得以推进

环境变量 

基本概念: 环境变量一般是指操作系统中用来指定操作系统运行环境的一些参数。在编写c/c++代码的时候,在链接的时候,不知道所链接的动静态库在哪里,但是却可以连接成功,就是因为有相关环境变量帮助编译器进行查找。

常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录(即用户登录到LINUX系统中,默认的目录)
  • SHELL:当前的Shell,它的值通常是/bin/bash

查看环境变量: encho $NAME //NAME:你的环境变量名称


环境变量相关的命令

1. echo: 显示某个环境变量值


2. export: 设置一个新的环境变量


3. env: 显示所有环境变量


4. unset: 清除环境变量


5. set: 显示本地定义的shell变量和环境变量


环境变量的组织方式 

 

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

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

相关文章

编译安装最新的Linux系统内核

现在还有不少机器是CentOS8 Stream系统&#xff0c;虽然上了贼船&#xff0c;不影响用就是了。8的编译和7大同小异&#xff0c;只是踩了更多的坑在这里记录一下&#xff0c;或许会帮到看到的朋友。 安装编译环境 CentOS8安装必要的包 yum groupinstall "Development Too…

【P13】JMeter 常数吞吐量定时器(Constant Throughput Timer)

文章目录 1、基于计算吞吐量&#xff1a;只有此线程2、基于计算吞吐量&#xff1a;所有活动线程3、基于计算吞吐量&#xff1a;当前线程组中的所有活动线程4、基于计算吞吐量&#xff1a;所有活动线程&#xff08;共享&#xff09;5、基于计算吞吐量&#xff1a;当前线程组中的…

【2023/05/08】雅卡尔织布机

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第3天。 Share The world puts off its mask of vastness to its lover. It becomes small as one song,as one kiss of the eternal. 译文&#xff1a; 世界对着它的爱人&#xff0c;把它浩瀚的面具揭…

已做过算法题总结2

20. 有效的括号 (括号匹配是使用栈解决的经典问题&#xff0c;这道题主要是记住三种不成立的情况) 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用…

解密链表元素移除:三种巧妙思路,轻松驱逐难缠结点

本篇博客会讲解力扣“203. 移除链表元素”的解题思路&#xff0c;这是题目链接。 老规矩&#xff0c;先来审题&#xff1a; 以下是一些示例&#xff1a; 以下是提示&#xff1a; 本题的思路还挺多的&#xff0c;不过都是链表的常规操作。 思路1 万能的尾插法。遍历链表&am…

[Golang] 爬虫实战-用多层嵌套结构体去接收多层嵌套数据

&#x1f61a;一个不甘平凡的普通人&#xff0c;致力于为Golang社区和算法学习做出贡献&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;算法学习 &am…

量子计算(10)编程实践2:隐形传态算法

目录 一、算法目的 二、算法原理 三、pyqpanda实现代码 四、测试结果 一、算法目的 量子隐形传态&#xff0c;又称量子遥传、量子隐形传输、量子隐形传送、量子远距传输或量子远传&#xff0c;是一种利用分散量子缠结与一些物理讯息的转换来传送量子态至任意距离的位置的技…

AutoSar CAN网络管理(CanNm)

文章目录 网络管理目的主动唤醒和被动唤醒状态管理1. 总线睡眠模式&#xff08;Bus-Sleep Mode&#xff09;2. 准备总线睡眠模式&#xff08;Prepare Bus-Sleep Mode&#xff09;3. 网络模式&#xff08;Network Mode&#xff09;3.1 重复报文状态(RepeatMessageState)3.2 常规…

基于springboot+mysql+jpa+html实现商品销售信息系统

基于springbootmysqljpahtml实现商品销售信息系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a; 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 订单管理模块 商品管理模块 品牌管理模…

【项目实战】—— 我们应该如何正确得创建线程池?

项目实战-我们应该如何正确得创建线程池&#xff1f; 对于现在而言多线程编程已经成为程序员必备的职业技能了&#xff0c;在开发实践过程中&#xff0c;你是否也遇到过相关多线程问题&#xff0c;比如创建多少线程才是合适的&#xff1f;线程池该如何创建&#xff1f;今天我们…

类和对象中(2)

文章目录 一、运算符重载1、运算符重载出现的原因2、在全局和类里实现运算符重载3、赋值运算符重载1、为什么赋值运算符重载不能写在全局 &#xff1f;2、什么时候需要自己实现赋值运算符重载 &#xff1f; 4、前置和后置重载5、运算符重载的优势 二、const成员函数1、两个常见…

GNN与MLP:GNN是一种泛化器

图神经网络&#xff08;GNN&#xff09;作为图表示学习的模型&#xff0c;建立在MLP架构之上&#xff0c;具有额外的消息传递&#xff0c;以允许特征在节点之间流动。作者通过引入一个被称为P-MLP的中间模型&#xff0c;将GNN性能增益的主要来源定位为其内在的泛化能力&#xf…

JSR303统一校验和分组校验及常用注解@NotBlank@NotEmpty 的使用

JSR303-bean校验规范 JSR303常用注解&#xff0c;下面注解在JavaBean的字段上使用&#xff0c;必须在方法上搭配Vaild才会开启校验&#xff0c;也可以设置分组校验 Null 必须为空 主键字段常用&#xff0c;可以规定新增时字段必须为空NotNull 不能为null 添加数字时使用常用&…

前端学习笔记:CSS中浮动的原理,定位

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育 目录 1、float1.1、float设计的初衷1.2、浮动的原理&#xff0c;类似两个图层1.3、浮动的原理&#xff0c;两个图层的特殊性1.4、消除浮动的影响 2、定位2.1、相对定位&#xff08;relative&#xff09;2.2、绝对定…

CSS var()的使用

最近在做流量对比的功能&#xff0c;有如下的效果图&#xff0c;当某个节点失败的时候&#xff0c;点击能够弹出对应的提示信息。 这个库使用的是jenkins-pipeline 的库&#xff0c; 但是由于它原本的提示框比较糟糕&#xff0c;所以我们想结合antd的tooltip进行展示&#xff0…

CM211-1-ZG-当贝纯净桌面-线刷固件包-

CM211-1-ZG-当贝纯净桌面-线刷固件包-内有教程及短接点 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0c;运…

设计模式之【工厂模式】,创建对象原来有这么多玩法

文章目录 一、什么是工厂模式1、工厂模式的意义2、什么时候应该用工厂模式 二、简单工厂模式1、实例&#xff08;1&#xff09;使用简单工厂进行优化&#xff08;2&#xff09;静态工厂&#xff08;3&#xff09;使用map来去除if&#xff08;4&#xff09;使用反射&#xff08;…

.netCHARTING Crack,添加圆角半径控制

.netCHARTING Crack,添加圆角半径控制 直角或直线组织连接线-通过默认情况下以直角绘制组织连接线&#xff0c;增强了组织连接线的显示方式。可以使用直线选项更改此默认设置&#xff0c;并直接在点之间绘制连接线。 同步组织节点的宽度和高度-添加了Element.Annotation.SyncWi…

Vue3+element-plus实现后台管理系统

背景&#xff08;未完待续&#xff09; 环境&#xff1a;node.js软件 、Vs code、vite、elemnt-plus、windicss(样式框架&#xff09; 第一节课 1、首先&#xff0c;使用npm 命令构建项目&#xff08; vscode安装的插件 vscode中文显示插件 2、高亮提示插件volar 3、vue 3 …

【Ansys Fluent】根据export导出的ASCII文件按坐标和物理量之间的关系重建物理场(温度场、压力场等)

一、问题说明 在fluent中利用export功能导出ASCII格式的文件&#xff0c;例如下面的文件&#xff0c;第2-4列是单元中心坐标值&#xff0c;第5列是温度值。 如果给出和「导出这个ASCII数据文件时用的几何模型尺寸」一致或等比例放缩的几何模型&#xff0c;可否根据这个ASCII文…