Linux:深入理解进程的概念
基本概念
- 进程就是一个运行起来的程序(程序:一系列有序的指令集合 )
进程是什么?
- 进程就是pcb,是操作系统对一个运行中程序的描述,通过这些描述信息,完成对一个程序控制运行调度。
- Linux操作系统下的pcb是一个结构体:struct task_struct {…}
task_struct(pcb的一种)
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
task_ struct的内容分类
-
标示符: 描述本进程的唯一标示符,用来区别其他进程。
-
状态: 任务状态,退出代码,退出信号等。
-
优先级: 决定进程cpu调度优先权的级别— 权级其实就是一个数字
-
程序计数器: 程序中即将被执行的下一条指令的地址。
-
内存指针: 用于指向程序指令数据在内存中的位置。
-
上下文数据: 进程执行时处理器的寄存器中的数据。
-
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
-
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
-
其他信息、
cpu的分时机制
进程在操作系统中是调度切换运行的,每个进程都有一个cpu时间片(一个进程在cpu上的运行时间段),在cpu上时间片运行完毕后则切换到下一个进程
进程和程序的区别
- 程序时静态的指令集,存储在文件中
- 进程是一个程序动态的运行过程,需要被加载在内存当中,需要被cpu处理,切换调度…
查看进程
ps -ef 查看系统下所有进程信息
ps aux 查看系统下所有进程信息(更加详细)
获取进程标示符
pid_t getpid(void) — 返回调用进程的pid — 谁调用就返回谁的pid
- 进程id(PID)
- 父进程id(PPID)
进程创建
- 进程就是一个pcb,意味着创建一个进程,就是创建一个pcb
- pid_t fork(void) — 通过复制调用进程(父进程)创建一个新的进程(子进程)
- 创建了一个新的pcb,然后从父进程pcb中复制了很多数据过来(复制的信息:内存指针,程序计数器,上下文数据…)
- 内存指针:子进程与父进程运行的代码其实是一样的—指向同一块物理内存中的数据以及指令
- 程序计数器/上下文数据:自己成被创建出来后,运行位置与父进程是完全一样的,下一步即将执行的指令都是从创建子进程成功之后开始的,创建一个子进程出来,跟父进程干的事情是一样的,因为他们的运行的代码和数据以及当前的运行位置都是一样的。
父子进程都是一个pcb,因此都有可能被cpu调度运行,并且谁先运行不一定
创建进程-fork
-
运行
man fork
认识fork -
fork有两个返回值
-
父子进程代码共享,数据独有(采用写时拷贝)
-
通常根据fork的返回值进行代码的分流,让父子进程进入不同的执行体完成不同的功能
因为这个函数的返回值对于父子进程是不一样的
- 错误则返回-1;
- 在父进程中返回创建的子进程的pid>0
- 在子进程中返回的是0
示例代码:
#include <stdio.h>
#include <unistd.h>
int val =100;
int main() {
int ret = fork();
if(ret < 0){
perror("fork");
return 1;
}
else if(ret == 0){
printf("I am child : %d!, ret: %d\n", getpid(), ret);
val = 1;
printf("child:val = %d, &val = %p\n",val, &val);
}
else{
printf("I am father : %d!, ret: %d\n", getpid(), ret);
printf("father:val = %d, &val = %p\n", val, &val);
}
sleep(1);
return 0;
}
代码运行图
由图能看得出来: 代码共享,数据独有!
思考题:
- 操作系统如何实现多个程序的调度运行?
将这个运行中的程序描述并组织起来,通过实现对pcb的调度管理实现对运行中程序的切换调度运行—对于操作系统来说这个描述信息 - pcb(就是进程)
- 操作系统与cpu,pcb的链接关系?
操作系统认为现在要运行哪个程序了,则找到对应的pcb,把当前的pcb指向的那个程序的程序计数器中的地址(地址对应着保存各种描述信息),加载到cpu寄存器上。
操作系统调度哪个程序在cpu上运行,操作系统中有一系列的调度算法
cpu多核—多个处理核心 — 每个核心都有自己的寄存器,可以调度一个程序的运行
并发:轮询处理执行(单核cpu)
并行:同时运行/执行(多核cpu)
- 为什么要有优先级:
- 交互式程序:直接与用户进行交互的进程 — 要求最好能够更加优先的被cpu处理
- 批处理程序:在后台默默做循环工作的进程
优先级的作用:让操作系统运行的更加良好
如有不同见解,欢迎留言讨论~~