泰安一级的企业建站公司,h5链接是什么意思,数据库里建设好的网站为什么外网进不去网站,东莞阳光网英语口语大赛官网目录 进程基本概念 PCB概念
task_struct
tack_struct内容分类 PID和PPID
fork函数创建子进程 进程优先级概念 4个名词
进程地址空间
进程地址空间的意义
内核进程调度队列
优先级
活动队列
过期队列 进程基本概念
一个正在执行的程序。担当分配系统资源的实体#…目录 进程基本概念 PCB概念
task_struct
tack_struct内容分类 PID和PPID
fork函数创建子进程 进程优先级概念 4个名词
进程地址空间
进程地址空间的意义
内核进程调度队列
优先级
活动队列
过期队列 进程基本概念
一个正在执行的程序。担当分配系统资源的实体CPU时间内存。
怎么理解因为我们的进程就是CPU要计算的东西内存是存储进程的东西并且唯一和CPU打交道的就是内存。冯诺依曼体系
我们知道通常我们的程序都是存在磁盘里的但是只有内存能和CPU打交道即计算运行任务。所以我打开一个软件其实就是把磁盘里的程序加载到内存中了然后内存在继续去和CPU打交道。 PCB概念
我们知道我们再使用软件时我们并不是一次只能打开一个软件而是一次有多个软件是打开的。那内存就有一个我们这么多进程怎么管理的
记住6个大字兄弟“先描述后组织”。描述其实就和面向对象思想类似C语言中没有面向对象的说法把一个对象用一个结构体封装起来需要什么变量就加入什么就是描述了。
组织也很简单我们为什么要学数据结构就是为了组织数据的也可以说是管理数据。假设我们Linux里面用的是链表那就会是下面这样的。 这样一来我们需要用到哪个进程通过查找就能在这个链表中找到了。那我们怎么知道要找的是哪一个PCB当然里面的变量中就有唯一标识PCB的变量叫做PID下面会解释。
task_struct
对于上面的PCB是在所有系统对进程的总称而task_struct就是Linux中对进程的统称。
tack_struct内容分类
标示符 描述本进程的唯一标示符用来区别其他进程。状态 任务状态退出代码退出信号等。优先级 相对于其他进程的优先级。程序计数器(pc) 程序中即将被执行的下一条指令的地址。内存指针 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针。上下文数据 进程执行时处理器的寄存器中的数据。I/O状态信息 包括显示的I/O请求分配给进程的I/O设备和被进程使用的文件列表。记账信息 可能包括处理器时间总和使用的时钟总和时间限制记账号等。其他信息
有两条指令关于进程的查询 1. ps aux 这条指令用于查看所有进程信息 2. ps aux | head -1 ps aux | grep proc | grep -v grep 这条指令用于查询单一进程 grep指令就是用来查找指定进程的。 PID和PPID
PIDprocess ID就是表示进程的ID在双链表中查找某一特定进程使用。
PPIDparent process ID表示当前PID的爸爸进程有什么用呢下面会说。
fork函数创建子进程
fork分叉函数就和分叉一样把当前的进程分裂成两个原进程是分裂出来的进程的父进程。可以套娃 这个分裂的进程也会被创建出来所以此时就是两个进程那代码怎么执行的当然就是共用一份代码后面会有进程替换exec把子进程的执行逻辑脱离出去执行另一个程序父进程依旧执行老代码。 父子进程的使用的变量是相同的但是如果子进程有更改变量的操作此时子进程和父进程的变量就不同了写时拷贝。
那我们如果想在一份代码中分离父子进程怎么做呢 if分流父子进程 先说说fork函数的返回值0-1和大于0的值。
子进程的fork返回值是0父进程的fork返回值是子进程的PID大于0的值。如果是-1则说明fork出错。
所以if分流的做法就是判断fork的返回值。 进程优先级概念
什么是进程优先级首先我们知道我们假设了PCB的管理是一个链表那除了按顺序取走进程外如果有突发事件或者优先级高的任务此时就有了进程优先级的概念。 怎么查看进程优先级 ps -l 指令。 我们可以看到一个PRI和NI值 PRI与NI解释 PRIpriority代表的就是当前进程的优先级PRI的值越小优先级越高。
NI nice代表修改进程优先级的数值。
所以NI值是正数进程优先级PRI增大所以优先级变低NI值是负数同理。
NI取值有范围-19 - 20PRI的默认值为80 renice修改进程的nice值 renice 就是更改nice值针对某个特定进程。
用法renice nice值 PID 4个名词
竞争性进程是很多的一台电脑通常来说只有一个CPU所以每个进程都有竞争。
独立性每个进程的运行要有独立的空间独立的资源使得多进程不受干扰。
并行多个进程在多个CPU下分别同时进行运行。
并发多个进程在一个CPU下采用进程切换的方式让我们人为感觉多个进程是同时推进的。
进程地址空间
我们把地址空间看成一把尺子不同的刻度之间有不同的区域存储不同的信息。 但记住了进程地址空间里面的空间是虚拟空间就是操作系统给进程画的大饼只是让进程以为自己得到了整个内存空间实际上是进程用多少才在物理内存中开辟多少。这样就避免了每次都要预先给进程分配好空间才能运行而是进程用多少开辟多少增加效率。
进程地址空间叫什么呢mm_structmemory_struct。怎么拿到呢
首先我们知道task_struc是Linux单个进程的描述这个描述里其实就包含了mm_struct。所以只要找到对应进程的task_struct就能找到对应的mm_struct。 然后刚刚我们不是说进程的地址空间是虚拟的吗它怎么找到对应的实际的物理内存呢
如上图我们在查找时1.先去页表中查找这个数据是否存在页号存在就去物理内存中直接拿。2.如果这个数据并不存在那就说明他还在磁盘中所以此时就会给这个数据一个页号然后把磁盘的数据拿到内存此时再给这个数据一个页号在内存不足以装下内存时的选择。3.还有一种情况就是这个数据还没创建此时就会先创建然后在建立虚拟内存和物理内存的映射。
我们上面也有说子进程和父进程最开始使用的都是同一个变量数据那更改后进行的写时拷贝是什么意思 如上图就是我们重新开辟空间给子进程的变量此时这个变量归子进程父进程还是使用原来的变量。节省空间。 为什么不直接给子进程创建额外的空间 很简单 就是因为有些程序是只有读操作的此时给子进程在创建是不是就没用了直接去父里面读就好了。
进程地址空间的意义
1.如果进程直接使用物理空间每次进程切换都是要切换整个空间给别人还要保持自己的变量数据是被保护的维护难度增加。
2.所以使用虚拟空间实际就是在你时间片期间用多少就给你多少并且通过映射的规则我们在上层就不用担心不同的进程的数据被修改了因为这是操作系统进行维护的。
内核进程调度队列 CPU中也有一个对应的组织结构。
优先级
我们之前说进程不是有优先级吗
普通优先级100-139之前我们nice值是-20 - 19,40个级别
实时优先级0 - 99现在用不到了所以我们只有关心普通优先级即可。
活动队列
我们可以看到队列的个数就是140代表每个优先级.活动队列指的是时间片还没结束的进程都按照优先级排列在活动队列中nr_active代表表示的是当前具体有几个正在运行的进程。 调度过程 1.遍历140个queue找到一个非空队列从0开始遍历优先级。
2.取出第一个进程开始计算运行本次调度完成。
3.一直拿出直到这个队列全部解决然后继续向后遍历。
4.所以看得出我们是一批一批处理的新来的高优先级也是要等前面进程处理完才能运行
因为队列数量固定为140个所以时间复杂度为o1.
过期队列
过期队列就是时间片到了还没有执行完此时这个队列用来维护这些没运行完的队列。
结构总体和活动队列一样的。 那我们如果活动队列全都执行完了之后怎么操作 首先我们要知道有两个指针active_ptr和expired_ptr。顾名思义就是两个指向两个队列的指针。
当活动队列执行完后此时active_ptr指向过期队列过期队列变为活动队列反之相同。 所以就完成了一次交换此时再次重新执行。
也可以看出内存中的数据一般都是等一次执行完后CPU去内存中继续取新的程序执行。