进程与线程
进程:
进程是操作系统中的一个基本概念,是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。(比如:执行了qq.exe,qq.exe就是一进程)
有了进程的概念,就引出了多进程的概念:
多进程的多个进程的意思,多进程是指一个程序中有多个独立的进程在同时运行,每个进程都有自己的内存空间,可以独立运行,互不影响。多进程可以提高程序的运行效率,提高系统的吞吐量,提高程序的可靠性,提高程序的安全性。进程之间可以共享数据,这种共享数据的方式称为进程间通信(IPC)。IPC可以通过共享内存、消息队列、信号量、管道等方式实现。
一个程序可以有多个进程,这取决于程序的需求。比如:你需要在网络上拿数据,并进行计算。每行程序是会依次往下执行,此时你就会发现,当你从网上拿数据的时候,计算就停了;计算的时候,不能从网上拿数据;需要等待从网上拿完数据后,才能进行计算。这样就很影响效率,为了提高效率,就可以使用多进程:让cpu在计算时,去网上拿数据:
总体就是:拿数据和cpu计算这两件事互不干涉,就像两个程序一样。这就是多进程。
程序能否实现多进程取决于cpu的核心数:
核心数其实就是cpu的个数,一个cpu只有一个控制单元、计算单元、数据单元。而上面说:两个进程同时进行计算,这肯定是不可能的因为只有一个计算单元,只能对一条指令进行计算。
如果cpu是多核的,也就是多个cpu,那么多进程是肯定可以实现的。
那么单核cpu能不能实现多进程呢?答案是:可以的。
单核CPU实现多进程的方法有:
1. 使用时间片轮转(Time Slice Round Robin):即把CPU的时间片分配给每个进程,每个进程执行完自己的时间片后,再分配给下一个进程,以此类推,实现多进程的调度。
2. 使用中断(Interrupt):当一个进程执行完毕后,发出一个中断信号,CPU接收到中断信号后,就会调度下一个进程。
3. 使用多级反馈队列(Multi-level Feedback Queue):多级反馈队列是一种比较复杂的调度算法,它将进程分为不同的优先级,每个优先级有一个队列,每个队列有一个时间片,当一个进程执行完毕后,就会被调度到下一个优先级的队列中,以此类推,实现多进程的调度。
但是,其中最普遍的还是使用时间片轮转的方式
当然,多核cpu也可以使用时间片轮转的方式,提高了cpu地利用率,更好地利用cpu资源,这样就又提高了效率。(不一定使用时间片轮转的方式,也由很多的方式,这些方式都是操作系统通过分析程序的情况而定的)
进程的安全性:
因为多个多个进程之间数据是共享的,所以可以通过一个进程访问到另一个进程,比如qq.exe就可以访问到mysql数据库的进程,从而拿到一些账号密码,或是对其造成伤害。搞死进程,可以让电脑死机或是蓝屏。
为了解决问题,出现了线程,有时可以把线程叫做:轻量进程.
线程:
线程是操作系统中的一个基本概念,是进程的一个实体,是被系统独立调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
线程是一个进程内的可以单独执行的任务,任务就是就是一行指令代码,比如计算、函数调用、打印输出......
一个进程必然有一个(主)线程,也可以有多个线程。
多线程:
多线程是指一个程序中可以同时运行多个线程,每个线程可以独立运行,同时也可以共享程序中的其他资源,此时共享的就不再是计算机内存的数据了,而是共享进程内部的存储器的数据。
多线程可以提高程序的运行效率,使程序可以同时处理多个任务。比如:你的程序打印某组数据的时候,可以再打印另外一组数据。或是打印数据时,可以进行函数的调用。或是函数调用时,进行其他的任务。更好理解一点:
一个程序就像是一个公司,公司内部如果只有一个人(一个线程)那么他就要完整地按照企业规定的日常计划进行(代码按照顺序运行)这些工作全部都得由拿一个人完成,如果公司内部多了一些人(多线程),那么这些工作就可以分配给其他人。如此这般,工作就可以高效率地完成了。
很重要地思想:一个程序内部想要实现多线程,那么内部各个任务一定是独立出来的,互不影响。如果有影响,多线程就毫无意义。比如:第一个任务进行计算,第二个任务你要打印一个数据,可是第二个任务要打印的数据,是第一个任务计算的结果。那么就需要等待第一个任务结束后,得到的结果,才能让第二个任务进行。而此时你让两个任务同时跑起来,将毫无意义。
线程切换:
线程切换是指在多线程环境下,当一个线程正在执行某个任务时,另一个线程可以抢占CPU的执行权,从而把CPU从一个线程转移到另一个线程,这种过程就叫做线程切换。
线程切换的目的是为了提高系统的效率,使得多个线程可以同时执行,从而提高系统的吞吐量。另外,线程切换还可以让系统更加灵活,可以更好地利用CPU的资源,提高系统的效率。
其实线程切换就是单核cpu实现多线程的方法,与单核cpu实现多进程相似。同样地,也和多核cpu运行多线程程序时一样,为了提高了cpu地利用率,更好地利用cpu资源,这样就又提高了效率。(不一定使用时间片轮转的方式,也由很多的方式,这些方式都是操作系统通过分析程序的情况而定的)
是不是线程越多(都是可以单独执行的指令(任务)),执行效率越高?
(这里可能会疑问?为什么会问这么nt的问题,指令越多,效率肯定慢啊?其实这里说的是相比于正常按照顺序依次执行的程序,而这样的程序拥有的指令都是单独执行的,此时如果把他变成多线程程序,那么是不是会效率更高呢?(其实问题是这样的)---希望可能帮到各位)
并不是的,当有10000个线程(任务)时,操作系统需要保证这10000个线程(任务)有都能被执行并且都有时间(需要分配每个线程执行的时间)来执行,而操作系统这一举动就已经消耗量大量计算资源了,从而就会降低效率。
单核cpu对于多线程有没有意义?
有意义,因为单核cpu也可以实现多线程,采用的方式也是时间片轮转的原理。从而实现多线程的效果。
对于一个程序,设置线程的个数的计算公式。
总结进程和线程的区别:
1、进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)。
2、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
3、线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
4、但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
多进程和多线程程序执行的流程:
1.多进程程序执行的流程是:操作系统创建多个进程,每个进程都有自己的独立的内存空间,每个进程可以独立运行。
2.多线程程序执行的流程是:操作系统创建多个线程(其实就是操作系统把你的代码翻译成操作系统的语言,然后因为你的语言创建了多线程,所以操作系统也会创建多线程,这样才能控制cpu),每个线程共享同一个进程的内存空间,每个线程可以同时运行。
下面是扩展了解:
1.多线程和多进程的程序是被操作系统控制的,操作系统通过进程调度和线程调度来实现多进程和多线程,进程调度是指操作系统根据进程的优先级、状态等信息,决定哪个进程先执行;线程调度是指操作系统根据线程的优先级、状态等信息,决定哪个线程先执行。
2.一个进程会被分配到多个CPU内核,操作系统会根据系统资源情况,调度多个进程,把多个进程放到多个CPU内核上,以实现最优的资源利用。
3.现代,所说的cpu几核几线程,几核指的是几个核心 也就是几个cpu处理器包括了:控制单元,数据单元,计算单元。几线程就是比普通cpu多了程序计数器、寄存器、栈等组件,这些组件组合起来叫做:线程硬件。
4.CPU的核心数对应了线程数,CPU是8核的,那么他就可以同时执行8个线程,相当于一个核心执行一个线程,这也可以从构造上看出(一个线程的构成是需要程序计数器,而cpu核心就是一个cpu,而cpu里只有一个程序计数器),但是现在发明了一种技术叫做:超线程技术。
超线程技术:
超线程技术是一种技术,它可以让一个CPU核心同时执行多个线程,从而提高CPU的效率。它的原理是,在一个CPU核心内部,把一个核心分成两个虚拟核心,每个虚拟核心可以同时执行一个线程,从而实现一个CPU核心同时执行多个线程的效果。
超线程技术原理:
解释:
如上图: 其实是再一个cpu核心内部有两套数据单元,即:2寄存器和2程序计数器,然后通过时间片轮转或其他方式,让ALU(逻辑运算单元)一会计算一边的数据单元,一会再计算另一遍地数据单元,从而实现一个cpu核心计算两线程.
5.一个程序最多可以有多少进程取决于操作系统的内存限制和计算机的性能。因为运算的事情是由线程完成的,进程其实就是从内存拿空间,给线程运算的,一旦内存被占用完,进程就没办继续执行(拿空间)了。
6.进程最多有65535个,这是因为每个进程都有一个唯一的进程ID,而进程ID是一个16位无符号整数,最大值为65535,因此不考虑内存和cpu,则最多可以有65535个进程。