进程
一台电脑,你一边在用谷歌浏览器上网,一边在听网易云音乐,一边在用Word写文档,同时有3个任务正在运行。
抛开多核CPU的概念,假设这台电脑是古老的单核CPU,它是怎么执行多任务的呢?
事实上每个任务都是由CPU交替轮流执行的。
任务1花了0.01秒,任务2花了0.03秒,任务3花了0.05秒。。。。只是作为任务的执行者,CPU的速度实在是太快了,所以我们感觉就像所有任务都在同时执行。
这里的一个任务就是一个进程(Process),进程有三种状态:就绪(Ready)、运行(Running)、阻塞(Blocked)
这个过程
线程
线程(Thread)是什么呢?进程的颗粒度太大,每次都要有上下文的调入,保存,调出。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:程序A得到CPU ,CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,分的更为细小的CPU时间段。
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
进程与线程的区别
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位
资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的
影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。
执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行
最大进程数与当前进程数
最大进程数:ulimit -u
修改这个值:
centos 6.*可以修改/etc/security/limits.d/90-nproc.conf
centos 7.*可以修改/etc/security/limits.d/20-nproc.conf
查询当前整个系统已用的进程数:
ps aux |wc -l 或 top
如果安装了zabbix客户端,还可以用zabbix_agentd -t proc.num[]来测试key
当前线程数与某个进程的线程数
查询当前整个系统已用的线程数:
pstree -p | wc -l 或 top -H
查看某个进程的线程数:
1、top -H -p pid
也可以top -p pid再按H,线程会一个个加载出来
2、pstree -p pid |wc -l
如果用程序名:pstree -p `ps -ef | grep ssop |grep -v grep| awk '{print $2}'`|wc -l
3、cat /proc/pid/status
4、ll /proc/pid/task/|wc -l
参考:
线程和进程的区别是什么? - zhonyong的回答 - 知乎 https://www.zhihu.com/question/25532384/answer/81152571