山东网站建设平台,桐城58网站在那里做,哪里免费做网站,怎么找wordpress博客目录
进程的基本概念
进程控制块-PCB
学前补充
预备知识
创建#xff08;子#xff09;进程
创建#xff08;子#xff09;进程的原因
理解fork有两个返回值 进程的基本概念
基本概念#xff1a;程序的一个执行实例#xff0c;正在执行的程序等
内核层面#x…目录
进程的基本概念
进程控制块-PCB
学前补充
预备知识
创建子进程
创建子进程的原因
理解fork有两个返回值 进程的基本概念
基本概念程序的一个执行实例正在执行的程序等
内核层面担当分配系统资源CPU时间、内存的实体
操作系统如何管理进程 先描述 操作系统将一个磁盘中的可执行程序加载到内存中时内存中只有可执行程序的代码和数据如果这一部分也算进程的话该进程什么时候开始被调度的被调度了多少时间了......这些信息是“代码 数据”部分不包含的所以加载到内存的可执行程序的代码和数据不是进程它们只是构成进程的代码段和数据段是进程的一部分操作系统为了管理进程会将代码段和数据段中的属性以及进程所需的其它属性当前状态加载时间...都进行描述并将所有描述放入一个叫PCB的结构体中PCB中还有一个用于访问内存中该进程数据段和代码段的内存指针以及存放下一个PCB地址的next指针一个进程对应一个PCB每当加载一个进程时系统就会生成一个对应的PCB简单定义进程 PCB 自己的代码段和数据段 后组织 将所有PCB连接成一个链表此时操作系统对进程的管理就变成了链表的增删改查 进程控制块-PCB
基本概念process control block是进程的所有属性的集合是对所有操作系统中进程控制块的统称是一个内核中的数据结构在不同操作系统中进程控制块会有不同的具体名称Linux操作系统内核中又叫任务结构体“Task Struct”
为什么要有PCB操作系统要对进程进程管理 磁盘中的可执行程序的代码段和数据段被加载到内存中操作系统会生成该可执行程序对应进程的属性集合-进程控制块所有进程控制块会连接成一个数据结构队列等CPU对进程进程调度时会去队列中选取进程调度
结论所谓的进程在操作系统排队不是代码和数据排队实际上是进程控制块在排队 问题进程是如何动态运行的 答进程控制块通常会被放置在不同的队列中操作系统可以根据进程的状态和优先级动态调度这些队列中的进程从而实现了进程的动态运行和资源管理同一个进程控制块PCB可以被放置在多个不同的队列中 学前补充
./可执行二进制文件的本质是让系统创建进程并运行在本质上我们自己所写的代码形成的可执行文件 系统命令 可执行文件linux中运行的大多数指令本质都是运行进程ps指令用于查看所有的当前进程 预备知识 task_struct中的属性 标识符每个进程对应一个特殊的标识符状态任务状态退出代码退出信号等优先级相对于其它进程的优先级程序计数器程序中即将被执行的下一条指令的地址内存指针包括程序代码和进程相关数据的指针还有和其它进程共享的内存空的指针上下文数据进程执行时处理器的寄存器中的数据I / O状态信息包括显示的I/O请求分配给进程I/O设备和被进程使用的文件列表记账信息可能包括处理器时间综合使用的时钟数总和时间限制记账号等其它信息 1、显示当前所有进程的详细信息指令ps axj 2、显示指定进程的详细信息指令ps axj | grep 指定进程名的关键字 有两行的原因是grep也是一个进程它用来过滤出叫myprocess的内容
3、查看获取的首行信息ps axj | hear -1 4、同时执行多个指令指令1 指令2 ... 5、查看获取的首行信息与指定的进程信息指令ps axj | head -1 ps axj | grep 指定关键字 6、 每一个进程都有属于自己的标识符PIDPID互不相同task_struct中的无符号整型变量
7、PID位于操作系统的内核数据结构中用户不能直接访问操作系统内内核数据结构中的PID 8、在不使用ps指令的前提下用户想要获取自己所写的可执行程序的PID需要使用操作系统提供的系统调用接口getpid
接口原型pid_t getpidvoid包含头文件unistd.h功能返回子进程的PIDpid_t类型是对unsigned int 类型的封装 get ppid指令是用于获取当前进程的父进程的PID一个子进程是由父进程创建的 每次启动子进程时子进程的pid都不一样但是父进程的ppid都一样 父进程就是命令行解释器bash 9、ctrl c本质是就是杀死进程的指令还有其它杀死进程的指令kill -9 进程的PID 创建子进程
基本概念新建进程即在操作系统的内核数据结构中新增一个进程控制块而用户不能直接对操作系统的内核数据结构进行增删改查所以需要用到操作系统提供的系统调用接口
系统调用接口原型pid_t forkvoid
包含头文件unistd.h
功能创建子进程
监控脚本指令while :; do ps axj | head -1 ps axj | grep myprocess | grep -v grep; sleep 1; done
代码预期效果先打印一行等待三秒后打印两行hello world等待五秒后程序结束 结论1fork后父子代码共享 创建一个进程的本质就是系统中多了一个进程多了一个进程进程 PCB 数据和代码就意味着内核数据结构中多了一个进程控制块内存中多了该进程对应的数据段和代码段父进程的数据段和代码段可能是从磁盘中获取的但是子进程的代码段和数据段是从哪里来的默认情况子进程继承父进程的代码段和数据段这就是为什么fork之后父子进程的代码才是共享的但是因为进程具有独立性所以从原则上讲父子进程的数据段是要分开的而代码段由于具有只读性质所以是可以共享的数据段的独立是通过写时拷贝技术实现的 创建子进程的原因
目的令子进程和父进程执行不一样的代码
做法利用fork接口的返回值
返回值 -1创建子进程失败返回值 0运行子进程代码返回值 0运行父进程代码
注意事项
1、fork接口会返回两次返回值
2、两次返回值的id一个是子进程的id一个是父进程的id父进程的id是子进程的pid
验证 fork后父子进程实际上还是共享一段代码只不过这里通过if...else语句让二者执行不同内容之前if和else的内容不能同时进行是单进程这里二者可以同时进行是多进程
理解fork有两个返回值
问题不考虑特殊情况当一个函数执行到return时函数的核心工作是否以及完成
答是因此在调用fork()函数后父进程和子进程的创建是在fork()函数返回之前完成的此后的代码会被父子共享包括return id因此返回两次id一个是父进程的id一个是子进程是否创建成功的id ~over~