前段时间都在学习进程和网络编程模块,还有音视频模块。并且在使用进程与线程做一个小项目,今天就抽空写一下进程与线程的学习收获。
摘要:
1.进程与线程
2.进程与线程的区别
3.进程是如何实现的
4.进程间如何通信
5.进程的实践应用
-
进程与线程
[1] 进程是资源分配的基本单位。
所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。[2] 进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。
当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。[3] 线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。[4] 通常把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度,从而显著提高系统资源的利用率和吞吐量。[5]近年来推出的通用操作系统都引入了线程,以便进一步提高系统的并发性,并把它视为现代操作系统的一个重要指标。
总结: [1] 进程是操作系统资源分配的基本单位, [2] 线程是操作系统调度执行的基本单位。 [3] 线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。
-
线程与进程的区别可以归纳为以下4点:
1) 地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2) 通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3) 调度和切换:线程上下文切换比进程上下文切换要快得多。
4) 在多线程OS中,进程不是一个可执行的实体。 -
进程是如何实现的?(使用进程打开外部程序)
当我们设计应用程序时,有时不希望将一个不太相关的功能集成到程序中,或者是因为该功能与当前设计的应用程序联系不大。或者是该功能以及可以使用现成的程序很好的实现了,这时就可以在当前的应用程序调用外部的程序来实现该功能,使用到进程。• 运行一个进程的多态讲述
Qt的QProcess类用来启动一个外部程序并与其进行通信。
[1] 要启动一个进程,可以使用start( )函数,然后将程序名称和运行这个程序所要使用的命令行参数作为该函数的参数。
[2] 执行完start( )函数,QProcess进入Starting状态,当程序已经运行后,QProcess就会进入Runing 状态并发送started( )信号。
[3] 当进程退出后,QProcess重新进入NotRuning(初始状态)状态并发射finished( )信号。
发射的finished( )信号提供了进程的退出代码和退出状态。
[4] 也可以调用exitCode( )来获取上一个结束的进程的退出代码,使用exitStatus( )来获取它的退出状态。
任何时间发生了错误,QProcess都会发射error()信号,可以调用error()查看错误类型和上次发生的错误
[5] state( ) 可以查看当前进程的状态。请看代码。是运行的过程,其信号与槽函数
#include<QtDebug>
#include<QTextCodec>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{<