这里总结下Linux进程概念总结❗
冯诺依曼:
- CPU 运算器与控制器
- RAM 内存(存储器)
- Cache 缓存(一种技术)不属于冯诺依曼体系结构。
- ROM 磁盘(输入输出设备)
- 磁盘 既可以从硬盘读取数据也可以向硬盘写入数据。
- 冯诺依曼体系结构中数据输入设备的有键盘/磁盘。
- 冯诺依曼体系结构计算机的基本原理 存储程序和程序控制。
操作系统:
计算机就是为了完成指定的数据处理,而通过指令按指定流程完成指定功能,指令的合集就是一段程序。说白了计算机就是按照指定的指令执行流程完成对指定数据的处理。
操作系统:操作系统的定位就是控制和管理计算机上软硬件资源让计算机更加好用
编译器:对汇编语言,高级语言和甚高级语言程序进行翻译,将高级语言解释为机器指令能够被机器识别执行。这不是操作系统的主要功能,而是一个外部应用的主要功能。
源程序以及数据库文件都是存储在磁盘上的,这是操作系统中文件系统管理部分的主要功能。
系统调用:
应用程序通过系统调用将自己需要完成的功能传递给内核,进行执行完成。
系统调用的运行过程是在内核态完成的,操作系统并不允许用户直接访问内核,也就是说用户运行态并不满足访问内核的权限。(系统调用函数的执行过程应该是不在用户态)
系统调用就是想上层提供用于完成特定内核服务或功能的。利用系统调用能够得到操作系统提供的多种服务。
是操作系统提供给编程人员的接口。
系统调用给用户屏蔽了设备访问的细节,用户只需要将自己的请求以及数据通过系统调用接口传递给内核,内核中完成对应的设备访问过程,最终返回结果正确。
系统调用保护了一些只能在内核模式执行的操作指令,系统向上层提供系统调用接口用于访问内核服务或功能的很大原因也是因为这样可以最大限度的保护内核的稳定运行。
- 库函数是用户对系统调用接口的进一步封装接口
- printf函数是glibc中封装的用于实现格式化输出的接口
- scanf函数是glibc中封装的用于实现格式化输入的接口
- fgetc函数是glibc中封装的用于实现从输入流中获取字符的接口
- read是系统提供的用于从输入设备获取数据的接口
- print_s以及scan_s这两个函数不存在,至少在C语言的常见典型的跨平台移植代码库中不存在。
- fgetc是系统调用而不是库函数
Linux的进程:
- 僵尸进程指的是进程退出后不会完全释放资源,会造成系统资源泄漏。
- 孤儿进程的父进程在它之前退出,会被 init 进程接管,不会造成资源浪费。
- 孤儿进程在父进程退出后,父进程成为init进程,进程退出,孤儿进程的资源将被init进程释放。
- 操作系统通过pcb实现对程序运行调度控制。
- fork系统调用通过复制父进程创建一个子进程,父子进程数据独有,代码共享(在数据不发生改变的情况下父子进程资源指向同一块物理内存空间(调研写时拷贝技术))
- 子进程如果对资源只是进行读操作,那么完全和父进程共享物理地址空间。
- 进程是资源管理的最小单位,而线程是程序执行的最小单位。Linux 下的线程本质上用进程实现。
在抢占式多任务处理中,进程被抢占时,哪些运行环境需要被保存下来?
- ✔所有cpu寄存器的内容/全局变量/程序计数器
- 所有cpu寄存器的内容 cpu上正在处理的数据
- 全局变量 程序内的数据(并不一定正在被处理)
- 页表指针 程序切换时会将页表起始地址加载到寄存器中
- 程序计数器 下一步程序要执行的指令地址
- 一个程序可以同时运行多次,也就有了多个进程。❌进程与程序是一一对应的。
- 因为一个作业任务的完成可由多个进程组成,且必须至少由一个进程组成。❌进程与作业是一一对应的。
- 进程是静态的。因为程序是静态的,而进程是动态的。
- 进程是动态的过程。❌
进程PCB
- 进程是操作系统对于程序运行过程的描述,而这个描述学名叫做进程控制块-PCB,它是操作系统操作系统管理以及调度控制程序运行的唯一实体。
- 进程ID只是进程的标识符,是系统能够找到特定进程的标识而已。
- 进程管理器只是对大量PCB进行管理的一个程序而已。
- 进程本质上来说没有名字,它有所调度管理运行的程序的名称,它的标识是进程ID,可以理解进程ID是它的名字。
- 在系统角度看来,进程就是对于程序运行的描述,就是PCB进程控制块。
❓考察fork创建子进程的过程, 同时理解fork函数的返回值
❓要求: 通过父子进程的返回值, 区分父子进程执行的逻辑, 重点:理解子进程为什么从fork函数调用之后开始执行
🙂感谢大家的阅读,若有错误和不足,欢迎指正。