进程概念(进程第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会将该数据拷贝一份给子进程,然后子进程再做修改。

相关推荐
秦jh_37 分钟前
【Linux】多线程(概念,控制)
linux·运维·前端
yaosheng_VALVE1 小时前
稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣
运维·spring cloud·自动化·intellij-idea·材质·1024程序员节
看山还是山,看水还是。2 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
扣得君2 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
keep__go2 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求2 小时前
Linux中给普通账户一次性提权
linux·运维·服务器
Fanstay9852 小时前
在Linux中使用Nginx和Docker进行项目部署
linux·nginx·docker
大熊程序猿2 小时前
ubuntu 安装kafka-eagle
linux·ubuntu·kafka
jieshenai2 小时前
使用VSCode远程连接服务器并解决Neo4j无法登陆问题
服务器·vscode·neo4j
渗透测试老鸟-九青3 小时前
通过投毒Bingbot索引挖掘必应中的存储型XSS
服务器·前端·javascript·安全·web安全·缓存·xss