ChuckTalk--LinuX--进程

进程概念:用户角度:正在运行的程序

                 操作系统角度:进程就是操作系统对运行中程序的描述信息——进程描述符——pcb

cpu处理多个进程时:运用cpu分时技术在多个进程间轮流进行

时间片:cpu在每个进程上运行的时间段

在LinuX中,pcb实则为一个描述结构体

struct task_struct

描述信息:标识符PID、进程状态、优先级、程序计数器、内存指针、上下文数据、文件的IO状态信息、记账信息

(1)标示符PID : 描述本进程的唯一标识符,用来区别其他进程。

(2)状态 :任务状态,退出代码,退出信号等。

(3)优先级 :相对于其他进程的优先级。

(4)程序计数器:程序中即将被执行的下一条指令的地址。

(5)内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。

(6)上下文数据:进程执行时处理器的寄存器中的数据。

(7) I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

(8) 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

创建进程:创建进程就是创建pcb(结构体),程序运行时被加载到内存,若此时将程序删除,则进程中该程序仍在运行。

 

虚拟寻址:cpu通过生成一个虚拟地址来访问主存,这个虚拟地址在被送到内存之前先转换成适当的物理地址(地址翻译),地址翻译需要cpu和操作系统的合作,cpu上叫做内存管理单元的专用硬件,利用存放在主存中的查询表来动态翻译虚拟地址,该表的内容由操作系统管理。

pcb并非程序本身,是一种内存指针,代表该被控程序

查看进程:

1.ps:查看进程信息 -ef|grep pid

   ps -l只能查看当前bash的进程

   ps aux可以查看所有系统运行的进程

2.getpid:返回调用进程pid(获取进程ID)

  e.g: pid_t pid=getpid();

  printf("pid:%d\n",pid);

3.根目录/proc文件中存在进程PID名的文件夹(文件夹中包含.exe->路径(快捷方式),wd:运行的路径)

 

创建进程(创建pcb)

fork:通过复制调用进程,创建一个新的进程(子进程)

接口:pid_t fork(void);//创建子进程

如何判断父/子进程:

通过进程返回值判断;只有子进程返回0;父进程返回子进程的PID(大于0)

  e.g:  pid_t pid=fork();

          if(pid<0){ //创建子进程失败};return -1;

          if(pid==0){//为子进程};

          else{父进程};

进程状态:运行、就绪、阻塞(挂起)

LinuX下:运行态(R):程序申请到cpu即运行

                可中断睡眠态(S)

                不可中断睡眠态(D)

                停止态(T)

                追踪态(t)

                死亡态(X)

                僵死态(Z)

top:查看资源管理状态,若某进程cpu报占用100%可能:1.死循环(一般为纯粹的数据运算);2.占用多个cpu

运行状态:“+”代表在前端运行;

                   ctrl+z,暂停;kill pid,杀死pid进程;kill -18 -pid可杀死T状态的进程;kill -9强杀(除个别情况)

 

僵尸进程:处于僵死状态的进程

产生原因:子进程先于父进程退出,父进程接受的信号默认为忽略,所以无法取得子进程退出返回值,操作系统不能随意释放子进程资源,因此次是子进程处于退出但资源没有完全释放的状态。

危害:资源泄露,僵尸进程过多导致新进程无法创建        ulimite -a:可查看一个用户最多创建的进程数

解决方案:干掉父进程(子进程的返回值即退出原因已经毫无意义) 这里kill -9杀不掉

查找僵尸进程: ps -ef | grep defunct_process_pid

孤儿进程:父进程先于子进程退出(子进程不是前台进程,此时变为后台进程),被init进程收养

也称守护进程/精英进程:可由循环代码实现

避免僵尸方案:

进程等待:等待子进程退出

两种等待函数,一般推荐用第二种

1.pid_t wait(int* status);

防止子进程先退出,父进程一直等待子进程终止后再运行(阻塞函数),任意一个子进程退出则返回

阻塞与非阻塞概念:

        阻塞:为了完成功能发起调用,如果当前不具备条件则等待,直到完成才返回

        非阻塞:不具备条件是,立即报错返回不等待

2.pid_t waitpid(pid_t pid,int* status,int options);

可以等待任意一个或指定的子进程退出

pid:    pid=0,    等待任何和调用waitpid()在同一个进程组(线程)的进程;

          pid=-1,等待任一个子进程(此时与wait等价)

          pid>0,    等待指定pid的进程(pid<0时取绝对值)

status(不用时置NULL,不关心子进程退出返回值):

宏定义:    1.WIFEXITED:若为正常终止子进程返回,则为真

                  2.WEXITSTATUS:若WIFEXITED非零则为真,获取子进程退出码

options(可设为0,此时为阻塞):

WNOHANG:若pid指定的子进程没有结束,则waitpid()返回0,非阻塞,若正常结束,则返回该子进程的进程号

注意:waitpid的返回值表示的是是否有子进程退出,status才是子进程的返回值

 

优先级:决定进程能够具有cpu资源优先分配权的一个层级划分(让操作系统运行的更加合理)

查看进程优先级:ps  -l      PRI    NI修改优先级    PRI=PRI+NI

PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小 进程的优先级别越高

UID : 代表执行者的身份 

PID : 代表这个进程的代号 

PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号 

PRI :代表这个进程可被执行的优先级,其值越小越早被执行 

NI :代表这个进程的nice值

nice值范围(进程可被执行的优先级的修正数值):-20~19,调整优先级就是调整进程nice值

设置方法:1.renice    -n    ni_val    -p    pid

                 2.进入top后按“r”–>输入进程PID–>输入nice值进行修改

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行 

并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

 

环境变量:

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值