Linux操作系统--进程概念

Linux操作系统–进程概念
一、什么是操作系统?
操作系统也是一个软件
操作系统 = 操作系统内核 + 一组应用
操作系统内核:操作系统管理计算机资源的代码
一组应用:应用软件
二、操作系统是怎样来管理计算机资源的呢?
管理 = 描述(struct) + 组织(使用某种数据结构)
操作系统通过描述和组织的方式来管理计算机的软硬件资源
描述:
Linux操作系统--进程概念
Linux操作系统是使用进程控制块来描述进程的
1、进程控制块:本质上是一个结构体struct task_struct{ }; 一般使用他的别名:PCB(process control block)
使用 ps aux 命令可以查看当前进程
Linux操作系统--进程概念
对上图各个部分进行分析一下
USER:该进程属于哪一个用户
PID :进程号
STAT:当前进程状态
START:进程启动时间
TIME:占用CPU时长
COMMAND:进程启动的命令
2、当一个程序启动后操作系统内核会维护一个task_struct这样的一个结构体,并且在/proc/[pid] 文件夹下保存与当前进程相关的文件,但这个文件夹并不是一直存在系统中的,只有进程运行的时候才会存在,进程退出的时候就会被操作系统清理。
3、前台进程:在命令行中启动一个程序时,不能输入命令或输入命令无效
结束前台进程:ctrl + c
三、进程状态:
1、运行状态:进程此时拥有CPU,可以进行计算
2、就绪状态:在就绪队列中等待CPU资源
3、阻塞状态:等待标准(IO)进行数据输入,如果一直没有准备好数据,当前进程就会一直处于阻塞状态(死等)
Running(r ):运行状态
sleeping(s):可中断睡眠状态
Disk sleep(D):磁盘睡眠状态,不可打断
trace stop(t):跟踪状态 在gdb调试中会出现跟踪状态
X:死亡状态:程序员是看不到的,在进程退出的时候才能看到,在task_struct中存在
Z:僵尸状态
僵尸状态产生的原因:由于子进程退出,父进程来不及回收子进程的退出资源,而导致子进程变成僵尸状态,子进程的PCB并没有被内核释放,释放这样的PCB需要父进程进行回收,僵尸进程一般被强杀不了
僵尸进程的危害:泄露操作系统的资源,僵尸进程的PCB并没有被释放
四、孤儿进程
父进程先于子进程退出,子进程会被1号进程领养
领养原因:当子进程退出的时候需要回收他的退出信息
1号进程:操作系统启动的第一个进程,好多进程都是被1号进程创建的,又称为Init进程
注意:进程是有僵尸状态的,并没有孤儿状态
五、上面提到了父进程和子进程,那么父子进程是什么?又是怎样创建的?
1、先介绍两个接口
系统调用:pid_t getgid(void) 获取当前进程的pid的接口
系统调用:int fork() 创建进程,
直接上代码更容易理解:
Linux操作系统--进程概念

Linux操作系统--进程概念
这个代码会输出父进程pid和子进程pid
子进程就是父进程的一个深拷贝,但是用上图代码中分支语句可以区分父子进程的不同的逻辑
六、进程虚拟地址空间
1、当创建一个子进程时,子进程会拷贝父进程的页表结构,即将父进程虚拟地址空间和物理存储之间得映射关系也拷贝
2、如果创建完子进程,子进程也会通过页表结果映射到物理内存的同一块区域
3、如果父子进程都不进行修改,则映射的关系不会改变(写时拷贝技术)
4、写时拷贝:当父子进程当中有一方进程修改数据时,就会重新开辟一段空间,将子进程的映射关系修改
Linux操作系统--进程概念
5、进程虚拟地址空间 = 页号 + 页内偏移
页号:进程会将虚拟地址空间分成一页一页的结构
块号:物理内存被分成不同的块,每一块都有一个块号