Linux中《进程》详细介绍

Linux中《进程》详细介绍
目录冯诺依曼体系结构操作系统(Operator System)概念设计OS的⽬的核心功能系统调用和库函数概念进程基本概念与基本操作描述进程-PCBtask_ struct查看进程通过系统调用获取进程提示符通过系统调用创建进程-fork初识补充概念-竞争、独立、并行、并发在谈进程之前我们先聊聊背景知识冯诺依曼体系结构我们常⻅的计算机如笔记本。我们不常⻅的计算机如服务器⼤部分都遵守冯诺依曼体系。截⾄⽬前我们所认识的计算机都是由⼀个个的硬件组件组成• 输⼊单元包括键盘, ⿏标扫描仪, 写板,摄像机,话筒,网卡,磁盘等• 中央处理器(CPU)含有运算器和控制器等运算器算术运算和逻辑运算算术运算包括加减乘除取模等逻辑运算包括异或等。• 输出单元显⽰器打印机,磁盘,网卡等• 存储器:内存同时我们把磁盘叫做外存关于冯诺依曼必须强调几点• 不考虑缓存情况这⾥的CPU能且只能对内存进⾏读写不能访问外设(输⼊或输出设备)• 外设(输⼊或输出设备)要输⼊或者输出数据也只能写⼊内存或者从内存中读取。• ⼀句话所有设备都只能直接和内存打交道。问题程序运行之前必须加载到内存但是加载到内存之前程序在哪里程序也是一个二进制文件所以在磁盘里。那为什么必须先加载到内存呢因为要和内存打交道而我们的程序是给CPU执行的CPU获取写入只能从内存中进行。数据在各个设备之间流动流动的本质就是数据从一个设备拷贝到另一个设备上。为什么要有内存让外设直接和CPU进行数据拷贝不行吗可以这样但是效率太低了CPU的速度是以纳秒为单位的而外设的速度是以毫秒为单位的CPU都已经把数据处理完了但是外设还没有把数据拷贝过来根据木桶效应这样会降低效率。所以加上CPU内存可以在CPU和外设的速度做一定程度的适配。同时体系结构的效率是由”拷贝“的决定的。注意:对冯诺依曼的理解不能停留在概念上要深⼊到对软件数据流理解上请解释从你登录上qq开始和某位朋友聊天开始数据的流动过程。从你打开窗⼝开始给他发消息到他的到消息之后的数据流动过程。如果是在qq上发送⽂件呢操作系统(Operator System)概念任何计算机系统都包含⼀个基本的程序集合称为操作系统(OS)。笼统的理解操作系统包括•内核进程管理内存管理文件管理驱动管理•其他程序例如函数库shell程序等等安卓底层也是Linux的内核。设计OS的⽬的• 对下与硬件交互管理所有的软硬件资源。是手段方法• 对上为用户程序应用程序提供⼀个良好的执行环境是目的驱动程序不同的设备需要有个性化的读取方式。访问不同的硬件需要配各自的驱动程序。核心功能在整个计算机软硬件架构中操作系统的定位是⼀款纯正的“搞管理”的软件计算机管理硬件描述起来⽤struct结构体组织起来⽤链表或其他⾼效的数据结构总结:先描述,在组织!!!系统调用和库函数概念操作系统向上要提供对应的服务,但是操作系统不相信任何人!这就衍生出了系统调用的概念,Linux/macos/windows都是C语言编写的,里面的C函数就会有参数(用户输入/操作系统输出)和返回值(用户输入/操作系统输出),用户和数据之间,就可以进行某种数据的交互耦合度降低.在开发⻆度操作系统对外会表现为⼀个整体但是会暴露⾃⼰的部分接⼝供上层开发使⽤这部分由操作系统提供的接⼝叫做系统调⽤。系统调⽤在使⽤上功能⽐较基础对⽤⼾的要求相对也⽐较⾼所以有⼼的开发者可以对部分系统调⽤进⾏适度封装从⽽形成库有了库就很有利于更上层⽤⼾或者开发者进⾏⼆次开发。总结所以说库函数和系统调用是上下级的关系。如何判断你的库函数使用了系统调用呢那就要看看你有没有访问硬件设备了。承上启下那在还没有学习进程之前就问⼤家操作系统是怎么管理进⾏进程管理的呢很简单先把进程描述起来再把进程组织起来进程基本概念与基本操作• 课本概念程序的⼀个执⾏实例正在执⾏的程序等• 内核观点担当分配系统资源CPU时间内存的实体总结:进程 内核数据结构对象(PCB) 自己的数据和代码描述进程-PCB基本概念• 进程信息被放在⼀个叫做进程控制块的数据结构中可以理解为进程属性的集合。• 课本上称之为PCBprocess control blockLinux操作系统下的PCB是: task_struct,对进程的管理就可以转化为对PCB的管理.为什么要有PCB因为要对进程做管理就必须先描述在组织程序加载到内存这个不叫进程在某种程度上来说内核数据结构对象才叫进程task_struct-PCB的⼀种• 在Linux中描述进程的结构体叫做task_struct(具体)• task_struct是Linux内核的⼀种数据结构它会被装载到RAM(内存)⾥并且包含着进程的信息。进程的所有属性都可以直接或间接通过task_struct找到.task_ struct内容分类• 标⽰符: 描述本进程的唯⼀标⽰符⽤来区别其他进程。• 状态: 任务状态退出代码退出信号等。• 优先级: 相对于其他进程的优先级。• 程序计数器: 程序中即将被执⾏的下⼀条指令的地址。• 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针• 上下⽂数据: 进程执⾏时处理器的寄存器中的数据[休学例⼦要加图CPU寄存器]。• I∕O状态信息: 包括显⽰的I/O请求,分配给进程的I∕O设备和被进程使⽤的⽂件列表。• 记账信息: 可能包括处理器时间总和使⽤的时钟数总和时间限制记账号等。• 其他信息组织进程可以在内核源代码⾥找到它。所有运⾏在系统⾥的进程都以task_struct链表的形式存在内核⾥对进程的管理就可以转化为对链表的增删查改小知识点man手册里面2号手册为系统调用3号手册为库函数调用。查看进程进程的信息可以通过 /proc 系统⽂件夹查看/proc文件系统是一个虚拟文件系统它为用户提供了一种访问系统内核数据和运行时信息的机制。/proc文件系统是Linux内核的一个重要组成部分它提供了对系统资源、进程信息、硬件状态等的访问接口同时也允许用户对某些系统参数进行动态调整。如要获取PID为32288的进程信息你需要查看 /proc/32288 这个⽂件夹。/proc记录了当前进程的信息每一个数字目录都代表当前进程的pid一旦退出该目录会自动被销毁。2.⼤多数进程信息同样可以使⽤top和ps这些用户级⼯具来获取通过系统调用获取进程提示符getpid():获取进程idgetppid():获取父进程id注意:我们历史上执行的所有命令,工具,我们自己的程序,运行起来都是进程!!!杀进程:使用快捷键ctrlc,但是只能杀前台进程,后台进程杀不掉kill -9 pid,前台和后台的进程都能杀掉./cmd 可以将cmd程序在后台运行补充两个小知识:ls /proc/pid -l可以查看进程属性命令行解释器:本质上也是一个进程通过系统调用创建进程-fork初识• 运⾏ man fork 认识fork如果是子进程返回值为0如果是父进程返回值是子进程的pid代码创建进程的方式•fork有两个返回值父子未来执行不同的代码逻辑⽗⼦进程代码共享数据各⾃开辟空间私有⼀份采⽤写时拷⻉这里就引出了三个问题?为什么fork给父子返回不同的返回值?因为一个父亲可以有多个子进程,所以如果是父进程的话需要返回子进程的pid便于区分哪个是哪个子进程而子进程返回0是为了标识这是一个子进程为什么一个函数会有两个返回值?return id之前子进程已经被创建。子进程和父进程都会执行这一份代码。为什么一个变量即0,又0,导致if else同时成立?结论:进程具有独立性!,体现在父进程创建子进程的时候会把父进程的PCB,拷贝给子进程子进程和父进程的PCB大部分都是一样的所以子进程有自己的PCB。其次代码是只读的不会被修改而数据一旦被修改会发生写时拷贝。进程内核数据结构自己的代码和数据。写时拷贝补充概念-竞争、独立、并行、并发竞争性: 系统进程数⽬众多⽽CPU资源只有少量甚⾄1个所以进程之间是具有竞争属性的。为了⾼效完成任务更合理竞争相关资源便具有了优先级和权限的概念。独⽴性: 多进程运⾏需要独享各种资源多进程运⾏期间互不⼲扰进程 内核数据结构 自己的代码和数据每一个进程都有自己独立的PCB代码和数据也是独立的。并⾏: 多个进程在多个CPU下分别同时进⾏运⾏这称之为并⾏。并发: 多个进程在⼀个CPU下采⽤进程切换的⽅式在⼀段时间之内让多个进程都得以推进称之为并发。并行VS并发并行多个CPU任何时间段内都有多个进程在同时运行。并发一个CPU在一段时间内多个进程得以推进。