进程、线程、CPU核数之间的关系(附加select细节)

前言:为什么要开线程?

目的

(1)是想等一个子程序执行完毕了,然后在继续操作!用启动线程,不然界面和别的进程无法工作,程序完了就完了没有如何效果和后续功能,然后用线程启动然后线程等待,比如摄像头不停的捕获图像,鼠标键盘任何时候输入都有效,开启后CPU会给这个进程分配专用的内存空间核cpu时间资源。

(2)其实很像中断函数一样,对一个函数开启线程后,当它处于等待IO发生动作后去执行比如键盘按下消息,没有按下时,一直处于阻塞,这是线程交出cpu,去执行其它线程或进程,如果你用while(1){},cpu会一直被占用,我们使用各种中断,也是为了避免while(1)卡住,而开线程后内核内部的调度机制会合理的分配cpu,比中断还要高级。

(3)开线程后,每个线程有独立的栈,当线程阻塞时,内存数据不会被释放,cpu被释放执行其他线程

(4)开线程后,当A线程的某个函数阻塞时,会交出CPU去B线程里面执行这时可能B的某个函数阻塞,去执行C线程,这样3个阻塞函数都被执行并等待条件到来,如果不开线程,三个阻塞函数在一个线程里面,只能永远在一个函数,其他2个阻塞函数不会执行并等待条件到来

 

1 程序与进程、线程的关系

(1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据集上运行的全部动态过程。

(2)进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点正是程序无法做到的,由于程序没有和数据产生直接的联系,既使是 执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程 肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运行在几个不同的数据集上)

(3)不同的进程可以执行同一段程序,比如读同一个文件数据,他们的读函数代码相同,并被2个进程或线程运行了。

(4)一般的,我们写的一个不同程序,没有单独开线程,默认这个程序的一次运行就是一个单进程单进程。如果我们调用fork,这时就会有2个进程,调用pthread,则这个进程就会有2个线程,一个是程序本身的函数while(1)不结束的执行,一个是开启的线程
 

2 单核cpu处理程序

2.1 单进程多线程处理

        (1)在一个应用程序里,添加键盘、鼠标功能,这就是单进程2线程,如果键盘线程获取了锁,那么这个线程将获取CPU的运行时间,其他线程将被阻塞。但CPU始终处于运行状态,影响计算时间的其实只是加锁和解锁的时间。并不会发生CPU空闲的现象。cpu利用率100%

        线程阻塞:一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待某种资源或信号量(即有了资源)将他唤醒。(释放CPU,不释放内存)

2.2 多进程处理

        (1)将键盘、鼠标分别写出两个独立的应用程序,独立运行,与上面不同的是,进程间通信如果要交换数据很麻烦,需要很多步骤,效率低

 

3 多核cpu处理程序

3.1 单进程多线程处理(线程可以夸核处理,进程之间不能,就像QQ不能访问支付宝一样,安全性)

        3.1.1 与单核对比区别在于,如果A核处理的键盘线程阻塞时,B核被空闲,CPU工作效率下降一半

        3.1.2 没有阻塞时,比如用QQ的A线程听歌,B线程发消息,多核CPU效率比单核快很多

            (1)比如QQ有4个线程用4个核处理分别需要20+5+3+2ms,处理完的总时间为20ms,实际上需要30/20=1.5个核处理最合理,一个处理20ms,一个处理5+3+2ms,4个核的效率则为1.5/4=37.5%

              (2)优化负载后,分配时间为10+7+7+6ms,30/10/4=75%,效率提高了,通过系统的处理可以最优化到每个线程的处理时间为30/4=7.5ms,效率就为100%

3.2 多进程多线程处理(就像电脑上,不同的应用程序,不可能一个进程融合QQ、支付宝、暴风等)

        (1)比如A核处理QQ,BCD核不能用来处理QQ,不能夸核处理,这一点上和单核一样,但是多核可以用B核处理支付宝进程,对于单核,它要一个人处理2个进程,时间上会慢,就会出现平时的卡顿

 

 

4  可以从进程与线程的区别考虑

4.1  进程,处理任务量多,每个进程具有独立的内存单元,占用CPU资源相对较多。

        (1)进程间通信就像a.out和b.out之间通信,两个程序之间的通信,所以相对复杂

        (2)在Linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.她是对进程控制的唯一手段也是最有效的手段,它记录了这个进程的所有信息,包括这个进程执行过程中,申请的内存空间,在这个结构体中都有记录,所以其他进程无法访问数据,QQ与支付宝就是,但是也有专门的函数让两个进程共享内存空间。

        (3)进程申请堆内存后,只是分配了虚拟地址空间,等进程被实际运行,并使用这段内存是才会映射到物理空间。

        (4)缺点:进程间切换开销大,10万人打仗,30万人运粮,进程间通信麻烦,效率低

4.2  线程,处理任务相对可以较少,同时为了处理并发性能,它们共享内存单元,占用资源少。

4.2.1 线程间通信

        (1)就像函数间通信一样,比如一个编译出来的可执行程序a.out,里面有一个main函数,main是主线程,主线程里面调用pthread_create是一个开启的新的子线程,所以在函数里面定义一个全局变量,两个线程(即两个函数)都能用,线程间共享内存。

            void *func(void *arg)
            {
                    读键盘处理函数
            }
            void main()
            {
                 pthread_create(&th,NULL,func,NULL);
                 while(1)
                  {    
                          //读鼠标处理函数
                  }

             }

5 select函数

(1)如果线程内使用select监听几个IO,每路IO本身是阻塞,被select之后对内非阻塞,整体select对外阻塞,只要返回值为正,说明一定有IO发生,进入对应的IO处理,执行函数时,这个函数一定不会阻塞住,因为能进去说明这个函数IO一定有动作

 

6  总结:

(1)进程是一个实体。每一个进程都有他自己的内存地址段(heap,stack等等),进程是执行中的程序。

(2)程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体。

(3)线程,又是被称为轻量级进程(Lightweight Process LWP),是程序执行的最小单元。每一个程序都至少有一个线程,若程序只有一个线程,那么就是程序本身。单线程的进程可以简单的认为只有一个线程的进程。一个进程在同一时间只做一件事,有了多线程后一个进程同一时间可以做多件事。每个线程可以处理不同的事务。无论系统有几个CPU,即使进程运行在单CPU上,多线程也可以是进程并发处理多个事务。一个线程阻塞不会影响到另一个线程。多线程的进程可以尽可能的利用系统CPU资源。但也不是线程越多越好,线程越好,CPU分配给每个线程的时间片就越少。

(4)线程包含了表示进程内执行环境必须的信息,包括标识线程的线程ID,一组寄存器值,栈,调度优先级和策略,信号屏蔽字,errno变量以及线程私有数据,对于内存,堆内存和代码区一般属于一个进程的,但是栈却是属于一个线程的,每个线程都拥有一个独立的栈。errno也是属于单个线程的,每个线程中的errno是独立的。进程内所有的信息对于线程都是共享的,包括执行代码,全局变量,和堆内存,栈以及文件描述符。
线程标识
--就像每个进程有个进程ID一样,线程也有自己的ID。
--进程ID用pid_t来表示,他是一个unsigned int.
--线程可以通过pthread_t表示,pthread_t不能把它当整数处理。

--线程可以通过pthread_self()函数获得自身的线程ID

(5)单线程的进程可以简单的认为只有一个线程的进程。一个进程在同一时间只做一件事、所以一个线程只能有一个对外阻塞函数存在,但是可以使用select(),将阻塞函数放在里面,对内非阻塞,整体对外阻塞

(6)多线程中一个线程阻塞,交出CPU去执行其它线程,单线程阻塞,CPU被占用就像while(1),卡住

(7)单核cpu多个进程或一个线程内能实现并发(微观上的串行,宏观上的并行),多核cpu线程间可以实现微观上并行

 

 

 

 

 

 

 

 

  • 26
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 要在Linux中查询CPU心数,可以使用以下命令之一: 1. 使用lscpu命令:输入"lscpu"命令并按回车键,它将显示处理器和CPU信息,包括CPU心数。在输出中找到“Core(s) per socket”字段,它将告诉你CPU中的心数。 2. 使用nproc命令:输入"nproc"命令并按回车键,它将返回CPU心数的数字。要查询Linux系统中CPU心数,可以通过以下方法: 1. 打开终端窗口。 2. 在终端窗口中输入命令 `lscpu` 并按下回车键。 3. 在输出结果中,查找 CPU(s) 字段下的值,即可得到 CPU 心数。 注意:如果您的 Linux 系统没有安装 `lscpu` 命令,可以尝试通过 `cat /proc/cpuinfo` 命令来查询 CPU 心数。要查询Linux系统中的CPU数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这将输出一个数字,表示系统中的CPU心数。要查询 Linux 系统的 CPU 数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 这个命令会打印出 CPU 相关的信息,并使用管道(`|`)将输出传递给 `grep` 命令,查找包含 "processor" 关键词的行。然后再将输出传递给 `wc -l` 命令,用于计算包含 "processor" 关键词的行的数量,也就是 CPU 数。最后输出的数字即为 CPU 数。要查询Linux操作系统中CPU心数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 该命令会打印出CPU心数,例如: ``` cpu cores : 4 ``` 上述输出表示该系统中CPU有4个心。要查询 Linux 操作系统中的 CPU 数,您可以使用以下命令: ``` cat /proc/cpuinfo | grep "core id" | sort | uniq | wc -l ``` 这个命令会输出计算机上的 CPU 心数量。您可以使用以下命令在 Linux 系统上查询 CPU 数: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 该命令将打印出每个 CPU 心的相关信息,并且使用 uniq 命令可以将重复的信息过滤掉,最终输出每个 CPU数。要在Linux系统中查询CPU数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" ``` 这将显示每个CPU心的数量,可以方便地查看计算机的CPU信息。你可以通过在终端中运行以下命令来查询Linux系统中的CPU数: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 这将输出你的系统中的CPU心数。要查询 Linux 系统中的 CPU 数,可以通过以下步骤: 1. 打开终端窗口(Terminal)。 2. 输入命令:`nproc`。 3. 按下回车键。 这个命令会输出 CPU数,例如输出“4”,表示系统中有 4 个 CPU 心。要在Linux系统中查询CPU数,可以使用以下命令: ``` grep -c 'processor' /proc/cpuinfo ``` 这将打印出CPU数的数量。要在Linux系统中查询CPU数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令会打印出CPU数,例如,如果你的系统有8个心,命令输出的结果应该是: ``` cpu cores : 8 ``` 可以使用 cat /proc/cpuinfo 命令查看Linux系统中CPU数。要查询 Linux 系统中 CPU数,可以通过以下命令在终端中执行: ``` grep -c ^processor /proc/cpuinfo ``` 执行此命令后,终端会输出 CPU 数的数字。要查询 Linux 操作系统下的 CPU 心数,您可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令将会读取 /proc/cpuinfo 文件,然后使用 grep 命令过滤出包含 "cpu cores" 的行,最后使用 uniq 命令去除重复的行。命令执行后,终端将输出您的计算机上 CPU心数。要查询Linux操作系统的CPU数,可以使用以下命令: ``` grep -c ^processor /proc/cpuinfo ``` 这个命令将会输出CPU心数目。要查询 Linux 系统中的 CPU 数,可以通过命令行输入以下命令来实现: ```bash cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 执行该命令后,会输出系统 CPU 数的信息。要在Linux中查询CPU数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令会打印出系统中每个CPU数,如果系统有多个CPU,则会分别列出它们的数。 可以在Linux终端中输入"cat /proc/cpuinfo"来查看CPU心数量。要在 Linux 中查询 CPU 数,您可以打开终端并运行以下命令: ``` cat /proc/cpuinfo | grep "core id" | uniq | wc -l ``` 这将显示您的 Linux 系统上的 CPU 心数。要查询Linux系统中CPU数,可以使用以下命令之一: 1. 使用lscpu命令: 在终端中输入命令lscpu并按回车键即可。该命令将显示有关CPU架构的详细信息,包括心数、线程数等。 2. 使用nproc命令: 在终端中输入命令nproc并按回车键即可。该命令将返回系统上可用的CPU心数。 3. 使用cat /proc/cpuinfo命令: 在终端中输入命令cat /proc/cpuinfo并按回车键即可。该命令将显示有关CPU的详细信息,包括心数、线程数等。 你可以使用Linux的lscpu命令来查询CPU数,例如:lscpu | grep '^CPU(s):' | head -1 可以使用命令 'cat /proc/cpuinfo' 来查询 linux 系统中 CPU心数量。要在Linux中查询CPU数,可以使用以下命令: ``` grep 'processor' /proc/cpuinfo | wc -l ``` 这个命令会在`/proc/cpuinfo`文件中查找`processor`这个关键词,并统计它出现的次数,即CPU数。在 Linux 系统中,可以使用以下命令来查询 CPU数: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 执行该命令后,终端会返回 CPU 数的数量。 你可以使用命令行查询Linux系统的CPU数,可以使用命令"cat /proc/cpuinfo"查看CPU数信息。要在Linux系统中查询CPU数,可以使用以下命令: ``` grep 'processor' /proc/cpuinfo | wc -l ``` 这个命令会打印出CPU数的数量。 可以使用命令"lscpu"查看Linux系统中CPU数。 你可以使用命令行工具查询Linux系统中CPU数,例如cat/proc/cpuinfo。 可以使用命令行工具lscpu来查询Linux系统的CPU数,例如:lscpu | grep "^CPU(s):" | head -1要在Linux系统中查询CPU数,可以使用以下命令: ``` lscpu | grep "^CPU(s):" ``` 这将显示出类似于以下内容的输出: ``` CPU(s): 8 ``` 这里的数字 8 表示当前计算机的 CPU 心数量。 你可以通过在终端中输入“cat /proc/cpuinfo”来查询Linux服务器上的CPU心数量。要查询 Linux 操作系统下的 CPU 心数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "cpu cores" | uniq ``` 这个命令会打印出每个 CPU 心的详细信息,然后使用 grep 命令过滤出包含 "cpu cores" 的行,最后使用 uniq 命令去除重复的行,从而得到 CPU 心数的信息。要在Linux系统中查询CPU数,可以使用以下命令: ``` grep -c ^processor /proc/cpuinfo ``` 这个命令会输出CPU心数的数量,例如如果你的计算机有8个CPU心,那么输出结果应该是: ``` 8 ``` 使用Linux的"cat /proc/cpuinfo"命令可以查询CPU数。要在 Linux 系统中查询 CPU 数,可以使用以下命令: ``` cat /proc/cpuinfo | grep "processor" | wc -l ``` 这个命令将打印出 CPU 的详细信息,并通过管道符将其传递给 grep 命令进行过滤,以查找包含 "processor" 字符串的行。然后,将结果传递给 wc 命令以计算行数,从而得到 CPU 心数量。要在Linux上查询CPU心数量,可以使用以下命令: ``` grep -c processor /proc/cpuinfo ``` 这将在`/proc/cpuinfo`文件中查找包含“processor”关键字的行数,并将其作为CPU心数量输出。 ### 回答2: Linux是一种开放源代码的操作系统,随着其在服务器领域的日益普及,了解如何查询CPU数变得尤为重要。 在Linux中,我们可以使用命令行工具来查询CPU数。以下是两种最常见的方法: 方法1:使用lscpu命令 lscpu命令是Linux系统中用于查询CPU信息的工具。它可以提供各种关于CPU的信息,包括CPU数。要使用lscpu命令,请打开终端窗口并输入以下命令: lscpu 这个命令将输出所有与CPU有关的信息,包括CPU型号、CPU数、每个CPU中的逻辑处理器数量等等。在命令输出中,可以查找”CPU(s)”并找到CPU数。 方法2:使用nproc命令 nproc命令提供一个快速的方法来查询CPU数。要使用nproc命令,请打开终端窗口并输入以下命令: nproc 这个命令将直接输出CPU数。如果你需要使用CPU数信息在脚本中进行其他操作,那么nproc命令将是一个更好的选择。 总结 以上是两种最常用的查询Linux系统中CPU数的方法。lscpu命令提供了更详细的CPU信息,而nproc命令则更加简单直接。如果你需要在自己的脚本中使用CPU数信息,那么nproc命令会更加方便和实用。 ### 回答3: 在Linux系统中,我们可以通过多种方式来查询CPU数。下面将介绍三种常见的方法。 方法一:通过lscpu命令查询 该命令可以列出系统CPU的相关信息,包括CPU的型号、数、线程数、缓存信息等等。在终端中输入以下命令: lscpu 其中CPU数信息可以在输出结果中的“Core(s) per socket”字段中查看。 方法二:通过/proc/cpuinfo文件查询 在Linux系统中,/proc目录下存放了大量的系统信息,其中cpuinfo文件记录了CPU的相关信息。在终端中输入以下命令: cat /proc/cpuinfo | grep "cpu cores" 其中grep命令用于对输出信息进行过滤,只显示包含“cpu cores”的行。输出结果中的数字即为CPU数。 方法三:通过nproc命令查询 nproc命令用于查询CPU数,其直接返回整数值。在终端中输入以下命令: nproc 输出结果即为CPU数。 综上所述,查询Linux系统中CPU数有多种方法,包括lscpu命令、/proc/cpuinfo文件和nproc命令。可以根据实际需要选择适合的方式进行查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值