1.进程概念
用户理解层面:
进程就是运行起来的程序。
从操作系统层面理解进程:
程序运行需要将代码数据加载带内存中,操作系统上运行了很多程序
操作系统必须管理这些程序的运行
在操作系统的层面,进程就是操作系统对一个运行程序的描述。
(举个栗子:在校长眼里,只能通过档案管理学生,不能直接指导xxx是哪位同学)
在操作系统眼中,通过对运行程序的描述来进行管理,
这个运行程序的描述就是PCB(进程控制块)
PCB —Linux下是struct task_struct结构体
PCB的描述信息:
内存指针,程序计数器,上下文数据,标识符(process id),进程状态,进程优先级(cpu资源的优先分配权),记账信息,io状态信息
2.进程查看
ps -ef
ps -aux //都可以查看系统进程信息
3.进程创建
fork()
创建子进程的意义何在:
1.分摊任务处理压力;
2.让子进程背锅;
创建进程:–fork()–操作系统通过复制调用进程创建一个新的子进程
复制:复制父进程的pcb(代码共享,数据独有)
如何让子进程完成其他任务?(分辨出父子进程)
根据返回值:
(1)对于父进程来说:fork返回值为子进程的PID;创建子进程失败返回-1
(2)对于子进程,fork返回值是0;
数据独有,代码共享 (指向同一个内存指针)
4.进程状态
运行:
(1)R (拿到时间片即可运行,或正在运行)
(2)可中断休眠:S(可被简单操作唤醒)
(3)不可中断休眠:D(磁盘休眠,特定方式唤醒,睡够了才醒,即通 常等待io调用结束)
4.1僵尸进程
概念:进程先于父进程退出,因为要保留退出原因,因此操作系统不能直接释放所有资源,通知父进程获取退出原因,允许操作系统释放资源。但是父进程没有关注到这个通知,系统无法释放资源,导致处于僵死状态称为僵尸进程。
僵尸进程的危害:导致资源泄露:
如何避免:进程等待
处理方式:退出父进程
代码模拟:
查看进程:
直接杀死子进程,让其变成僵尸进程Z
杀死父进程可以解决僵尸进程
4.2 孤儿进程
概念:父进程先于子进程退出,子进程就会成为孤儿进程,运行在后台,父进程成为1号进程。
测试代码同上
我们运行程序,并查看进程信息,可以发现此时父进程的pid是3977,子进程的pid是3978,然后我们结束掉父进程,父进程直接消失了,而子进程的状态变成了S,没有了“+”,此时运行在后台了。
我们发现运行在后台的孤儿进程父进程变成1号进程