连云港市网站优化wordpress微信管理系统

当前位置: 首页 > news >正文

连云港市网站优化,wordpress微信管理系统,做网站公司名字推荐,自己建网站有什么用个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程#xff08;1#xff09;简述#xff08;2#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关… 个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程1简述2系统调用生成子进程的过程〇提出问题①fork函数②父子进程关系③解答问题 一、冯诺依曼体系结构 我们常见的嵌入式结构包括哈佛结构和冯诺依曼体系结构我们所使用的计算机电脑就是冯诺依曼体系结构下图就是该体系的直观图 在这里的存储器指的是内存如果不考虑缓存的情况这里的CPU能且只能对内存进行读写不能访问输入输出设备输入输出设备要输入输出数据也只能写入内存或者从内存中读取就是说虽然CPU是中央处理器但对于冯诺依曼结构来说内存才是中心的部件所有数据必须先经过内存然后再流向别处 冯诺依曼体系结构是计算机设备得以普及的重大突破我们知道计算机的存储速度如下图寄存器是最快的存储也是最贵的机械硬盘HDD是最慢的存储也是最便宜的如果没有冯诺依曼结构我们的计算机要不然就是便宜速度慢要不就是昂贵速度快冯诺依曼结构的原理是在CPU进行计算的时候内存已经接收外部输入设备输入的数据并存储然后在CPU进行完计算后将结果取出然后将结果放到输出设备再把输入的数据交给CPU进行计算这样低速的输入输出设备、中速的内存以及高速的CPU有机整合形成了现代计算机雏形 二、操作系统 任何计算机系统都包含一个基本的程序集合它就被称为操作系统我们前面说过操作系统就是操作系统内核命令行解释器shell设计操作系统的目的就是更好地与硬件交互管理软件资源为应用程序提供一个良好的执行环境 如上图所示我们可以清楚看到对于用户和系统软件部分的交互我们是不能直接调用操作系统的操作系统像一只小蜗牛它缩在壳里伸出触角与你交流除了触角以外你是碰不到蜗牛的身体的你只能碰到壳这里的触角就是系统调用接口而操作系统也有壳除了调用系统调用接口其他的方式都没法间接使用操作系统因为系统调用在使用上操作比较基础对用户的要求比较高所以开发者就对部分系统调用进行适度封装从而形成了库有了库我们程序员就可以更好的进行开发软件然后开发出来的软件再被普通人所使用 对于硬件部分和系统软件部分的交互我们前面提到了操作系统是做管理的何为管理呢对于程序员而言管理通过计算机语言的表示方法就是数据结构大家不妨想一想我们平常生活所遇到的有关于管理的问题是不是都可以转化为数据结构的方式来解决呢我是一个学生我来举一个有关于学生管理例子一个学校有十个学院每个学院有一位院长一百位学生假设我们的学校就这么单调没有其他类似辅导员这样的职位校长是不直接管理我们的校长吩咐院长来管理学生院长就要亲力亲为亲自来管理这些学生学生的属性都是不同的但是学生属性的类型都是相同的他们都有名字、性别、年龄、家庭住址把学生这个群体定义成一个struct结构体然后不同的学生填不同的数值然后按照学号前后以单链表的方式连接起来这样就把每个学院学生连接起来了对学生的管理就是对链表的增删查改校长想要对某个学生进行管理就可以通过院长执行这里的校长就是操作系统院长就是驱动程序而学生就是硬件资源一个事件可以拆分为决策执行操作系统负责决策驱动程序负责执行我们刚才的例子对于学生也就是硬件资源就是一个先描述再组织的过程先将个体描述出来再将个体组织起来 三、操作系统进程管理 1、概念 进程是正在执行的程序的实例是操作系统进行资源分配和调度的基本单位它包含了程序计数器、寄存器、内存空间、打开的文件描述符等运行上下文信息这些信息共同构成了进程执行的环境 进程是正在执行的程序的实例程序本身只是存储在磁盘等介质上的一组指令和数据的集合是静态的只有当程序被加载到内存中并由操作系统为其分配资源、创建相应的数据结构来管理其执行时它才成为一个进程即变成了一个动态的执行实体 进程是操作系统进行资源分配的基本单位操作系统需要为每个进程分配独立的资源包括但不限于内存空间、CPU 时间、文件描述符、网络端口等每个进程都有自己独立的地址空间进程在自己的地址空间内可以自由地访问和操作数据而不会干扰其他进程的地址空间 进程包含了程序执行时的运行上下文信息运行上下文是指进程在执行过程中所涉及的各种状态和数据主要包括程序计数器、寄存器状态、堆栈信息、内存管理信息等程序计数器指示了进程下一条要执行的指令地址寄存器用于临时存储数据和指令操作数等堆栈用于保存函数调用的相关信息和局部变量等这些运行上下文信息完整地描述了进程当前的执行状态当进程被调度暂停或恢复执行时操作系统需要保存和恢复这些上下文信息以确保进程能够正确地继续执行 进程是构成操作系统中并发执行环境的基本单元操作系统通过管理和调度多个进程实现了多个任务的并发执行从而提高了系统资源的利用率和系统的整体性能多个进程之间可以通过各种进程间通信机制进行数据交换和协作共同完成复杂的系统任务 下图是我们Windows中的进程 进程粗略来讲就是内核PCB数据结构对象你自己的代码和数据 记住上面所说的先描述后组织通过结构体描述进程的属性然后通过链表组织多个进程 2、PCB和task_struct 进程的所有信息被存放在一个叫做进程控制块的数据结构中它是进程属性的集合被称为PCB Linux操作系统下的PCB就是task_struct它是一个结构体被装载到RAM里 以下是task_struct的内容分类除了这些还有一些其他信息 内容意义标示符每个进程的标识符不同状态任务状态优先级相对于其他进程的优先级程序计数器程序中即将被执行的下一条指令的地址内存指针包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针上下文数据进程执行时处理器的寄存器中的数据IO状态显示的IO请求分配给进程的IO设备和被进程使用的文件列表记账信息处理器时间总和或使用的时钟数总和或时间限制、记账号等 所有运行在系统里的进程都以task_struct双向链表的形式存在内核里 3、查看进程 写一个死循环的程序方便我们查看进程 ps aux | grep process | grep -v grep 查看进程指令 ps aux 会列出系统中所有用户的所有进程的详细信息grep process 会在 ps aux 输出的所有行中查找包含 process 的行并将这些行输出grep 是要排除的模式由于在执行 grep process 时这个 grep 命令本身也会作为一个进程被 ps aux 列出并且会匹配 process为了避免将 grep process 这个进程本身显示出来我们使用 grep -v grep 来过滤掉包含 grep 的行 在程序执行过程中会生成一个进程我们通过查看进程指令其中第二列就是进程唯一标识PID
进程重启对应的PID会发生变化是由于内存重新给它分配的原因
这里解答一下为什么我们在进行./process的时候会启动可执行文件process在进程中有一个目录叫做cwd意味着当前的工作目录你可以把它想象为一个指针其实它是一个软链接指向这个文件所在的目录所以一个进程在属性中就有一个是当前的工作目录 亦可以看到exe这里指向的是这里的我们正在执行的可执行程序process
4、通过系统调用fork创建进程 1简述 上面的进程是在执行可执行程序的时候程序自动构建的进程这节我们要通过系统调用fork创建进程 写一个fork创建进程的程序如下test.c在我们现有的知识体系里在fork函数自身不出现问题的情况下给到的id值是大于等于0的值属于双分支结构即id值要不然就等于0要不然就大于0不会出现即等于0又大于0的情况本身两种情况同时出现就是错误的 看到结果两个分支的程序都会执行就是因为fork这里的原因生成了子进程改变了我们对该程序固有的看法现在我们来研究fork是如何做到的 2系统调用生成子进程的过程 〇提出问题 该过程我们可以简化为一个问题为什么id在等于0的同时又大于0 id值是从fork函数来的那么进一步提出问题fork为什么能产生两个返回值 id为什么能承载两个返回值 最终我们将目光移动到fork函数身上 ①fork函数 fork系统调用用于从一个现有的进程创建一个新的进程新创建的进程被称为子进程而原来的进程被称为父进程子进程是父进程的一个副本它几乎继承了父进程的所有资源包括代码段、数据段、堆、栈等但拥有自己独立的进程控制块PCB和进程 IDPID 在父进程中fork返回子进程的 PID因为父进程可能需要对多个子进程进行管理和控制所以通过返回的 PID 来标识每个子进程 在子进程中fork返回 0这是因为子进程不需要知道父进程的 PID 来进行后续操作它可以通过getppid函数来获取父进程的 PID 如果fork调用失败将返回 - 1并设置errno变量来表示错误原因 ②父子进程关系 进程可以粗略表示为代码数据 当父进程调用fork时内核会为子进程分配新的 PCB并复制父进程的大部分资源到子进程中这包括进程的代码部分 虽然子进程最初复制了父进程的地址空间但在实际运行中父子进程的地址空间是相互独立的如果其中一个进程修改了某些数据不会影响到另一个进程中的相应区域这是通过写时复制技术来实现的即只有当进程试图修改某个数据时才会真正复制该数据以节省内存资源就是说在不修改某些数据的情况下它们指向的是同一块位置如果子进程或者父进程某些数据要修改它们会重新开辟一块空间存放该进程的特有数据 fork调用完成后父进程和子进程就开始并发执行它们可以各自独立地执行不同的代码路径也可以通过各种进程间通信机制进行通信和同步这里就是从fork函数出现之后的代码我们可以把它当做两份两份代码同时跑但是id不同后面执行的效果可能就不同 并且我们可以发现上面的截图父子进程谁先运行是不确定的这个是由调度器决定的 ③解答问题 问id为什么能承载两个返回值 答id变量并不是同时承载两个返回值而是在不同的执行流父进程和子进程中被赋予不同的值fork函数通过这种方式让父进程和子进程能够区分彼此并根据返回值执行不同的操作 问fork为什么能产生两个返回值 答父子进程并发执行每个执行流从fork函数的返回处继续执行并且根据自身的角色父进程或子进程返回不同的值这样就实现了一个函数调用在两个进程中产生不同返回结果的效果 今日分享就到这里了~