ps做图游戏下载网站有哪些/关键词免费网站
在讲进程之前首先就是需要去回顾一下我们之前学的操作系统是干嘛的,首先操作系统是一个软件,它是对上提供一个良好高效,稳定的环境的,这是相对于用户来说的,对下是为了进行更好的软硬件管理的,所以操作系统是一个进行软硬件管理的软件。
实际上我们的硬盘,键盘和显示器这些是我们的硬件,但是操作系统是不能直接对我们的硬件进行控制,所以操作系统和我们的硬件中还有一层就是我们的驱动程序,那还有就是我们的用户是不能直接对我们的操作系统进行访问的,都会通过系统调用的方式来对我们的操作系统进行访问,这些都是我们来学习今天文章内容的前言部分,那下面开始我们对进程内容的了解。
进程的概念
进程简单点来了解我们可以就认为它就是一个可执行的程序,也就是磁盘里的文件,然后进行运行起来,那我们在学C语言的时候都知道我们的可执行文件先是在磁盘里的,我们运行的时候,是要把磁盘文件加载到内存当中的,然后我们的内存里存的是这个可执行文件的数据,也就是代码加上数据。
但是被加载到内存当中的程序对进程的描述是不完整的,下面我来画张图,也就能方便大家来了解进程了。
先描述再组织
操作系统中里面可能一下子加载了很多的进程,就像我们的任务管理器是一样的,当我们打开任务管理器的时候我们就不难发现可以存在很多个进程,所以操作系统里面如果有大量的进程也是很正常的。所以讲一个程序加载到内存的时候,不仅仅是要把代码和数据加载到内存当中,同时也会产生一个结构体我们叫他为PCB(process control block),好像是叫这个。反正它是一个结构体,里面存放的是这个进程的属性加上下一个PCB结构体的指针,还有就是一个内存指针,指向的就是我们的内存里的代码和数据。
看下面的这个图
所以操作系统对进程的管理最后就是对链表的增删查改
最后就是我们讲了这么多,进程其实就是
进程 == PCB结构体 + 代码和数据
这里也就是符合我们讲的先描述(结构体) 再组织(链表)
这里再给大家加个餐,我们之前说操作系统其实就是一款对软硬件进行管理的软件,我们也可以认为操作系统再我们电脑开机的时候也是存放在我们的磁盘当中的,我们认为它就是一个二进制的文件。
所以开机的时候我们发现我们的电脑不是马上开机的,而是等待一会然后进行开机的,那么这几秒的时间就是把操作系统的这个软件的数据拷贝到内存当中去的,然后我们的操作系统就会根据我们的进程来进行malloc出PCB的结构体,有几个进程就malloc几个PCB出来,最后再进行链接。
所以操作系统对进程的管理不是对我们的可执行程序进行管理,而是对我们的结构体PCB进行管理的
系统的接口
操作系统如果是想给我们提供服务的话,我们用户是不能直接对我们的操作系统进行访问的,原因呢就是如果我们改动我们操作系统中的数据和一些数据结构的化,我们的操作系统就不能给我们用户提供很好的服务,就比如操作系统其实就是我们的银行,如果我们要去存钱或者取钱的时候,难道银行是直接把小金库暴露给我们吗,我们是直接用银行电脑给我们的余额加上5个0的吗,那这样不就乱套了吗,所以我们如果想要访问我们的操作系统的时候,我们就需要利用好我们的系统调用接口或者标准库来对我们的操作系统进行访问,如果我们直接对操作系统进行访问的化就和我们直接去抢银行是没有区别的。
简单点我们就可以这样认为这个是操作系统的内核
总结:我们操作系统要运行我们的进程的时候,这个排队的过程就是让我们的PCB结构体进行排队,而不是内存中的代码和数据进行排队。
理解一个概念:什么是动态运行?
我么可以理解为PCB在不同的队列中,进程就可以访问不同的空间。
进程的查看
引入话题
在我们考上大学的时候,我们的大学(监狱,不想上学)都会给新生一个编号
也就是我们的学号,我们每个人都是有一个不一样的学号,那么进程也是这个样子的,所以我们需要了解的就是进程的标识符我们可以称作为pid。
pid : 在每一个进程中,都会存在唯一的标识符也就是我pid
我们可用用指令来查看进程的pid
这是一个Makefile里面写的代码,还有一个就是我们.c文件里写的代码,我们在我们的右边重新开一个,方便我们进行观察,这样我们的代码就跑起来,这个时候就是一个进程在跑,我们在左边可以执行指令来进行查看。
ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep
grep -v grep 是不查看该条指令的进程,因为我们的指令其实就是一个可执行的文件,也是一个进程,所以执行这个就可以屏蔽该进程。
我们都知道,我们的代码在进行预处理,编译,汇编,还有链接之后就会形成可执行文件,我们可以用指令开查看我们的文件是不是可执行文件。
file之和发现它是一个可执行的文件。
通过proc目录来查看进程信息
在 / 下的路径下有一个proc,我们也可以在这个里面来查看进程。
我们上面引进的pid就可以用上了,pid是我们进程的唯一标识符,认识函数getpid,通过man手册进行查询
这是获取pid的函数,我们上面的指令也可以查看pid
ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep
当我们进程在跑的时候,上面的这个pid也就是我们进程的标识符,我们也可以在代码里获取pid,来改写一下代码。
这里大家可能是会有疑问的,因为我上面的进程pid已经进行改变了,这是为什么呢???
因为我们每次执行我们的代码的时候,它就是创建出一个进程,所以pid当然是不一样的。
我们这个时候也就可以在proc的目录下查看一些到底是不是存在这个进程呢。
proc下也是真的有这个目录的(哇,真的是你啊(好大声)) 。
我们也可以查看一些他们的属性,加上 -al就可以来看看细节了。
我们只需要关注图中画红的部分就可以了。exe其实就是可执行文件,因为这些文件都是该进程下的,我们知道我们的进程 == 代码和数据 + 内核的数据结构,每个进程都有相对于的task_struct
也就是我们之前讲的PCB,PCB里是有它的属性的,这个是我们知道,所以exe相当于告知该进程对应的磁盘上哪个是可执行文件,也就是对应的磁盘文件。
那cwd就是当前的工作路径,这个和我们的pwd是同一个路径。
做个小实验
现在我们就来改改我们的代码,我们在C语言的时候是讲过fopen函数的时候,如果我们是以写的方式打开的化,没有这个文件的时候也是会创建出新的文件出来的,而且是在当前工作路径下创建的,我们可以来看看代码应该怎么进行修改呢,
我们的代码进行这样子修改后发现在当前的路径下也是创建出来新的文件了,所以cwd就是指的当前的工作的路径。
获取父进程的pid
前面也是讲过我们是如何获得进程的pid,但是我们也有办法来获得它的父进程的pid在执行下面的进程的时候,我们看到的ppid就父进程的pid
ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep
那也是有办法来查看我们的ppid,就是函数getppid,用man手册进行查询来看看。
这个就是我们来查询ppid的函数,直接来尝试怎么使用。
我们就可以查询到我们的父进程的pid,而且发现父进程每次重新启动的时候都是不变的,。
发现每次的子进程的pid是改变了,但是父进程的pid是没有进行改变的
这是为什么呢,我们来尝试看看它的父进程是怎么个事。
竟然就是我们的bash进程,那我们是不是可以猜测很多父进程的父进程他们都是-bash
答案是的 ,他们都是-bash的子进程
使用fork()函数创建子进程
fork函数就是专门创建子进程而生的!!!!!
我们可以用man手册进行查询。
FORK(2) Linux Programmer's Manual FORK(2)NAMEfork - create a child processSYNOPSIS#include <unistd.h>pid_t fork(void);DESCRIPTIONfork() creates a new process by duplicating the calling process. The newprocess, referred to as the child, is an exact duplicate of the calling process,referred to as the parent, except for the following points:* The child has its own unique process ID, and this PID does not match the ID ofany existing process group (setpgid(2)).* The child's parent process ID is the same as the parent's process ID.* The child does not inherit its parent's memory locks (mlock(2), mlockall(2)).* Process resource utilizations (getrusage(2)) and CPU time counters (times(2))are reset to zero in the child.* The child's set of pending signals is initially empty (sigpending(2)).* The child does not inherit semaphore adjustments from its parent (semop(2)).* The child does not inherit record locks from its parent (fcntl(2)).* The child does not inherit timers from its parent (setitimer(2), alarm(2),timer_create(2)).* The child does not inherit outstanding asynchronous I/O operations from itsparent (aio_read(3), aio_write(3)), nor does it inherit any asynchronous I/Ocontexts from its parent (see io_setup(2)).The process attributes in the preceding list are all specified in POSIX.1-2001.The parent and child also differ with respect to the following Linux-specificManual page fork(2) line 1 (press h for help or q to quit)
凑个子树哈哈哈哈哈哈。
我们可以看到引入的头文件就是unistd这个头文件。
我们可以往下看,发现fork的返回值是有两个返回值的,这个意味着我们有两个返回值(好像什么都没说),我们可以在在代码里看看它是怎么返回两个值的,首先就是他们fork后面创建出子进程之和他们的代码是共享的(包括return0)
我们先写一个代码来看看到底是怎么实现的,
#include <stdio.h>2 #include <sys/types.h>3 #include <unistd.h>4 //int main()5 //{6 // while(1)7 // {8 // printf("I am process : pid %d ppid %d\n",getpid(),getppid());9 // sleep(1);10 // }11 //}12 //13 //14 int main()15 {16 fork();17 printf("hello students\n"); 18 }
~
我们来看看效果是怎么样的呢。
我去,竟然是打印了两次,那就更能确定一点的就是我们这里是存在连个进程的,不信我们可以使用查看进程的指令来看看,但是因为这个代码是一下子就结束了,那么我们的进程也被kill,所以我们是无法查看的,那在写一个其他的代码。
代码
int main()21 {22 printf("I am process\n");23 sleep(3);24 pid_t p = fork();25 if(p ==0)26 {27 //child28 while(1)29 {30 printf("I am child process pid %d ppid %d\n",getpid(),getppid());31 sleep(1); 32 }33 }34 else35 {36 37 while(1)38 {39 printf("I am parent process pid %d ppid %d\n",getpid(),getppid());40 sleep(1);41 }42 43 }44 45 46 }
我们看效果和代码发现为什么它能有两个返回值,又能进行if的语句,也能执行fork的语句,如果单单是从语言角度去看的化就不是这个样子的,所以我们应该是来看fork函数,fork函数就是创建子进程的,我们可以理解为fork之后的代码是共享的,因为我们每个函数包括是main函数也是有返回值的,所i有有两个返回值,那返回值为0的时候就是child,如果返回值是>0的时候就是paernt的进程,这样的化就会产生两个进程。所以会产生的进程就是两个。
那么我们还有个问题就是fork函数之后,我们的操作系统是做了什么呢。
我们知道进程的组成就是task_struct +进程的代码和数据
我们可以认为子进程是继承了父进程的代码和数据的,但是还是要强调的是我们代码是继承的,但是数据得独立,这样也就能造成为什么我们的返回值是两个的原因。代码共享就会导致一定有两个返回值。
今天的分享就到这里了。我们下次再见。
相关文章:

进程的概念 | PCB | Linux下的task_struct | 父子进程和子进程
在讲进程之前首先就是需要去回顾一下我们之前学的操作系统是干嘛的,首先操作系统是一个软件,它是对上提供一个良好高效,稳定的环境的,这是相对于用户来说的,对下是为了进行更好的软硬件管理的,所以操作系统…...

【GPT-SOVITS-03】SOVITS 模块-生成模型解析
说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…...

2024HVV行动-进军蓝中研判(log4j2、fastjson、Struts2、Shiro)
1、log4j2 特征: 恶意请求中包含 JNDI 协议地址,如"ldap://"、"rmi://"等,被 log4j2 解析为 JNDI 查找。 原理: 在日志输出中,未对字符进行严格的过滤,执行了 JNDI 协议加载的远程恶…...

亮点抢先看!4月16-17日,百度Create大会开设“AI公开课”,大咖带你打造赚钱工具
3月16日,2024百度Create AI开发者大会正式开放售票,嘉宾套票定价399元。据悉,本次大会以“创造未来(Create the Future)”为主题,设有20深度论坛、超30节AI公开课、3000平AI互动体验区和AI音乐节等精彩环节…...

【笔记本清灰/实用经验】荣耀Magicbook14-2020款-R5-4500U-清灰实战
清灰有风险,动手需谨慎,本文只分享本人的清灰过程,对使用它所产生的任何后果不任何负责任 文章目录 背景信息准备阶段工具准备信息收集 正式清灰初始化清灰流程放掉身体的静电(重要)拆笔记本后盖断开电源(重…...

如何写好Stable Diffusion的prompt
Stable Diffusion是一种强大的文本到图像生成模型,其效果在很大程度上取决于输入的提示词(Prompt)。以下是一些关于如何编写有效的Stable Diffusion Prompt的秘诀: 明确描述:尽量清晰地描述你想要的图像内容。使用具体…...

计算机毕业设计 | SpringBoot+vue 移动端社区物业管理系统(附源码+论文)
1, 概述 课题背景 近几年来,随着物业相关的各种信息越来越多,比如报修维修、缴费、车位、访客等信息,对物业管理方面的需求越来越高,我们在工作中越来越多方面需要利用网页端管理系统来进行管理,我们所需…...

玩转C语言——数组初探
一、前言 通过前面的学习,我们已了解C语言的结构变量、分支结构和循环结构。今天,我们一起来认识C语言的另一知识点——数组。先赞后看,养成习惯。 二、数组概念 学习数组,我们要明白数组是什么。在我看来:数组是⼀组…...

Nginx指令配置大全
基本命令 nginx -t 检查配置文件是否有语法错误 nginx -s reload 热加载,重新加载配置文件 nginx -s stop 快速关闭 nginx -s quit 等待工作进程处理完成后关闭配置块介绍 全局块 全局块是默认配置文件从开始到events块之间的…...

富格林:安全出金关注可信操作
富格林悉知,现货黄金投资凭借着诸多优势,成为了热门的投资产品之一,也获得了投资者的追捧。在投资中想要安全盈利出金,投资者一定要沉下心来学习专业知识和技术,这样才能在以后的投资操作中避免亏损,顺畅盈…...

DELETE、TRUNCATE 和 DROP 在MySQL中的区别及使用示例
在MySQL数据库中,DELETE、TRUNCATE TABLE 和 DROP 这三个命令分别适用于不同的数据删除需求,它们在工作原理、应用场景以及特性上有所区别。接下来,我们通过实例演示来明确这三者的不同之处。 DELETE 命令 功能与示例:DELETE 语…...

程序员应该如何选择职业赛道?
程序员选择职业赛道是一个涉及个人兴趣、技能匹配、市场需求和长远发展规划的综合决策过程。以下是一些关键步骤和考虑因素: 自我评估: 技能与专长:分析自己在编程语言、算法、数据结构等方面的现有技能,并思考这些技能更适合前端…...

深入浅出Hive性能优化策略
我们将从基础的HiveQL优化讲起,涵盖数据存储格式选择、数据模型设计、查询执行计划优化等多个方面。会的直接滑到最后看代码和语法。 目录 引言 Hive架构概览 示例1:创建表并加载数据 示例2:优化查询 Hive查询优化 1. 选择适当的文件格…...

利用卷积神经网络进行人脸识别
利用卷积神经网络(Convolutional Neural Networks, CNNs)进行人脸识别是计算机视觉领域的一个热门话题。下面是一个简化的指南,涵盖了从理论基础到实际应用的各个方面,可以作为你博文的基础内容。 理论基础 卷积神经网络简介&am…...

固态硬盘有坏道怎么恢复数据 固态硬盘坏道怎么修复
固态硬盘是一种高速、低噪音、低功耗的存储设备,但是它也有一个致命的问题——坏道。坏道是指存储芯片中的某些存储单元出现了故障,导致数据无法正常读取或写入。如果你的固态硬盘出现了坏道,那么你的数据就有可能会丢失,带来了很大的困扰。那么,固态硬盘有坏道怎么恢复数…...

adobe animate 时间轴找不到编辑多个帧按钮
如题,找了半天,在时间轴上找不到编辑多个帧按钮,导致无法批量处理帧 然后搜索发现原来是有些版本被隐藏了,需要再设置一下 勾选上就好了...

5 亿欧元巨额奖励!法国国防部启动量子初创公司项目
内容来源:量子前哨(ID:Qforepost) 编辑丨王珩 编译/排版丨沛贤 深度好文:800字丨6分钟阅读 据C4ISNET报道,法国国防部采购机构宣布向五家法国量子计算研究初创公司授予合同,用于开发量子计算技…...

Linux:系统初始化,内核优化,性能优化(2)
优化ssh协议 Linux:ssh配置_ssh配置文件-CSDN博客https://blog.csdn.net/w14768855/article/details/131520745?ops_request_misc%257B%2522request%255Fid%2522%253A%2522171068202516800197044705%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fb…...

JS08-DOM节点
DOM节点 查找节点 父节点 通过.parentNode属性可以获得某个元素的父节点,并对其进行操作。例如,隐藏.son元素的父节点。 <div class"father"><div class"son">儿子</div></div><script>let son d…...
2024/3/14打卡棋子(14届蓝桥杯)——差分
标准差分模板 差分——前缀和的逆运算(一维二维)-CSDN博客 题目 小蓝拥有 nn 大小的棋盘,一开始棋盘上全都是白子。 小蓝进行了 m 次操作,每次操作会将棋盘上某个范围内的所有棋子的颜色取反(也就是白色棋子变为黑色࿰…...

A Survey on Multimodal Large Language Models
目录 1. Introduction2. 概述方法多模态指令调优 3.1.1 简介3.1.2 预备知识3.1.3 模态对齐3.1.4 数据3.1.5 模态桥接3.1.6 评估 3.2.多模态情境学习3.3.多模态思维链3.3.1 模态桥接3.3.2 学习范式3.3.3 链配置3.3.4 生成模式3.4.LLMs辅助视觉推理3.4.1 简介3.4.2 训练范式3.4.3…...

Java面向对象编程(高级)一
在Java中,面向对象编程更是核心设计理念之一,为开发者提供了丰富的工具和特性来创建灵活、可扩展的应用程序。 本博客将深入探讨Java面向对象编程的高级特性,包括但不限于多态、继承、封装、抽象类、接口等方面的内容。我们将从实际案例出发…...

1056:点和正方形的关系
【题目描述】 有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是…...

【iOS】ARC学习
文章目录 前言一、autorelease实现二、苹果的实现三、内存管理的思考方式__strong修饰符取得非自己生成并持有的对象__strong 修饰符的变量之间可以相互赋值类的成员变量也可以使用strong修饰 __weak修饰符循环引用 __unsafe_unretained修饰符什么时候使用__unsafe_unretained …...

数据分析 | Matplotlib
Matplotlib 是 Python 中常用的 2D 绘图库,它能轻松地将数据进行可视化,作出精美的图表。 绘制折线图: import matplotlib.pyplot as plt #时间 x[周一,周二,周三,周四,周五,周六,周日] #能量值 y[61,72,66,79,80,88,85] # 用来设置字体样式…...

mac npm install 很慢或报错
npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/pnpm failed, reason: certificate has expired 1、取消ssl验证: npm config set strict-ssl false 修改后一般就可以了,…...

100天精通Python(实用脚本篇)——第118天:基于selenium和ddddocr库实现反反爬策略之验证码识别
文章目录 专栏导读一、前言二、ddddocr库使用说明1. 介绍2. 算法步骤3. 安装4. 参数说明5. 纯数字验证码识别6. 纯英文验证码识别7. 英文数字验证码识别8. 带干扰的验证码识别 三、验证码识别登录代码实战1. 输入账号密码2. 下载验证码3. 识别验证码并登录 书籍推荐 专栏导读 …...

51单片机与ARM单片机的区别
51的MCU与ARM的MCU的区别 51单片机与ARM单片机区别主要体现在以下几个方面: 指令集架构(ISA): 51单片机:基于Intel 8051架构,采用的是CISC(复杂指令集计算机)设计,其指令…...

Android 10.0 mtk平台系统添加公共so库的配置方法
1.前言 在10.0的系统定制化开发中,由于 Android对应用应用的系统库限制越来越严格,上层应用包括(apk、jar包)不能直接引用系统的一些so库了。如果需要使用,只能使用,系统申明的公共库。 如果使用非系统申明的公共库,apk运行后调用该so库时,app会直接挂掉,或者系统开发…...

simulink平面五杆机构运动学仿真
1、内容简介 略 68-可以交流、咨询、答疑 2、内容说明 simulink平面五杆机构运动学仿真 [ 摘 要 ] 以 MATLAB 程序设计语言为平台 , 以平面可调五杆机构为主要研究对象 , 给定机构的尺寸参数 , 列出所 要分析机构的闭环矢量方程 , 使用 MATLAB 软件中 SIMULINK 仿真工…...