[Linux入门]---进程的概念
文章目录
- 1.进程的概念
- ①描述进程-PCB
- ②task_struct-PCB的一种
- ③task_ struct内容分类
- 2.查看进程
- 3.通过系统调用获取进程表示符
- 4.通过系统调用创建进程---fork初识
1.进程的概念
在我们的电脑开机的时候,操作系统会被加载到内存中,点击多个应用进行时,那么将有多个应用的进程会被加载到内存中的操作系统上。说明一个操作系统不仅仅可以运行一个进程,而且可以运行多个进程!既然,有多个进程了,那么就需要将这些进程有条不紊地管理起来,那操作系统是如何管理进程的呢?
先描述,在组织
:任何一个进程加载到内存中形成真正的进程时,操作系统要创建描述
进程的结构体对象;接下来便是将这些进程信息块组织起来
,使用双链表的数据结构进行管理!
在很多人的理解中,一个加载到内存中的程序叫做进程,或者正在运行的程序叫做进程,其实这些都是片面的理解!假如你被复旦大学录取了,难道就可以说你是复旦大学的学生了吗?当然不是的!你被录取了表明你的档案信息已经被该大学收录了,而要想真正成为该大学的学生!到开学的时候,你要拿着录取通知书到复旦大学入学报到,这个时候你才真正成为了复旦大学的学生!同理,进程应该包括描述进程的信息和需要处理的代码和数据!
①描述进程-PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为
进程属性的集合
- 进程=内核
PCB
数据结构对象+自己的数据和代码
②task_struct-PCB的一种
- 在
Linux
中描述进程的结构体叫做task_struct
。- 课本上称之为
PCB(process control block)
,Linux
操作系统下的PCB
:task_struct
③task_ struct内容分类
标示符
:描述本进程的唯一标示符,用来区别其他进程。状态
:任务状态,退出代码,退出信号等。优先级
:相对于其他进程的优先级。程序计数器
:程序中即将被执行的下一条指令的地址。内存指针
:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针上下文数据
:进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。I/O状态信息
:包括显示的I/O
请求,分配给进程的I/O
设备和被进程使用的文件列表。记账信息
:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。其他信息
2.查看进程
PID
为子进程标志,相当于学生的学号。- 进程的信息可以通过
/proc
系统文件夹查看
输入ls /proc/
指令,可以看到不同PID的文件
+ 大多数进程信息同样可以使用
top和ps
这些用户级工具来获取
创建myprocess.c
文件,如下:
#include<stdio.h>
#include<unistd.h>
int main()
{ while(1) { printf("我是一个进程....\n"); sleep(1); } return 0;
}
创建自动化构建文件Makefile
文件,如下:
myprocess:myprocess.c gcc -o $@ $^
.PHONY:clean
clean: rm -rf myprocess
Xshell代码运行的结果如下:
在另一个窗口输入如下指令:
$ ps ajx | head &&ps ajx | grep myprocess//获取含myprocess的进程PID
指令运行的结果如下:
./myprocess
为正在运行的可执行程序,grep --color=auto myprocess
为刚才我们运行的获取PID指令中包含了myprocess
,说明输入的指令在系统中变成了进程运行。
可以使用如下指令过滤掉grep myprocess
进程:
$ ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep
关闭进程的指令:
$ ps -9 进程的PID//杀进程
查看进程文件:
$ ls /proc/4356/ -l //获取PID为4356的进程文件详细信息
进程文件详细信息部分截图如下:
3.通过系统调用获取进程表示符
在前面操作系统的学习中,操作系统通过数据结构将描述
的进程信息组织起来
管理,我们作为普通用户很难和操作系统打交道,所以不能直接获取当前进程PID;但是可以通过操作系统上层封装的系统调用接口,获取PCB结构描述的信息,接下来让我们认识两个系统调用接口:
getpid()
:获取子进程PID
的信息。
getppid()
:获取父进程PPID
的信息。
创建proc.c
文件,写入如下代码:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{ printf("我是一个子进程,pid为:%d\n",getpid()); printf("我是一个父进程,ppid为:%d\n",getppid()); return 0;
}
代码运行的结果为:
重新运行
./proc
文件,其子进程一直在变(比如某学生高考失利进入复旦大学时,他可以获得一个学号,当他第二年复读再次考入复旦大学时,他又获得一个学号,而这两个学号是不同的),而父进程一直都不变。
$ ps ajx | head -1 && ps ajx | grep 3216 //父进程
父进程
ppid
为bash
命令行进程,给我们输入指令的!
4.通过系统调用创建进程—fork初识
使用man
指令,查找fork
函数的信息
解释:
fork函数创建一个新的进程,让当前的父进程返回当前的子进程,创建新的子进程返回0。
eg1:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h> int main()
{ printf("我是使用fork()之前的语句\n"); pid_t ret=fork(); printf("我是使用fork()之后的语句\n"); return 0;
}
代码运行的结果为:
可以发现
fork()
函数创建新的子进程,当前的进程执行了printf
语句,创建的进程执行了一遍的printf
语句,所以fork()
后面的语句被执行两遍。
eg2:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{ printf("begin: 我是一个进程,pid:%d,ppid:%d\n",getpid(),getppid()); pid_t ret=fork(); if(ret==0) { while(1) { printf("我是子进程,pid:%d,ppid:%d\n",getpid(),getppid()); sleep(1); } } else if(ret>0) { while(1) { printf("我是父进程,pid:%d,ppid:%d\n",getpid(),getpid()); sleep(1); } } return 0;
}
代码运行的结果为:
指令:
while :; do ps ajx | head -1 ; ps ajx | grep proc |grep -v grep;sleep 1;done
在另一个窗口执行该指令:
使用fork函数创建新的进程,使用
if
语句,根据父进程返回当前的子进程(返回的值大于0),旧的子进程返回0,实现分流执行不同的代码。
问题1:为什么fork函数返回子进程,父进程返回当前的子进程?
一般而言fork函数之后的代码,父子进程共享;返回不同的值,让不同的执行流,执行不同的代码!
问题2:fork函数如何做到返回两次?
①创建子进程
PCB
;②填充PCB
的内容;③让父子进程共享同一份代码;④父子进程的task_struct
,可以被CPU调用…最后执行return
语句返回,return
语句之前fork
函数的主要工作已经完成了(即创建新的子进程),所以return
语句为父子进程共享的语句,所以父进程返回一次,子进程返回一次。
问题3:fork干了什么事?
进程之间是不会相互影响,相互独立
:①fork
创建了子进程,子进程依据父进程为模板PCB模板创建自己的PCB
,指向父进程的代码;②那指向的数据是否相同呢?子进程和父进程刚开始指向的数据相同,当操作系统检测到子进程要修改数据时会开空间,会发生写时拷贝,但不是把父进程的数据全部拷贝,子进程只会拷贝自己能使用的数据,避免造成资源浪费。
问题4:一个变量怎么会有不同的内容?
我们已经知道了fork函数可以返回两次,并且同一个变量可以接收两次不同的值(即访问不同的内存)!那是怎么做到一块地址空间是怎么接收呢?我们后面再进行学习🎉🎉🎉
问题5:如果父子进程被创建好,fork往后,哪个进程被先运行呢?
哪个进程先运行,是由调度器(挑选进程)决定的,我们是不能确定的!
问题6:执行不同命令时子进程不同,但这些子进程的父进程都为bash进程,为什么呢?
bash
内部也是通过fork函数创建子进程的,bash
进程执行接收新的命令、打印出命令行提示符等任务,而bash
创建的子进程执行解释新的命令,所以我们当前运行的所有的命令都是bash
的进程。
相关文章:

[Linux入门]---进程的概念
文章目录 1.进程的概念①描述进程-PCB②task_struct-PCB的一种③task_ struct内容分类 2.查看进程3.通过系统调用获取进程表示符4.通过系统调用创建进程---fork初识 1.进程的概念 在我们的电脑开机的时候,操作系统会被加载到内存中,点击多个应用进行时&a…...

Leetcode—— 20.有效的括号
20. 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭…...

视频播放器的技术组成
Qt视频播放器实现(目录) 什么是视频 我们这里讲的视频,通常也包括了音频。因为没有声音的画面播放几乎是不可接受的。 这样暗含了一个事实,那就是视频总是包括视频数据和音频数据两部分。 Video 表示视频; Audio …...

Stable Diffusion 系统教程 | 强大的ControlNet 控制网
2023年的2月13日,一款名叫ControlNet的插件横空出世,AI绘画变得更加可控 ControlNet直译过来很简单,就叫做控制网,开发者是一名华裔,毕业于苏州大学,目前在斯坦福做读博士一年级,大佬大佬&…...

Hadoop-sqoop
sqoop 1. Sqoop简介及原理 简介: Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysq1.postgresql..)间进行数据的传递,可以将一个关系型数据库(例如: MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop 的HDFS中&…...

[论文阅读]YOLOV1:You Only Look Once:Unified, Real-Time Object Detection
摘要 我们提出了YOLO,一种新的目标检测方法。之前的目标检测工作重新使用分类器来执行检测。相反,我们将目标检测表述为空间分离的边界框和相关类概率的回归问题。单个神经网络在一次评估中直接从完整图像中预测边界框和类别概率。由于整个检测管道是一…...

Ubuntu 20.04 安装MySQL 8.0.34
MySQL安装 sudo wget https://cdn.mysql.com/archives/mysql-8.0/mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar下载MySQL文件。 sudo mkdir /mysql8创建目录。 sudo tar -xf mysql-server_8.0.31-1ubuntu20.04_amd64.deb-bundle.tar -C /mysql8进行解压。 需…...

MySQL 高级语句 Part1(进阶查询语句+MySQL数据库函数+连接查询)
高级语句 第一部分 一、MySQL进阶查询语句1.1 select ----显示表格中一个或数个字段的所有数据记录1.2 distinct ----不显示重复的数据记录1.3 where ----有条件查询1.4 and or ----且 或1.5 in----显示已知的值的数据记录1.6 between----显示两个值范围内的数据记录1.7 通配符…...
Rust免杀 Shellcode加载与混淆2
前言 这是半年前我学习Rust和免杀时的一些记录,最近打开知识库看到了这篇半年前的笔记,并且发现我常逛的安全社区都比较少有人分享Rust以及Rust免杀的帖子,于是想着将这篇笔记分享出来供大家参考和指正。由于我写这篇文章时也刚刚开始接触Ru…...

牛客java训练题 day1
9.24 day1 Q 1. this 指针是用来干什么的? 2.基类和派生类分别是指什么? 3.为什么方法中不能写静态变量 4. 解释一下ASCII码和ANSI码和两者的区别 5.简述j ava.io java.sql java.awt java.rmi 分别是什么类型的包 6. 看下面一段代码:…...

接口测试练习步骤
在接触接口测试过程中补了很多课, 终于有点领悟接口测试的根本; 偶是个实用派~,那么现实中没有用的东西,基本上我都不会有很大的概念; 下面给的是接口测试的统一大步骤,其实就是让我们对接口…...

Qt/C++音视频开发56-udp推流和拉流/组播和单播推流
一、前言 之前已经实现了rtsp/rtmp推流,rtsp/rtmp/hls/flv/ws-flv/webrtc等拉流,这种一般都需要依赖一个独立的流媒体服务程序,有没有一种更便捷的方式不需要这种依赖,然后又能实现推拉流呢,当然有的那就是udpp推流&a…...

人工智能轨道交通行业周刊-第61期(2023.9.18-9.24)
本期关键词:焊线机器人、智能综合运维管理系统、信号平面图、铁路部门架构、书生浦语大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通…...
for...in 和 for...of 的区别
for...in 和 for...of 都是 JavaScript 中的循环语句,但它们的作用和使用方式略有不同。 1、for..in 循环 for..in 循环用于遍历对象的可枚举属性,它会将对象的每个属性名称(或键名)作为迭代变量来遍历。 以下是 for...in 的基本语法 for (variable …...
高并发系统 - 接口幂等技术方案,高可用系统架构与技术选型
幂等概念来自于数学,在计算机科学中,幂等表示一次后、或多次请求某一资源,应该有同样的影响效果。 在业务表现上一般是同样的数据效果,下面就常用的业务场景,来聊聊幂等的技术方案。 ----------------- 数据层 ----------------- 索引与事务 根据业务需要,给表添加唯一索…...

简单的手机电脑无线传输方案@固定android生成ftp的IP地址(android@windows)
文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server 高级:固定android设备IP准备检查模块是否生效 windows 访问ftp服务器快捷方式命令行方式双击启动方式普通快捷方式映射新的网络位…...

Unity3D 检测鼠标位置的Sprite像素颜色
思路 获取鼠标所在屏幕坐标(Vector2)通过相机ScreenToWorldPoint(Vector3)转为世界坐标 (注意Vector3的z是距离相机的距离,相机需要正交)通过SpriteRenderer访问边界Bounds通过Bounds.Contain检测世界坐标是否在SpriteBounds内通过比例计算来确定在Sprite内的UV坐标…...
layui input 监听事件
//监听表单单选框复选框选择 form.on(radio, function (data) { console.log(data.value); //得到被选中的值 }); //监听表单下拉菜单选择 form.on(select, function (data) { console.log(data.value); //得到被选中的值 }); //监听表单复选框选择 …...

一致性思维链(SELF-CONSISTENCY IMPROVES CHAIN OF THOUGHT REASONING IN LANGUAGE MODELS)
概要 思维链已经在很多任务上取得了非常显著的效果,这篇论文中提出了一种 self-consistency 的算法,来代替 贪婪解码 算法。本方法通过 采样多个思维链集合,然后LLM模型生成后,选择一个最一致的答案作为最后的结果。一致性思维链…...

腾讯云16核服务器配置大全_16核CPU型号性能测评
腾讯云16核CPU服务器有哪些配置可以选择?可以选择标准型S6、标准型SA3、计算型C6或标准型S5等,目前标准型S5云服务器有优惠活动,性价比高,计算型C6云服务器16核性能更高,轻量16核32G28M带宽优惠价3468元15个月…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...