进程概念:
- 冯诺依曼体系结构—现代计算机硬件体系结构
- 操作系统—管理
- 进程概念–进程是什么
所有的设备都是围绕存储器工作的
标准输入设备输入指令,加载到内存中,然后内存交给cpu处理指令,将处理好的指令再交给内存,内存在交给标准输出设备。(时加载到cpu的寄存器上处理)。
- 操作系统:一个软件安装在计算机硬件上。为的是让计算机更加好用,合理统筹计算机上的硬件资源。
- 库函数与系统调用接口的关系:库函数封装了系统调用接口,他们是上下级关系。
什么是进程
说的通俗一点就是进行中的程序
操作系统通过pcb来控制进程的运行,这个pcb(一种进程描述符)也叫进程,在操作系统角度,进程就是pcb-task_struct(task-struct是linux系统下的一个结构体,保存了一个进程的相关信息),pcb上的内存指针会指向当前要运行的程序在内存中的地址。
cpu一次只能够处理一个进程,那么我们平时在开启多个软件的时候,并未感觉到卡顿
这源自cpu的分时机指:切换调度进程,每个进程只在cpu中运行很短的一段时间,(时间片)。
当在调度的时候会切换到下一个进程是必须要记录当前地址的上下数据才会切换到下一个进程,否则将会被cpu遗忘。
pcb记录了什么
- 内存指针
- 程序计数器
- 上下文数据
- 进程符PID
- 进程状态
- 优先级-交互式/批处理是(交互式就是正在和用户交互的进程,批处理即使未关闭的,并且还没有和用户交互的进程)
- IO状态信息
-记账信息
一个程序是如何被cpu运行的
首先一个软件躺尸在磁盘中,然后当你需要的时候,他被拷贝到内存中,然后操作系统会创建一个pcb来描述这个进程,当被拷贝到内存中去的时候只是一堆1 ,0数据。
进程查看
ps -ef aux 查看系统所有的进程信息
/proc 保存系统中正在运行的进程信息
pid_t getpid() 获取调用进程的PID
进程创建
创建一个子进程fork()—通过复制调用进程(父进程)创建一个(子进程)
复制父进程的pcb意味着和父进程拥有相同的内存指针,程序计数器,上下文数据,和父进程运行相同的代码,一样的运行位置,处理同样的数据
父子进程代码共享,数据独有。
怎么样理解这句话呢,当父进程运行到fork()函数的时候 就会创造一个子进程,然后函数结束返回子进程的pid,父子进程pid不同
如何分辨父子进程——返回值
父进程:返回子进程的pid,pid>0.
子进程:返回0.
失败返回-1.
创建子进程的意义:
分摊压力,cpu资源足够的情况下父子进程同时处理数据,效率高,或者希望他完成其他的任务。
进程的三种状态
就绪 , 运行, 阻塞
linux进程的状态 - 运行态(R)
- 可中断睡眠态(S)
- 不可中断睡眠态(D)
- 停止态(T)
- 僵死态(Z)
- 死亡态(X)
- 追踪态(t)
僵尸进程:处于僵死态的进程—进程退出但是资源没有完全释放(没有完全退出)
如何产生:子进程先于父进程退出,但是将自己的退出原因保存在了pcb中,操作系统检测到了子进程退出,因为有可能父进程关注子进程退出原因,所以操作系统不敢随意释放资源,通知了父进程,但是父进程可能现在在忙着处理其他的事情,没关注到这个通知,导致了子进程退出,但是资源一直没有完全释放,成为僵尸进程
僵尸进程危害:资源泄露,一个用户能够创建的进程是有限的,可能导致其他新的进程创建失败。
处理僵尸进程的办法kill -9无法杀死僵尸进程,那么可以通过杀死父进程的方法来杀死僵尸进程。
如何避免:进程等待
孤儿进程:父进程先于子进程退出,子进程成为孤儿进程,运行在后台,父进程变成号进程(孤儿院院长)
守护进程/精良进程(特殊的孤儿进程)
关于僵尸进程,详细的信息可以关注这位大佬 博客 https://blog.csdn.net/juS3Ve/article/details/81125530