linux(进程概念)

目录

前言:

正文 

冯诺依曼体系结构 

操作系统 (Operator System)

概念

 目的 

定位 

如何理解“管理” 

进程组织

基本概念 

内核数据结构

代码和数据 

查看进程 

ps指令 

top指令 

 父子进程

 fork创建进程

小结:



前言:

在进入进程的学习之前先整理进程这个章节重点:

  • 认识冯诺依曼系统
  • 操作系统概念与定位
  • 深入理解进程概念,了解PCB
  • 学习进程状态,学会创建进程,掌握僵尸进程和孤儿进程,及其形成原因和危害
  • 了解进程调度,Linux进程优先级,理解进程竞争性与独立性,理解并行与并发
  • 理解环境变量,熟悉常见环境变量及相关指令, getenv/setenv函数
  • 理解C内存空间分配规律,了解进程内存映像和应用程序区别, 认识地址空间

正文 

冯诺依曼体系结构 

        常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系 

 

各组成部分如下:

  • 输入设备:键盘鼠标声卡网卡摄像头 等
  • 输出设备:显示屏喇叭网卡打印机 等
  • 存储器:只读存储器随机存取存储器
  • 运算器+控制器:CPU中央处理器

注意:

输入、输出设备 称为外围设备,即 外设,而 外设 一般都会比较慢,比如磁盘网卡等;CPU中央处理 的速度是最快的,通过与存储器的配合,可以做到高效率处理数据(后面涉及到进程状态详细说);对数据进行预加载,CPU 计算时,直接向存储器要数据就行了,效率很高。

关于冯诺依曼,必须强调几点:
这里的存储器指的是内存
不考虑缓存情况,这里的 CPU 能且只能对内存进行读写,不能访问外设 ( 输入或输出设备 )
外设 ( 输入或输出设备 )要输入或者输出数据,也只能写入内存或者从内存中读取。 一句话,所有设备都 只能直接和内存打交道

操作系统 (Operator System)

概念

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

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

 目的 

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

定位 

        普通用户无法直接与计算机中的硬件打交道,也就是说,在没有 操作系统 的情况下,我们几乎是无法使用计算机的,于是一些计算机大牛就创造出了各种好用的 操作系统因此操作系统它是一款进行软硬件资源管理的软件 

如何理解“管理” 

 一句话:先描述,再组织。这六字真言就像学习linux的指路明灯。

  • 描述:通过 struct 结构体对各种数据进行描述
  • 组织:通过 链表 等高效的数据结构对数据进行组织管理

具体逻辑接口如下图所示:

 

进程组织

基本概念 

 一般课本概念:进程 是程序的一个执行实例,是正在执行的程序(这种说法不全面)

 补充概念:进程 由两边组成,分别是 内核数据结构+代码和数据

内核数据结构

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

 

 

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

代码和数据 

 数据生万物,任何一个进程都有自己的代码和数据,比如我们常见的 C语言 源文件,经过编译后生成的可执行程序中,就包含着二进制代码和其创建修改的时间、所处位置信息

 

注: ./可执行程序 其实就是将可执行程序加载至内存中,再执行描述+组织

查看进程 

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

如:要获取pid为1的进程信息,需要查看/proc/1这个文件夹、

大多数进程信息同样可以使用top和ps这些用户级工具获取 

ps指令 

 

$ ps ajx | head -1 && ps ajx | grep 进程名 | grep -v grep

 功能: 查看进程信息,其中利用管道进行了信息筛选,使得进程信息更加清晰(-v取反将查找的grep取消)

 因为查看进程的指令太长了,所以我们可以结合前面学的自动化构建工具 make ,编写一个 Makefile 文件,文件内容如下所示:

 

myprocess:process.c
        gcc -o myprocess process.c

.PHONY:clean
clean:
        rm -r myprocess

.PHONY:catP
catP:
        ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep

 其中的 make catP 指令就是我们刚刚查看 进程 的那一大串指令

 

top指令 

$ top

 这个指令之前有介绍过,相当于Windows中的 ctrl+alt+del 调出任务管理器一样,top 指令能直接调起 Linux 中的任务管理器,显然,任务管理器中包含有进程相关信息

 

 父子进程

进程间存在 父子关系

比如在当前 bash 分支下运行程序,那么程序的 父进程 就是当前 bash 分支

其中,PID 是当前进程的ID,PPID 就是当前进程所属 父进程 的ID
我们一样可以通过函数来查看 父进程 的ID值

 

 fork创建进程

 fork 函数是一个非常重要的函数,它能在当前进程下主动创建 子进程 ,用于程序中
编写代码如下:

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

/*
 * 测试fork创建子进程
 * 理解fork函数的返回值
 * 通过if语句进行分流
 * 总结:fork创建子进程成功时,给父进程返回子进程PID,给子进程返回0,
 如果失败返回-1;通过两次fork可以发现当父进程执行后,才会去执行子进程,
 父子进程间存在独立性,即父进程被kill后,子进程任然可以运行,父子进程间存在写时拷贝机制,
 当子进程的值发生改变时,只会作用于子进程中
 */

int main()
{
  pid_t ret = fork(); //获取返回值
  int val = 1;  //比较值
  if(ret == 0)
  {
    //在子进程内再创建(孙)子进程
    pid_t rett = fork();
    if(rett > 0)
    {
      while(1)
      {
        val = 2;  //写时拷贝
        printf("二代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);
        sleep(1);
      }
    }
    else if(rett == 0)
    {
      while(1)
      {
        val = 3;  //写时拷贝
        printf("三代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);
        sleep(1);
      }
    }
    else
      printf("进程创建失败\n");
  }
  else if(ret > 0)
  {
      while(1)
      {
        val = 1;  //写时拷贝
        printf("一代进程正在执行 PID:%d PPID:%d 比较值为:%d 地址:%p\n\n", getpid(), getppid(), val, &val);
        sleep(1);
      }
  }
  else
    printf("进程创建失败\n");

  return 0;
}

 

 

不难发现,子进程 是否出现取决于在当前进程中是否调用 fork 函数

fork函数工作原理:

fork 创建子进程时,会新建一个属于子进程 的 PCB ,然后把父进程 PCB 的大部分数据拷贝过来添加自己属性,暂时两者共享一份代码和数据。
各进程间是相互独立的,包括父子进程。这句话的含义是当我们销毁 父进程 后,它所创建的 子进程 并不会跟着被销毁,而是被 init 1号进程接管,成为一个 孤儿进程。
具体表现如下:

 fork 创建子进程时还存在 写时拷贝 这种现象,即存在一个全局变量,当父进程的改变值时,不会影响子进程的值,同理子进程也不会影响父进程,再次印证 相互独立 这个现象。

 

父子进程相互独立的原因:

代码是只读的,两者互不影响
数据:当其中一个执行流尝试修改数据时,OS 会给当前进程触发发生写时拷贝,随着进程的推进,会进行详细介绍。

小结:

bash 命令行解释器本质上也是一个进程,可以被销毁
命令行启动的所有程序,最终都会变成进程,而该进程对应的父进程都是 bash
父进程被销毁后,子进程会变成 孤儿进程
进程间具有独立性,包括父子进程
因为 写时拷贝 机制,父进程不会影响到子进程

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Web】云服务器的购买与使用

目录 一、云服务器的选择 二、配置 一、云服务器的选择 腾讯云、阿里云都可以 有首次试用、学生打折啥的。 租借时间、配置都可以自行选择 二、配置 先进行重置密码、拍摄快照

HCS 华为云Stack产品组件

HCS 华为云Stack产品组件 Cloud Provisioning Service(CPS) 负责laas的云平台层的部署和升级是laas层中真正面向硬件设备&#xff0c;并将其池化软件化的部件。 Service OM 资源池(计算/存储/网络)以及基础云服务(ECS/EVS/PC)的管理工具。 ManageOne ManageOne包括服务中心…

【服务器Midjourney】创建部署Midjourney网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

python tkinter 界面开发基本结构

python tkinter 界面开发基本结构 # -*- coding:utf-8 -*- import tkinter as tkroot_window tk.Tk() # 设置窗口title root_window.title(tkinter 界面开发) # 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x" root_window.geometry(600x500) # 更改…

C++: 内联函数

目录 概念&#xff1a; 与宏的对比&#xff1a; 函数膨胀&#xff1a; 内联函数的特性&#xff1a; 概念&#xff1a; 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数…

Git分布式版本控制工具

1、目标 了解Git基本概念 能够概述git工作流程 能够使用Git常用命令 熟悉Git代码托管服务 能够使用idea操作git 2、概述 2.1、开发中的实际场景 场景一&#xff1a;备份 小明负责的模块就要完成了&#xff0c;就在即将Release之前的一瞬间&#xff0c;电脑突然蓝屏&…

算法基础课-数据结构

单链表 题目链接&#xff1a;826. 单链表 - AcWing题库 思路&#xff1a;AcWing 826. 单链表---图解 - AcWing 需要注意的点在于理解ne[idx] head&#xff0c;idx表示当前的点&#xff0c;意思是将当前的点链到头结点的后面&#xff0c;再将头结点链在当前idx的前面。 #inc…

2024-01-24-redis4

秒杀活动 需求&#xff1a;库存中有10件商品 商品的信息自定义 同时有100个人去抢购&#xff08;这里100个人的抢购由jmeter来模拟&#xff09; jmeter的使用 在idea中将后台代码实现 package org.aaa.controller;import org.apache.commons.lang3.StringUtils; import org.sp…

goland课程管理(6)

项目目录结构如下图所示&#xff1a; core包下面&#xff1a; class.go package coreimport "github.com/gin-gonic/gin"func Class1(ctx *gin.Context) {}course.go package coreimport (. "cookie/database". "cookie/model""fmt"…

服务端开发小记02——Maven

这里写目录标题 Maven简介Maven在Linux下的安装Maven常用命令 Maven简介 Apache Maven Project是一个apache的开源项目&#xff0c;是用于构建和管理Java项目的工具包。 用Maven可以方便地创建项目&#xff0c;基于archetype可以创建多种类型的java项目&#xff1b;Maven仓库…

华为三层交换机与防火墙对接配置上网示例

三层交换机与防火墙对接上网配置示例 组网图形 图1 三层交换机与防火墙对接上网组网图 三层交换机简介配置注意事项组网需求配置思路操作步骤配置文件 三层交换机简介 三层交换机是具有路由功能的交换机&#xff0c;由于路由属于OSI模型中第三层网络层的功能&#xff0c;所以…

VMware 虚拟机环境下的ubuntu 上安装mysql,并能远程访问数据库

需求&#xff1a;为了实现在linux上模拟服务器跑代码&#xff0c;并存储在mysql上&#xff0c;通过远程可视化mysql数据库软件查看linux上mysql数据库数据的实时动态。 1. 虚拟机和ubuntu的安装 这里我选择的是VMware workstation-v14, ubuntu-18.04.1。至于体流程网上很多&a…

基于Java的高校运动会管理系统的设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的 系统功能测试 系统测试结论 代码参考 数据库参考 源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、…

Django ORM 框架中的表关系,你真的弄懂了吗?

Django ORM 框架中的表关系 前言 Django ORM 框架中的表关系 为了说清楚问题&#xff0c;我们设计一个 crm 系统&#xff0c;包含五张表&#xff1a; 1.tb_student 学生表 2.tb_student_detail 学生详情表 3.tb_salesman 课程顾问表 4.tb_course 课程表 5.tb_entry 报名表…

Vue2.0+Element实现日历组件

(壹)博主介绍 &#x1f320;个人博客&#xff1a; 尔滨三皮⌛程序寄语&#xff1a;木秀于林&#xff0c;风必摧之&#xff1b;行高于人&#xff0c;众必非之。 (贰)文章内容 1、安装依赖 npm install moment2.29.4 --savenpm install lunar0.0.3 --savenpm install lunar-java…

C语言数据结构——链表

&#xff08;图像由AI生成&#xff09; 0.前言 在计算机科学中&#xff0c;数据结构是存储和组织数据的一种方式&#xff0c;它不仅影响数据的存储&#xff0c;也影响数据的检索和更新效率。C语言&#xff0c;作为一种经典的编程语言&#xff0c;提供了灵活的方式来处理数据…

OkHttp完全解读

一&#xff0c;概述 OkHttp作为android非常流行的网络框架&#xff0c;笔者认为有必要剖析此框架实现原理&#xff0c;抽取并理解此框架优秀的设计模式。OkHttp有几个重要的作用&#xff0c;如桥接、缓存、连接复用等&#xff0c;本文笔者将从使用出发&#xff0c;解读源码&am…

iOS 文件分割保存加密

demo只是验证想法&#xff0c;没有做很多异常处理 默认文件是大于1KB的&#xff0c;对于小于1KB的没有做异常处理demo中文件只能分割成2个&#xff0c;可以做成可配置的N个文件分割拼接还可以使用固定的二进制数据&#xff0c;拼接文件开头或结尾 不论哪种拼法&#xff0c;目的…

牛客周赛30

思路&#xff1a;先把x, y除以最大公约数变成最小值&#xff0c;然后同时乘以倍数cnt&#xff0c;只记录两个数都在[l,r]间的倍数。 代码&#xff1a; int gcd(int a,int b){return b ? gcd(b, a % b) : a; }void solve(){int x, y, l, r;cin >> x >> y >>…

两两交换链表中的结点---链表OJ

https://leetcode.cn/problems/swap-nodes-in-pairs/description/?envType=study-plan-v2&envId=top-100-liked 1、递归 创建newhead = head->next,然后将head->next->next作为递归参数,返回值用head->next接收;递归结束条件是:没有结点或者只有一…