Linux探秘坊-------7.进程概念

news/2025/3/15 21:09:50/

1.进程概念

1.冯诺依曼体系结构

在这里插入图片描述

  • 输⼊单元:包括键盘,⿏标,扫描仪,写板等
  • 中央处理器(CPU):含有运算器和控制器等
  • 输出单元:显⽰器,打印机等
  • 这⾥的存储器指的是内存

⼀句话,所有设备都 只能直接和内存打交道。!!!

对冯诺依曼的理解,不能停留在概念上,要深⼊到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程

解释图如下:

在这里插入图片描述

2.操作系统

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

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

在这里插入图片描述

1. 设计OS的⽬的

• 对下,与硬件交互,管理所有的软硬件资源
• 对上,为⽤⼾程序(应⽤程序)提供⼀个良好的执⾏环境

在这里插入图片描述

2. 核心功能

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

3. 系统调⽤

在这里插入图片描述

  • 在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,
    这部分由操作系统提供的接⼝,叫做系统调⽤
  • 系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部
    分系统调⽤进⾏适度封装,从⽽形成库
    ,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开
    发。

3.进程

进程概念理解:
在这里插入图片描述
总结:
在这里插入图片描述

其中内核数据结构对象有特定的名字————PCB

在这里插入图片描述

在这里插入图片描述
课本上称之为PCB(processcontrolblock),Linux操作系统下的PCB是:task_struct

1.所有指令,工具,自己的程序,运行起来都是进程

ls,pwd…只要执行都是进程

4.进程调用

1.getpid()------函数

为了演示,先创建一个procss.c,并用vim写入以下程序:

#include<stdio.h>2 #include<unistd.h>  //sleep需要包含的头文件3 #include<sys/types.h>   //getpid的头文件4 int main()5 {6   while(1)7   {8     sleep(1);9     printf("我是一个进程,我的pid:%d\n",getpid());10   }                                                                                                                                            11 12   return 0;13 }
  • 编译并运行可以发现,正在运行的程序也是一个进程,也会有他的id:

在这里插入图片描述

  • 可以看到pid是541。
2. ps axj--------指令

根目录 下使用ps axj 可以展示所有进程,那如果我只想要我刚刚运行的a.out程序的进程咋办呢?

  • 只需在 “ps axj” 后加上“ | grep + 程序文件 ”:
  • 也可以再加上 ps axj | head -1来展示各个信息的名称,-----------注意两个指令要用“;”断开

在这里插入图片描述

  • 可以看到这里有两行,因为grep自己也算一个进程
3. kill -9 + 进程id-------杀掉进程

在这里插入图片描述
在这里插入图片描述

  • 当然可以直接使用ctrl + c直接杀掉进程
4. ls /proc----------要在根目录下使用

在这里插入图片描述
也可以用来查看进程

  • 这些蓝色的文件都是目录,我们只需要找到我们需要的文件的id文件就行,刚刚为了演示杀掉了一次进程,现在id为907
  • 如果程序退出,那么它就不再是一个进程了,就不会有id了

在这里插入图片描述

  • cwd - 记录进程路径
  • exe 为可执行程序

5.进程创建

所有进程都由它的父进程创建

1.获取父进程-------------getppid()
#include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 int main()5 {6   while(1)7   {8     sleep(1);9     printf("我是一个进程,我的pid:%d 我的父进程pid:%d \n",getpid(),getppid());10   }11 12   return 0;13 }  

在这里插入图片描述

  • 可以看到每次运行程序我的pid都发生变化,但ppid却不变。
2.创建子进程-------fork()------无参数,无返回值

在这里插入图片描述

在这里插入图片描述

  • 默认创建的子进程默认使用父进程的代码和数据,但PCB和父进程不一致

在这里插入图片描述

fork()有返回值:

  • (1).子进程的pid会返回给父进程,(2).0会被返回给子进程-----------所以fork有两个返回值!!!!
  • 如果调用失败,-1会被返回给父进程

在这里插入图片描述
在这里插入图片描述
运行结果类似如上:

提出问题:
在这里插入图片描述

  • 1.因为孩子只有一个父亲,而父亲可以有多个孩子,所以父进程需要子进程id来区分不同的子进程子进程一定知道父进程是什么,所以直接给0就行
  • 2.在这里插入图片描述
  • 因为在fork函数里在return前子进程已经创建,所以父和子进程都走了一遍return,所以会返回两次
小结论:进程具有独立性

在这里插入图片描述

  • 以上代码中子进程会把gval修改,但父进程中gval不会改变
  • 在这里插入图片描述

在这里插入图片描述
可以理解为,如果两个进程共用同一份数据,但若其中一个修改了数据,那么内存会重新开辟一个数据给那个进程修改,促使两个进程独立

在这里插入图片描述


http://www.ppmy.cn/news/1572000.html

相关文章

【力扣题解】【76. 最小覆盖子串】容易理解版

76. 最小覆盖子串 总结和复盘 这是时隔1年4个月之后&#xff0c;再次写的题解&#xff0c;比第一次要清晰很多。 我刚开始&#xff0c;就是用方法一做的&#xff0c;提交之后报超出内存限制&#xff1b; 对方法一进行优化&#xff0c;得到方法二&#xff0c;提交之后就AC了。…

基于SpringBoot的在线车辆租赁信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网技术的不断发展和人们生活水平的提高&#xff0c;汽车租赁行业迎来了前所未有的发展机遇。传统的汽车租赁方式往往存在流程繁琐、信息不透明等问题&#xff0c;难以满足现代消费者对于便捷、高效服务的需求。因此&…

【C++八股】内存泄漏

内存泄漏&#xff08;Memory Leak&#xff09;是指程序在动态分配内存后&#xff0c;未能及时释放已分配的内存&#xff0c;导致这些内存无法被再次使用&#xff0c;从而造成系统内存的浪费。随着时间的推移&#xff0c;内存泄漏可能导致程序性能下降&#xff0c;甚至系统崩溃。…

django中间件,中间件给下面传值

1、新建middleware.py文件 # myapp/middleware.py import time from django.http import HttpRequest import json from django.http import JsonResponse import urllib.parse from django.core.cache import cache from comm.Db import Db class RequestTimeMiddleware:def …

post、get、delete、put请求

一、配置axios拦截器 // src/utils/request.js import axios from axios;// 创建 axios 实例 const instance axios.create({baseURL: https://api.example.com, // 你的 API 基础 URL//timeout: 10000, // 请求超时时间 });// 请求拦截器 instance.interceptors.request.use…

No module named ‘posepile.util‘

目录 No module named posepile.util 解决方法: No module named posepile.util 错误代码: import posepile.datasets3d as ds3d pip install git+https://github.com/isarandi/PosePile.git. And then, I executed the following command, " python -m metrabs_py…

五、AIGC大模型_03BERT论文与实战

1、BERT论文 论文网址&#xff1a;https://arxiv.org/pdf/1810.04805 1.1 论文正文内容翻译与总结 1.1.1 引言 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种新的语言表示模型&#xff0c;旨在通过无监督的预训练方法学习深…

数据结构-二叉树经典OJ题

文章目录 一、单值二叉树二、相同的树三、对称二叉树四、另一棵树的子树五、二叉树遍历5.1前序遍历5.2 二叉树的构建及遍历 一、单值二叉树 (链接&#xff1a;UnivaluedBinaryTree) bool isUnivalTree(struct TreeNode* root) {if(root NULL)return true;if(root->left …