操作系统:进程

目录

1.进程

1.1.进程的基本概念

1.2.进程控制块(PCB)

1.3.进程与PCB

1.4.进程的其他知识 

1.4.1.进程与父进程

1.4.2.Linux中进程的创建方式 

1.4.3.进程详细信息查看


1.进程

1.1.进程的基本概念

*课本概念:程序的一个执行实例,正在执行的程序等

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

我们在实际使用计算机的场景中,操作系统会同时运行多个程序,也就是拥有多个进程,我们从操作系统的思想“先描述再组织”中可以知道,为了便于管理,就需要描述个体程序,然后用数据结构串联,这里也就是进程和程序的差别。 

用人话来说:进程是 可执行程序 加上 内核数据结构(PCB) 

1.2.进程控制块(PCB)

*进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

*课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct

 并且我们知道操作系统是c语言实现的,那么我们可以大致建模task_struct

// 对进程的描述
struct task_stcuct
{
	// ... 标识符、状态、优先级
	// ... 下一个进程的地址
	// ... 进程对应代码、数据的虚拟地址
    // ... 等等
};

管理进程的时候对该进程没关系,而只关乎进程的信息。进程对应的PCB作为操作系统便于管理的一个个体单位。

task_struct的串联

如图PCB的串联并不是直接用PCB设置内部指针来实现的,而是通过套上一个list结构体,在通过list里面的指针来进行连接,这样子会不会显得比较麻烦?但是我们想了想,如果只用内部指针,就如同一个一维的链表一样,即某个PCB只在一条链表上。实际场景中,某个PCB可能在多个链表中,甚至队列中、各种其他结构中!

那么如何找到task_struct的首地址呢?答:通过偏移量的计算来查找,对于上图就是

task_struct_current = (task_struct*)(int)&list - (int)&(task_struct*)0->list

1.3.进程与PCB

我们已经大概知道了进程与PCB,那么在实际上进程和PCB是如何配合的呢?接下来我们用一个程序的场景来描述一下。

当我们在运行多个程序时,即需要往内存中加载多个进程,就需要有多个PCB来对应各自的进程这样子能够有序的管理,并且操作系统会形成PCB链表。

那么最终我们发现CPU在运算时,直接读取PCB的信息找到进程再进行程序的运行。然后通过PCB链表进行下一个程序的运算,所以对于进程的管理最终变成了对链表的增删查改

1.4.进程的其他知识 

1.4.1.进程与父进程

如图,我们知道PID是当前进程的代号,PPID是当前进程父进程的代号,当我们在命令行中不断地终止再启用某个进程,会发现PID会改变,PPID却不变,这是为什么呢?首先进程是动态的,所以不同时间片下进程的代号分配会不一致,但是命令行的进程的父进程是固定的,我们通过过滤可以查看进程21070下

发现这个进程是bash,即为命令行解释器,那么有bash是命令行进程的父亲

1.4.2.Linux中进程的创建方式 

创建一个进程的,就是想操作系统中申请内存,保持当前进程的可执行程序和task_struct对象,并将tast_struct对象添加到进程列表中。

1.命令行中直接启动进程            ---通过bash手动创建

2.通过代码来进行进程创建         ---通过fork()函数自动创建

!!!另外启动进程,本质上是创建进程,一般是由父进程来创建。

!!! 通过系统调用创建进程---fork()函数 

fork()函数作用:创造一个子进程

*fork有两个返回值,给子进程返回0,给父进程返回进程PID

*父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)

  int main()
{
	int ret = fork();
	while(1)
    {
		if(ret < 0)
		{
		   perror("fork");    
		   return 1;
		}
		else if(ret == 0)
		{ //child
			printf("I am child, pid: %d,  ppid: %d, ret: %d\n", getpid(), getppid(), ret);
		}
		else
		{ //father
           printf("I am father, pid: %d, ppid: %d ret: %d\n", getpid(), getppid(),ret);
		}
		sleep(1);
     }
    sleep(1);
	return 0;
  }

这里当我们打印分别打印父子进程的&id会有一个地址对应两个值,这里我们在后续的进程地址空间会解释,就不在这用大篇幅说了!

这份代码体现了fork()函数能够创建两个进程,通过先创好的父进程,再创建子进程

我们在通过Linux的指令查看进程信息,发现一个fork()确实可以实现两个进程。

总结:

*子进程可以有多个,父进程只能有一个!父进程通过子进程标识来控制子进程。

*fork()函数前的代码由父进程执行,fork()后的代码由父子进程各自执行,也就是实现分流!

 这时我们开始思考为什么要创建子进程?试想一个场景,当我们在看视频时本质上就是加载数据,也就是需要边下载边播放,那么这个就是两部分操作独立进行,而通过fork()函数后,父子进程独立执行分流向各自的代码块进行操作。那么不就可以实现我们生活中的一些场景吗?

再结合我们进程会有相应的PCB,那么创建子进程后会以父进程为模版,为子进程创建PCB,并且和父进程共享代码和数据(当数据修改时,需要进行写时拷贝,各自拥有一份,防止破坏进程之间的独立性),并且在不同的时间片各自被CPU调度,继续往后执行,这里也体现了进程的独立性。

因为fork()中拥有两个进程,所以最后也return两个值,即fork()拥有两个返回值

1.4.3.进程详细信息查看

当我们运行进程时,通过PID我们可以找到该进程的临时文件夹,可以看到里面的信息

这里我们可以看到进程对应的exe文件的位置,就在跟code所在的文件夹test中,也就是在cwd中。那么cwd是什么呢?cwd是当前工作目录,因为进程启动时会找到当前工作目录,默认情况下的路径。这时我们联想到当初C语言学习中,文件操作相关函数,当没有文件时,fopen()会创建一个文件,恰好在当前工作目录下。

当我们杀掉这个进程时,PID为13954对应的临时文件夹就被释放了

讲到这里对于进程的概念我们也了解了差不多了, 

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

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

相关文章

【C++STL详解 —— string类】

【CSTL详解 —— string类】 CSTL详解 —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、…

android开发基础有哪些,985研究生入职电网6个月

不好意思久等了 这篇文章让小伙伴们久等了。 一年多以来&#xff0c;关于嵌入式开发学习路线、规划、看什么书等问题&#xff0c;被问得没有一百&#xff0c;也有大几十次了。但是无奈自己对这方面了解有限&#xff0c;所以每次都没法交代&#xff0c;搞得实在不好意思。 但…

请说说你对Vue模板编译的理解

Vue模板编译是Vue.js框架的核心之一&#xff0c;它负责将Vue模板转换成渲染函数&#xff0c;从而实现模板的解析和渲染。要深入了解Vue模板编译&#xff0c;我们需要从编译过程、作用、特点等方面进行详细解析。 1. Vue模板编译的作用 Vue模板编译的主要作用是将Vue模板字符串…

【Web安全】SQL各类注入与绕过

【Web安全】SQL各类注入与绕过 【Web安全靶场】sqli-labs-master 1-20 BASIC-Injection 【Web安全靶场】sqli-labs-master 21-37 Advanced-Injection 【Web安全靶场】sqli-labs-master 38-53 Stacked-Injections 【Web安全靶场】sqli-labs-master 54-65 Challenges 与62关二…

LeetCode——二叉树(Java)

二叉树 简介[简单] 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历二叉树层序遍历[中等] 102. 二叉树的层序遍历[中等] 107. 二叉树的层序遍历 II[中等] 199. 二叉树的右视图[简单] 637. 二叉树的层平均值[中等] 429. N 叉树的层序遍历[中等] 515. 在每个…

异地组网搭建方案

在这个信息爆炸的时代&#xff0c;人与人之间的联系变得越来越密切&#xff0c;而异地组网搭建方案也因此变得越 来越重要。无论是跨国企业、远程学习还是国际合作&#xff0c;构建一个快捷稳定的异地组网系统&#xff0c;已经 成为许多组织和个人不可或缺的需求。接下来&#…

强大的ps 命令 -o 自定义输出内容选项

强大的ps 命令 -o 自定义输出内容选项 1、ps命令介绍和作用2、问题描述 1、ps命令介绍和作用 ps 是一个 Unix 和类 Unix 操作系统中常用的命令&#xff0c;用于显示当前运行的进程信息。ps 命令的作用包括&#xff1a; 查看进程信息&#xff1a; ps 命令可以列出当前系统中正…

Matlab代码批处理全国地面气象站点日值数据集(2400站点数据集)

气象数据一直是一个价值较高的数据&#xff0c;它被广泛用于各个领域的研究当中。气象数据包括有气温、气压、相对湿度、降水、蒸发、风向风速、日照等多种指标&#xff0c;但是包含了这些全部指标的气象数据却较难获取&#xff0c;即使获取到了也不能随意分享。 1级目录 文件…

建站人的心酸:发了个官网加固通知,有公司关门的,还有吐槽的。

最近客户网站不是老被攻击么&#xff0c;所有节前发了个网站加固的通知&#xff0c;大部分客户都能理解和支持&#xff0c;也有客户倒闭的&#xff0c;也有想省钱结果费钱的&#xff0c;还有吐槽的。 尊敬的客户&#xff1a; 鉴于近期网络攻击频发&#xff0c;导致少部分客户…

可配置输入参数的接口如何设计

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 作为程序员&#xff0c;我们绝大多数场景需要根据业务需求来设计系统&#xff0c;开发后端接口&#x…

java微服务技术选型,Java学习的三个终极问题及学习路线规划

前言 在网络技术中基于浏览器的B/S结构无论在PC端还是手机端都充当着至关重要的角色。 PC端自不必说&#xff0c;手机中很多应用虽然是以APP的形式存在&#xff0c;但它采用的还是B/S结构。如今日头条、微信的朋友圈等&#xff0c;这些应用在内部封装了浏览器&#xff0c;后端…

mysql 时间精度问题

timestamp到2038年&#xff0c;还有14年时间&#xff0c;一个系统如果能活到那一刻也是相当不错了。 这里先看一下个datetime的问题,下面的插入数据的时间戳是2024-03-06 21:20:50.839 INSERT INTO psi_io_balance ( id, as_id, bill_date, order_id, busi_type, direction, c…

二分查找算法:高效搜索有序数据的利器

二分查找算法&#xff1a;高效搜索有序数据的利器 在计算机科学中&#xff0c;搜索是一项基本而重要的操作。对于有序数据&#xff0c;二分查找算法是一种高效的搜索方法。本文将介绍二分查找算法的原理、实现以及其在实际应用中的优势&#xff0c;帮助读者理解和应用这一常用的…

最强AI Claude 3有意识了?四个问题看出和ChatGPT差距

原文&#xff1a;赵侠客 前言 sora的热点还没有褪去&#xff0c;这两天又大火了Clude3&#xff0c;有的说超越GPT-4&#xff0c;还有的说有意识了&#xff0c;连马斯克都说人类也是文件也。我们这些吃瓜群众看着AI每隔几天一个热点&#xff0c;心理素质差的人有可能越来越焦虑…

飞塔防火墙开局百篇——002.FortiGate上网配置——WAN口配置PPPoE上网/拨号宽带上网

WAN口配置IP上网 修改wan口配置 修改wan口配置 登陆FortiGate防火墙界面&#xff0c;配置中文界面。 点击网络点击接口点击接口模式&#xff0c;选择PPPoE配置用户名&#xff08;eq.123456163.gd&#xff09;和密码(运营商提供)单击确认 欢迎关注个人公众号&#xff0c;采购设…

自动化测试的定位及一些思考

大家对自动化的理解&#xff0c;首先是想到Web UI自动化&#xff0c;这就为什么我一说自动化&#xff0c;公司一般就会有很多人反对&#xff0c;因为自动化的成本实在太高了&#xff0c;其实自动化是分为三个层面的&#xff08;UI层自动化、接口自动化、单元测试&#xff09;&a…

FC-AE-1553 协议

FC-AE-1553 协议 MIL-STD-1553B总线协议总线结构字格式消息传输方式 FC协议FC协议栈拓扑结构服务类型帧/序列/交换FC帧格式 FC-AE-1553网络构成帧类型命令帧状态帧数据帧 Information UnitsNC1NC2NC3-4NC5-7NT1-7 传输模式1. NC-NT2. NT-NC3. NT-NT4. 无数据字的模式命令5. 带数…

Android开发必须要会,android性能优化面试

前言 前一段时间和一些大牛们交流了一下&#xff0c;据反馈现在Android岗位也没有以前那么多了&#xff0c;没这么好找了&#xff0c;寒冬季节&#xff0c;大量公司模仿O2O模式导致死掉企业的很多&#xff0c;导致供大于求&#xff0c;当然这不意味着饱和&#xff0c;只是市场…

中文版国产Figma简单好上手

在过去的两年里&#xff0c;国内外协同办公室发展迅速。一方面&#xff0c;它是由突如其来的疫情推动的&#xff0c;另一方面&#xff0c;它是科学技术不断进步的必然结果。在市场的推动下&#xff0c;市场上出现了越来越多的协同办公软件&#xff0c;使工作场所的工作更加高效…

门电路加法器乘法器

前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第六篇,在这里分享给大家,还有一些书籍《深入理解计算机系统》《计算机组成&#xff1a;结构化方法》《计算机体系结构&#xff1a;量化研究方法》《程序员的自我修养》&#xff0c;今天我们来了解门电路,加法…