zoukankan      html  css  js  c++  java
  • 进程与线程

    进程

    一台电脑,你一边在用谷歌浏览器上网,一边在听网易云音乐,一边在用Word写文档,同时有3个任务正在运行。

    抛开多核CPU的概念,假设这台电脑是古老的单核CPU,它是怎么执行多任务的呢?

    事实上每个任务都是由CPU交替轮流执行的。

    任务1花了0.01秒,任务2花了0.03秒,任务3花了0.05秒。。。。只是作为任务的执行者,CPU的速度实在是太快了,所以我们感觉就像所有任务都在同时执行。

    这里的一个任务就是一个进程(Process),进程有三种状态:就绪(Ready)、运行(Running)、阻塞(Blocked)

    这个过程

    比如执行一段程序代码,当被分配得到CPU前,此进程已获得除处理器外的所需资源,静静地等待被分配处理器资源,此状态即Ready;
    当被分配得到CPU时,进程占用处理器资源,一般来说,处于此状态的进程的数目小于等于处理器的数目(CPU核数),此状态即Running;
    这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所说的程序上下文。
    当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸;
    在被切换出去的最后一步工作就是保存好程序的上下文,因为这个是下次他被CPU临幸时的运行环境,必须保存。
     
    前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:
    先加载程序A的上下文,然后开始执行A,保存程序A的上下文;调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。。。。
    进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文

    线程

    线程(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

    https://blog.csdn.net/wisgood/article/details/80630014

  • 相关阅读:
    Error 1031
    电信短信转移取消
    手机模拟手柄操作电脑游戏
    MySQL 5.7 InnoDB Cluster 部署
    Bitwarden_rs搭建
    脚本:Tomcat日志切割
    报错:The server cannot be started because one or more of the ports are invalid. Open the server editor and correct the invalid ports.
    Linux启动过程详解
    UNIX环境高级编程__针对apue.h找不到的情况以及log错误信息输出的问题
    C++primer_拷贝控制之13.26联系控制成员实现类值行为
  • 原文地址:https://www.cnblogs.com/xulan0922/p/12982086.html
Copyright © 2011-2022 走看看