【linux】part1-进程详解

初步了解冯诺依曼体系

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

输入单元:包括键盘,鼠标,扫描仪,写板等

中央处理器(CPU):含有运算器和控制器等

输出单元:显⽰器,打印机等

  • 这⾥的存储器指的是内存
  • 不考虑缓存情况,这⾥的CPU能且只能对内存进⾏读写,不能访问外设(输⼊或输出设备)(数据层⾯)
  • 外设(输⼊或输出设备)要输⼊或者输出数据,也只能写⼊内存或者从内存中读取。
    ⼀句话,所有设备都只能直接和内存打交道。

提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

信息传输就是从一个设备拷贝到另一个设备;


一、为什么要有内存

有了内存,计算机的价格就更加的平均化,更具性价比,让普通人都能大范围的购买使用计算机

二、认识操作系统

1.是什么

一个基本的程序集合就是操作系统,操作系统就是一款进行软硬件管理软件
操作系统包括:

  • 内核:进程管理,文件管理,内存管理和驱动管理
  • 其他程序:例如各种预装程序,外壳shell

2.为什么

操作系统向下进行软硬件资源的管理,向上给用户提供良好的操作环境和服务

1.体系结构狭义上将就是芯片结构:如x86,x64;

软硬件体系结构则是从硬件到用户层状的体系结构,高内聚低耦合

2.访问操作系统,需要通过系统调用,实际上通过函数调用,只不过是系统帮助实现的,向我们使用的printf()函数底层就封装了一层系统调用函数

3.只要访问了硬件,就一定贯穿了整个操作系统

4.库有可能就封装了系统调用

3.理解操作系统

3.1如何理解管理

在学校中,校长"决策",扮演着管理者的身份,校长(管理者)交付指令给各级辅导员进行"执行",由辅导员传达给学生(被管理者),完成一次指令的执行;在计算机中,操作系统就是所谓的"管理者",驱动程序就是"执行者",各个硬件就是"被管理者";

校长无需和学生面对面交流,只需拿到学生的相关数据就可以进行决策,同样操作系统也只需拿到硬件的数据对硬件进行管理,而如何拿到数据进而进行增删查改?操作系统是用C语言写的,它能通过结构体struct{}解决每个设备属性数据问题,c++中有类的概念;这一过程我们可以叫他"描述";但是如此庞大的数据集很难进行管理,所以我们可以通过链表进行节点的链接,这一过程我们可以叫他"组织",此时数据结构的功能就大大展现出来,所有的管理无外描述+组织

在组织数据中,STL(算法和容器)同样发挥着重要作用,所以类和STL是c++最重要的模块,在语言的层面就已经给我们做了面向对象层次的划分

3.2 如何理解系统调用

操作系统向上提供对应的服务(让用户有访问硬件的能力)

四、进程

书上的概念:进程是程序的一个执行实例,或者正在执行的程序。

核心概念:进程担当这分配系统资源(CPU时间,内存)的实体。

4.1 是什么

进程=PCB(task_struct)+自己的代码和数据

这时候对进程的管理就变成了链表的增删查改

PCB里包含进程的所有属性

4.2 指令操作

进程都会有一个PID,进程开始之前操作系统都会根据编码给它分配一个PID,如何去查看,需要用到getpid(),这一系统调用函数

查进程 ps ajx(查所有的进程任务)

ps ajx | head -1 ;ps ajx | grep 所要查看的程序/对应的PID

ctrl+c:杀掉进程 ,之后就看不到这一个进程

这个 grep --color=auto 3443285 并不是原来那个进程,而是 grep 命令本身。当我过滤到这一个命令,结果就是:


注意:历史上执行起来的指令,工具,运行起来的程序,都是进程!!!

/proc 以文件的形式查看所有进程

当你进入到某个进程里会有各种这个进程所包含的各种文件信息,其中exe是磁盘中的可执行程序(即便你把rf删除了磁盘中的可执行程序文件,但是内存中的程序依旧在执行,因为内存中早已有了它的拷贝)

其中的cwd(currrent work dir 当前工作路径),进程开始会自动记录下它当前的路径,而如果要改这个cwd,可以在程序代码中使用chdir函数,chdir(路径)可以修改cwd

getppid();获取父进程的pid

从中我们发现父进程的PID在每次运行启动时都不变,只有子进程的PID在变,那么这个可执行程序的父进程是谁?

可以看到他的父进程是bash

补充知识点:命令行解释器:bash/-bash(远程登录),OS会给每一个登录用户分配一个bash,bash也是一个进程

4.3 创建子进程

创建子进程

pid_t fork();一个系统调用函数

进程之间互相独立,互不干扰,

fork(),创建子进程的时候,如果创建返回0,再将子进程的PID返回给父进程,如果创建失败返回-1;

  • fork会有两个返回值?
    是的,父进程和子进程的关系是1:n,所以父进程需要拿到子进程的PID后续方便管理,子进程没有自己的代码和数据,所以默认会把父进程的拷贝一份,自己来执行
  • 既然父子进程同时进行,那么一个函数将会被返回2次?
    既然return()了,那么核心工作就已经全部搞定了,执行fork函数后就已经完成了申请子进程pcd,拷贝父进程pcb(除了PID),甚至放入调度序列。即执行完fork之后,子进程就已经开始在运行了,所以父进程需要返回一次,子进程也要返回一次
  • 子进程如果修改了父子的共享(全局)数据,会影响到父进程吗,会影响进程之间的独立性吗?
    不会!父子进程任何一方如果要修改,OS会在底层把被修改的数据拷贝一份,这就是写时拷贝

由此验证,父进程的ret始终保持不变!

相关推荐
小糖学代码12 小时前
LLM系列:环境搭建:4.Nginx使用教程
运维·python·神经网络·nginx
L16247612 小时前
OpenSSL + OpenSSH 两套安装方案(覆盖系统目录 / 独立目录)
linux·ssh
汪汪大队u12 小时前
XX校园网规划与搭建实验
运维·网络
sg_knight12 小时前
负载均衡配置:使用 Nginx 反向代理 MinIO 集群的实战教程
运维·nginx·负载均衡·文件管理·minio·cos·oss
hweiyu0012 小时前
Linux命令:iotop
linux·运维
1892280486112 小时前
NQ551固态MT29F16T08EWLEHD6-ITF:E
大数据·服务器·人工智能·科技·缓存
天下·第二13 小时前
如何在【x86】服务器上打包构建【arm】镜像
服务器·arm开发·eureka
齐潇宇13 小时前
Jenkins 自动化部署 Tomcat + PHP
linux·运维·容器·tomcat·jenkins
枳实-叶13 小时前
【Linux驱动开发】第17天:I2C子系统整体架构
linux·驱动开发·架构