简述网站开发过程,三网合一网站报价,做推广软件,wordpress 链接 排序进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程#xff0c;首先我们要知道两点
我们可以同时启动多个程序#xff0c;也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些… 进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程首先我们要知道两点
我们可以同时启动多个程序也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些进程操作系统实际上是不认识这些可执行程序的它能控制进程实际上是遵循了“先组织后描述”的设计理念(即先将这些可执行程序的基本属性如名称、状态、调用接口等定义成一个结构体然后通过链表或者其他数据结构对其进行管理) 大致可以将该结构体理解成以下形式
struct xxx
{//状态//优先级//内存指针字段(为了运行这个程序应该去哪里找对应程序的代码)//标识符//......(包含所有进程几乎所有的属性字段)//struct xxx*next;
};描述进程
进程信息被放在一个叫做进程控制块的数据结构中可以理解为进程属性的结合一般我们称进程控制块为PCB(process control block),Linux操作系统下的PCB是task_struct
task_struct-PCB的一种
在Linux中描述进程的结构体就叫做task_structtask_struct是Linux内核的一种数据结构它会被装载到PAM(内存)里并且包含着进程的信息 那么什么是进程呢进程 内核pcb对象(内核数据结构) 可执行程序。 在了解以上知识后我们就不难理解假设可执行程序的大小为1M,加载到内存时实际上操作系统为了在内存中为了管理这个进程实际开辟的空间是要大于1M多出来的空间就为结构体对象pcb。 一个可执行程序加载到内存中还不够系统还会建立对应的pcb对象并将这些对象放到一个整个系统层面的链表当中系统拿到pcb的链表对进程的管理就变成了对整个pcb链表的管理未来所有对进程的管理工作就只和进程的PCB有关而与可执行程序无关 另外可以将PCB对象放到放入到任何数据结构中比如当一个可执行程序需要被CPU进行调用时操作系统就会将PCB对象放到CPU的运行队列中等待CPU进行调用。所以我们又可以得出一个结论进程排队本质上是让PCB对象排队
task_stuct内容分类
标示符: 描述本进程的唯一标示符用来区别其他进程。状态: 任务状态退出代码退出信号等。优先级: 相对于其他进程的优先级。程序计数器: 程序中即将被执行的下一条指令的地址。内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据[休学例子要加图CPU寄存器]。 IO状态信息:包括显示的I/O请求,分配给进程的IO设备和被进程使用的文件列表。(比如当执行到C语言的printf函数的时候操作系统就需要暂时将屏幕的使用权给该程序当执行完之后不需要用到屏幕就将屏幕的使用权归还给操作系统)记账信息:可能包括处理器时间总和使用的时钟数总和时间限制记账号等。其他信息 这里简单介绍一下程序计数器CPU中有一个寄存器叫做PC指针或者叫做eip寄存器这里面存的是当前正在被执行指令的下一行指令的地址通过对程序计数器的初步了解我们可以知道以下两点
编程语言语法中的判断、循环和函数跳转的本质其实就是修改PC指针PC指针指向哪个进程代码就表示哪个程序正在被调度执行
查看进程
查看进程信息可以使用ps axj指令 当我们运行一个程序比如编译好的代码 然后我们要去查看可执行程序为mybin的进程 几乎所有的指令就是程序运行起来也要编程进程
通过系统调用获取进程标识符 在Linux中普通进程都会有它的父进程
进程id(PID)父进程(PPID) 在Linux中获取进程id和父进程id的方式就是getpid和getppid两个函数为了了解这两个函数现在man手册中查一下它们的信息
现在再将之前的代码做一些修改 发现每次的子进程id都会改变但是父进程id不变
通过父进程id找到这个进程发现这个进程是bash,所以我们在命令行当中启动的程序最终转化成进程都是bash的子进程而bash就是命令行解释器