进程

1.什么进程
1)从用户角度就是运行起来的程序
进程是什么:进程就是运行起来的程序—用户层面的理解
2)从操作系统的层面理解:
程序运行需要将代码数据加载带内存中,而操作系统上运行了很多程序,操作系统就必须去管理这些程序的运行,先描述在组织进行管理,在操作系统的层面进程就是操作系统对一个运行的程序的描述。比如说校长想了解一个学生,校长看学生的档案就行,校长眼里看到了同学们的档案就仿佛看到真人,通过档案来管理学生
在操作系统眼中看到了对运行程序的描述就仿佛看到了进程,通过描述来管理程序,再做出处理。这个描述信息就叫PCB(Process Control Block),在Linux中就是task\_struct结构体;

2.task\_struct结构体:大致有 ①内存指针:程序代码等再内存中的位置;②程序计数器:保存下一次程序运行的位置,得到时间片后就可以加载继续跑;③标识符PID进程的标识符;④状态:进程状态,描述目前这个进程处于什么状态;⑤优先级:进程的优先级数字越小优先级越高,可以为负(优先分配CPU资源,让操作系统运行更加合理;交互式进程优先级要高);⑥记账信息:CPU运行的时间;⑦IO信息
https://blog.csdn.net/ningningmingming/article/details/79834186
https://blog.csdn.net/qq\_39539470/article/details/79542862

简要分析 :一个编写好的程序加载到了内存中就变成了一个进程即
进程=程序+执行
3.进程的状态
进程状态:笼统的说大致分为三个状态
**运行:**当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态;
就绪: 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态就称为就绪状态
**阻塞:**正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而进入阻塞状态。引起进程阻塞的事件有很多种,例如,等待I/O完成、申请缓冲区不能满足、等待信号等。
**4.linux下进程的状态:**在linux下进程的状态比较多
1)运行:正在CPU上运行
2)可中断休眠:在休眠,能被操作唤醒
3)不可中断休眠:特定的方式就可以唤醒(一般自己唤醒) 例如磁盘休眠(不可被打断,只能等磁盘IO完后自己唤醒)
4)停止:T 时间停顿,杀也杀不掉,等被唤醒时,就会处理睡眠时被发送的信号 ,例如对一个T状态的进程发送一个KILL信号,但是该进程无反应,在被唤醒后进程退出。但是还是KILL -9可以杀死停止的进程
5)僵死:Z,就是一个僵尸进程
僵尸进程:处于僵死状态的进程,子进程先于父进程退出,操作系统因为要保留退出原因,因此操作系统不能直接释放所有资源(释放了一部分),但是父进程没有及时关注这个通知导致操作系统要保存子进程返回地部分消息,之后就成为了僵死进程。处于僵死状态,称为僵死进程。
僵死进程的危害:资源泄露
如何避免:进程等待
如果产生僵尸进程了,那么退出父进程就可以让僵死进程退出
除了僵尸进程的一些其他进程:
孤儿进程: 父进程先于子进程退出(自杀,他杀,正常退出),之后子进程变为后台进程运行,子进程的父进程变成1号进程(孤儿院)
守护进程,精灵进程:特殊的孤儿进程:特殊在,他和以前的所有线程的关系都断了,一般进程名以d结尾
5)如何查看一个进程:
ps -aux 在linux下的命令栏直接输入就可查看本机的所有进程的详细信息
ps -aux| grep () 在括号中输入要搜索的进程名,就可以实现搜索功能
ps -ef 查看进程信息但是比-aux所查看的信息要少

6)进程创建:
pid\_t fork()
在父进程中返回的是子进程的pid,创建失败返回-1
在子进程中返回的是0.
创建子进程的意思何在?
1.分摊任务处理压力;
2.让子进程完成其他任务—背锅,例如子进程崩了不会影响到父进程。
复制:操作系统通过复制父进程,创建子进程,因此父子进程 数据独有(),代码共享;


#include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/types.h>
  4 int main(){                                                           
  5   pid_t re;  
  6   re=fork();                           
  7   if(re<0)                      
  8   {                                                  
  9     printf("Create an error");       
 10   }                
 11   if(re==0)                           
 12   {                                  
 13     while(1)                    
 14     {                                                
 15       printf("i m subprocess ID:%d\n",getpid());
 16    sleep(1);       
 17     }                                                 
 18   }                                                                                      
 19   while(1)                      
 20   {                                                  
 21     printf("I am parent procese ID:%d\n",getpid());
 22     sleep(2);      
 23   }                                                   
 24 return 0;           
 25 }

在这里插入图片描述
由图我们可以看见两个进程在打印信息,而且父进程打印一次,子进程打印两次。

接上文的补充:
进程的创建过程如下图:
在这里插入图片描述

标签: 进程, linux, 运行, 状态, 操作系统, 程序, 僵死

相关文章推荐

添加新评论,含*的栏目为必填