进程概念、进程状态
Linux系统编程阶段:使用Linux系统提供的接口完成指定功能程序的编写;(进程概念,进程控制,基础IO,进程间通信,进程信号,多线程)
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
进程概念:冯诺依曼体系结构,操作系统,进程概念,进程状态,环境变量,程序地址空间
冯诺依曼体系结构:现代计算机的硬件体系结构(规定了现代计算机应该有哪些硬件单元)
硬件单元:输入设备–键盘,输出设备–显示器,存储器,运算器+控制器(中央处理器CPU)
所有设备都是围绕存储器工作的,存储器是作为中间的数据缓冲而存在的
系统调用接口:操作系统提供的系统访问内核的接口;
库函数与系统调用接口的关系:库函数实际上就是对系统调用接口进行的一层封装后的接口;
一、进程概念
1.创建进程
进程:运行中的程序
进程控制块pcb:程序运行的描述
通过程序的运行描述,操作系统就可以调度哪个程序可以占用CPU去运行指令
要运行哪个程序,则操作系统找到对应程序的pcb,在pcb中取出所需程序的运行所需信息,加载到CPU上,CPU就开始运行这个程序了对于操作系统来说,进程就是一个程序运行的描述,通过这个描述,操作系统可以进行程序的调度运行管理,实际上对于系统来说,进程就是pcb。
这个程序运行的动态描述,叫做pcb进程控制块,在Linux下是一个task_struct结构体
- 时间片:CPU调度运行程序的时间段,时间片过后,就该切换调度下一个进程了 并发:一种轮询
- 处理的方式 并行:同时运行
- 描述信息:内存指针,上下文数据,程序计数器,进程ID-pid,IO信息,进程优先级,进程状态,记账信息…
进程的简单操作:
创建进程:进程就是一个pcb是一个task_struct结构体(Linux中),创建一个进程实际上就是创建了一个task_struct结构体
pid_t fork(void)–创建进程接口–通过复制调用这个接口的进程(父进程),创建一个新的进程(子进程)
返回值:对于父进程会返回子进程的pid;对于子进程返回0;
代码如下(示例):
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4 int main()
5 {
6 printf("------\n");
7 pid_t pid = fork();
8 if(pid < 0){//子进程复制了父进程,因此往后的代码父子进程都会运行,但是因为返回值不同因此进入不同的if
9 //出错了
10 }else if(pid == 0){
11 //子进程--对于子进程返回值是0
12 }else{
13 //父进程--对于父进程返回值是子进程的pid,因此返回值是大于0的
14 sleep(5);
15 exit(0);//退出进程--谁调用谁退出
16 }
17 printf("hehe:%d\n",getpid());
18 while(1) sleep(1);
19 return 0;
20 }
运行结果:
此处的3028为进程id
因此这里的3028为3027的子进程
二、进程状态
进程状态:用于操作系统对于进程的管理(什么样的状态该对进程进行什么样的操作)运行态,就绪态,阻塞态
Linux中的进程状态:
运行态(R):正在运行或者轮转到时间片则能够运行统称运行态
可中断休眠态(S):可以被中断的休眠状态(满足唤醒条件,或者休眠被中断则进入运行态)
不可中断休眠态(D):不能被中断的休眠状态(满足唤醒条件之后才会进入运行态) 停止态(T):停止运行状态,(依然会被调度但是什么都不做)
僵尸态(Z):进程已经退出不再调度了,但是这个进程的资源还没有被完全释放,等待处理的一种状态
进程状态
僵尸进程:处于僵尸态的进程,是一种退出了,但是资源没有被完全释放的进程
产生:子进程先于父进程退出,但是父进程没有关注到子进程的退出,因此系统不会完全释放子进程的资源,这个子进程进入僵尸状态
- 危害:资源泄露(一种是pcb所占的内存资源一直无法被回收,一种是一个用户所能创建的进程数量是有限制的)
- 解决方案:
- 处理:退出父进程
- 避免:进程等待
孤儿进程:父进程先于子进程退出,子进程就会成为孤儿进程,运行在后台,父进程成为1号进程(早期名字叫init进程,后期叫syatemd)