进程概念(进程第1篇)【Linux复习篇】

目录

1、冯诺依曼体系结构怎么画?中央处理器是什么?存储器是什么?每个部分有什么作用?

2、什么是操作系统?

3、什么叫进程?操作系统如何管理进程的?

4、怎么查看进程?

5、C语言中在当前目录下创建文件怎么做到的?

6、在代码层面,如何获取自己的pid和ppid?bash进程是什么?

7、fork函数有什么用?怎么用?怎么理解两个返回值?

8、什么是写时拷贝?


1、冯诺依曼体系结构怎么画?中央处理器是什么?存储器是什么?每个部分有什么作用?

存储器是指我们平时说的内存;

输入设备有鼠标、键盘、麦克风、磁盘、网卡、摄像头等;

输出设备有显示器,播放器硬件,磁盘、网卡等;

运算器:对我们的数据进行计算任务(算术运算、逻辑运算);

控制器:对计算机硬件流程进行控制。

中央处理器:由运算器、控制器组成(其实还有很多寄存器),也叫CPU。

五大单元:

各个单元都是独立的个体,需要用"线"连接起来,总线:

1、系统总线(CPU和内存交互的线)

2、IO总线(内存和外设交互的线)

CPU不和外设直接打交道,为什么?

外设读写效率太低。

2、什么是操作系统?

操作系统是一款进行管理软件和硬件的的软件。

为什么要有OS:通过管理好底层软硬件资源,为用户提供一个良好的执行环境。

**如何理解系统调用接口:**系统为了保证自己的数据安全,所有访问OS的行为,都只能通过系统调用来完成,系统调用就是操作系统给用户提供的操作自己的函数。

硬件->驱动程序->操作系统->系统调用接口->用户操作接口(如C语言的printf)->用户

3、什么叫进程?操作系统如何管理进程的?

一个加载到内存正在运行的程序,就叫进程,也叫任务。

一个进程在加载到内存,形成真正的进程前,要先创建一个描述进程属性的结构体对象PCB(Process Control Block进程控制块)对进程的管理,就是对描述进程的结构体对象PCB做管理,具体怎么管理,就是通过特定的数据结构(如Linux中是用双链表)将所有进程PCB组织起来。

管理进程:先描述,再组织!

进程 = 内核PCB结构体对象+你的代码和数据

Linux中的PCB叫什么?

task_struct。

tack_struct中有什么常见字段?

标示符:描述本进程的唯一标示符,用来区别其他进程。

状态:任务状态,退出代码,退出信号等。

优先级:相对于其他进程的优先级。

程序计数器:程序中即将被执行的下一条指令的地址。

内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据:进程执行时处理器的寄存器中的数据

其他信息。

4、怎么查看进程?

方法一:

ps axj :这条指令可以显示系统中所有进程的详细信息,并以通用格式展示。

`ps`命令是用于显示当前系统中的进程信息,`a`表示显示所有用户的进程,`x`表示显示没有控制终端的进程,`j`表示以通用格式显示进程详细信息。

如果只想看一个特定进程的信息 :ps axj | grep process_name

`|`是管道符号,用于将前一个命令的输出传递给后一个命令。 `grep process_name`命令是用来在前一个命令的输出中查找包含"process_name"关键字的行。

如果想加上行头,可以这样:

ps axj | head -1 && ps axj | grep server

查找出来为什么会有两条?

因为grep命令在执行时,它自己也会变成一个进程,且它内部也有server关键字。

ps的本质是什么?

ps本质就是在遍历内核中维护所有进程控制块的数据结构(双链表)
方法二:

ls -/proc

/proc是一个伪文件系统(procfs),该目录下存储的是内核运行时的信息,而不是实际的文件系统。用户可以查看和操作其中的文件来获取系统状态和进程信息。

5、C语言中在当前目录下创建文件怎么做到的?

每个进程的属性里都有一个cwd(Current Working Directory),记录当前进程的工作目录。

C语言中在当前目录下创建一个文件时,虽然我们只提供了文件名,但系统会将当前cwd指向的路径跟文件名拼接起来。


6、在代码层面,如何获取自己的pid和ppid?bash进程是什么?

通过系统调用接口getpid来获得当前进程的pid,通过getppid来获得该进程的父进程的pid。

我们在Linux下执行的所有命令,运行的所有程序,本质都是由父进程bash通过fork来创建的。

7、fork函数有什么用?怎么用?怎么理解两个返回值?

fork函数可以创建一个子进程,它会给父进程返回子进程的pid,给子进程返回0。

"./"是指令层面的创建进程,fork函数是代码层面的创建进程。

为什么需要两个返回值?

区分不同执行流需要执行的代码。

为什么要给父进程返回子进程的pid,而子进程返回0?

父进程要管理子进程,而子进程不需要管父进程。

fork创建子进程时,内核会做什么事?

创建子进程的PCB(拷贝父进程的PCB后做一些修改),父子进程代码共享。

为什么一个函数能有两个返回值?

fork是一个函数,在该函数执行到最后一条return语句之前,子进程其实已经创建好了,之后的代码父子共享,也就是说return语句时父进程和子进程独立分别执行的。

父子进程谁先运行?

不一定,由调度器决定。

8、什么是写时拷贝?

父子进程代码和数据共享,他们还具有独立性吗?

代码是只读的,父子进程都不能修改。但数据是有可能修改的,当子进程尝试对父进程的数据进行修改时,OS会将该数据给子进程拷贝一份,这就叫写实拷贝。

为什么不直接全部给子进程拷贝一份?

浪费空间

为什么在fork时同一个变量id会有两个不同值?

子进程在尝试修改该变量时,发生了数据层面的写实拷贝,OS会将该数据拷贝一份给子进程,然后子进程再做修改。

相关推荐
Lana学习中34 分钟前
【运维杂记】连接不上远程服务器的问题处理
运维·服务器
1892280486143 分钟前
NV023固态MT29F16T08GWLCEJ9-QBES:C
大数据·服务器·人工智能·科技·缓存
AOwhisky1 小时前
MySQL 学习笔记(第一期):数据库基础与 MySQL 初探
运维·数据库·笔记·学习·mysql·云计算
Peace1 小时前
【Prometheus】
linux·运维·prometheus
LZZ and MYY3 小时前
RTS 在windows和Linux之间ShareMem
linux·运维·服务器
aningx3 小时前
openSUSE Leap 16.0 运行 sunshine 报错的解决方法
linux
爱学习的徐徐3 小时前
Linux 基础IO
linux·服务器
蛋蛋的学习记录3 小时前
C#窗体应用中使用EasyModbusCore通讯
服务器·c#·tcp
zt1985q3 小时前
本地部署源代码管理解决方案 Bitbucket Data Center 并实现外部访问
运维·服务器·数据库·网络协议·postgresql·源代码管理
xiaobobo33303 小时前
面向对象:linux内核中函数转数据的用法
linux·面向对象·隔离·函数指针绑定