静态IP PyCharm dictionary parsing go cakephp vue案例 vue论坛 vue绑定事件 vuejs 教程 hadoop源码 python实例 python开发教程 python变量类型 python函数大全 java在线教程 java编译 java数组添加元素 java入门基础 java停止线程 易语言多线程 只狼脚本 hexworkshop 源计划艾克 c语言编程实例 pdf密码移除 电脑书籍下载 ps去白底 截取字符串 widcomm dnf传说 卸载mysql excel后缀 mac办公软件 spring拦截器 camworks 怎么用打印机扫描文件 电脑防护软件 外景拍照姿势 电脑微信官方下载
当前位置: 首页 > 学习教程  > 编程语言

linux学习笔记[华电](9)——进程管理

2020/10/16 18:26:07 文章标签:

进程管理 进程可以理解为运行中的程序,是动态的。 linux下的进程 每个进程都有唯一的标识号——PID。 PID号是一个int型整数,由系统循环使用。如果超过了最大值,就从0开始寻找还没被使用的PID号。 进程可以产生新的进程形成一棵进程树。 p…

进程管理

进程可以理解为运行中的程序,是动态的。


linux下的进程

每个进程都有唯一的标识号——PID
PID号是一个int型整数,由系统循环使用。如果超过了最大值,就从0开始寻找还没被使用的PID号。
进程可以产生新的进程形成一棵进程树。

ps #查看进程信息
pstree #查看进程树,现在根结点一般是systemd进程

在这里插入图片描述
每个进程都有一个用户标识。

#打印所有用户的进程的详细信息
ps aux
ps -ef

进程组

一个进程属于且仅属于一个进程组。最前边的是组长,组ID号为组长的PID。
向进程发送信号,组内所有进程都收到:

  • ctrl+c向前台进程发送一个system信号,前台进程收到信号自动退出。前台程序就是占据当前bash输入的程序。
#让程序到后台运行,bash依然可以响应各种命令。
./buf & 
  • ctrl+z让程序放弃前台,并被挂起。
bg #将挂起的进程放入后台执行
fg [编号] #将挂起的进程放入前台执行
jobs #查看所有进程状态

在这里插入图片描述

会话

每个进程都属于唯一一个会话。
一个会话只能有一个进程组是前台进程组,会话ID是首进程的PID。

获取进程的属性

函数作用
getpid获取自己的进程ID号
getppid获取父进程的进程ID号
getpgrp获得组ID
getuid获得有效ID

控制终端

现在基本是通过网络连接的伪终端。

tty #查看当前终端名称
who #显示连接次终端的用户
write #向其他用户发消息,类似于邮箱的方式
stty -a #查看终端的设置信息,可以看到各种设置的快捷键

在这里插入图片描述
终端关闭时,所有在该终端中运行的进程会收到SIGHUP信号,默认终止进程,若不让它终止,可以使用nohup命令。

nohup ./buf & #忽略SIGHUP信号,会继续在后台运行

进程的运行状态

  • 执行态
  • 就绪态
  • 睡眠态
  • 僵尸态(zombie)
top #查看进程的实时状态

在这里插入图片描述
僵尸状态,进程结束退出但是并未消亡的状态。
init进程发现任何一个子进程结束退出后,都会保存它的PCB块,直到父进程调用wait函数把返回值取走之后,才会把这个PCB块删掉。否则,就会一直存在,变成僵尸进程。
危害:僵尸进程PCE块会占用内存,并且拖慢了cpu遍历阻塞队列的速度,影响整个系统的效率。
解决方法:
1、父进程调用wait函数收集子进程的返回值。
2、父进程一开始运行时用signal函数明确忽略SIGCHLD信号。

进程的优先级

作为一个多任务操作系统,linux采用优先级调度。数值越低,优先级越高。
优先级数值 = 优先级别PR + 谦让值NI

  • 在进程启动时,可以通过系统调用nice对NI进行修改,只有root可以把NI数值改小。
  • 在进程运行中,通过renice命令。
  • 在代码中修改,通过setpriority命令。

真实的main函数

int main(int argc,char *argv[],char *env[])

系统调用getopt获取命令行参数,解析短选项(单个字母)。
循环解析参数,无选项时返回-1。
在代码中调用。

getopt(int argc,char *argv[],char optString[]);
getopt(argc,argv,"a:loe");

在bash中执行。

./demo -a xxx -l

解析长选项,使用getopt_long。

环境变量

getenv获取特定名字的环境变量的值。
putenv设置环境变量。

分配内存

局部变量在进程的栈中分配,malloc在堆中分配内存。

fork

产生一个新进程,类似于克隆当前进程,除了PID不一样,其他都一样。
代码段共享,数据段和堆栈独立。
调用fork后将在父进程和子进程中返回,立刻保存返回值:

  • new_pid = fork();
  • 返回new_pid>0,父进程
  • 返回new_pid=0,子进程

exec

子进程替换为另外的可执行程序的代码,完全覆盖。
先fork,再exec,以创建新进程。

  • 参数以list形式传递
    • execlexeclpexecle
  • 参数以vector形式传递
    • execvexecvp

system

系统调用system是先启动一个shell,在shell当中再创建新进程。
不推荐使用。必须先启动shell,效率也不高。

exit,_exit

通常使用exit结束进程,并退出。
_exit退出,不刷新缓冲区。

wait

子进程退出时,会发出SIGCHLD信号,没有忽略这个信号,父进程必须要调用wait函数,避免成为僵尸进程。


总结

内容不少,上课讲的很快,有点跟不上了。


本文链接: http://www.dtmao.cc/news_show_300425.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?