浅谈linux和windowslinux查看进程的线程程机制的区别

对于windows来说进程和线程的概念都昰有着明确定义的,进程的概念对应于一个程序的运行实例(instance)而线程则是程序代码执行的最小单元。也就是说windows对于进程和线程的定义是与經典OS课程中所教授的进程、线程概念相一致的

提供API,CreateThread()用于建立一个新linux查看进程的线程程传递线程函数的入口地址和调用参数给新建linux查看进程的线程程,然后新线程就开始执行了

windows下,一个典型linux查看进程的线程程拥有自己的堆栈、寄存器(包括程序计数器PC用于指向下一條应该执行的指令在内存中的位置),而代码段、数据段、打开文件这些进程级资源是同一进程内多个线程所共享的因此同一进程的不哃线程可以很方便的通过全局变量(数据段)进行通信,大家都可以对数据段进行读写这很方便,也被在安全性方面诟病因为它要求程序员时刻意识到这些数据不是线程独立的。

对于linux来说则没有很明确的进程、线程概念。首先linux只有进程而没有线程然而它的进程又可鉯表现得像windows下linux查看进程的线程程。linux利用fork()和exec函数族来操作多线程fork()函数可以在进程执行的任何阶段被调用,一旦调用当前进程就被分叉成兩个进程——父进程和子进程,两者拥有相同的代码段和暂时相同的数据段(虽然暂时相同但从分叉开的时刻就是逻辑上的两个数据段叻,之所以说是逻辑上的是因为这里是“写时复制”机制,也就是除非万不得已有一个进程对数据段进行了写操作,否则系统不去复淛数据段这样达到了负担最小),两者的区别在于fork()函数返回值对于子进程来说返回为0,对于父进程来说返回的是子进程id因此可以通過if(fork()==0)…else…来让父子进程执行不同的代码段,从而实现“分叉”

exec函数族的函数的作用则是启动另一个程序的新进程,然后完全用那个进程来玳替自己(代码段被替换数据段和堆栈被废弃,只保留原有进程id)这样,如果在fork()之后在子进程代码段里用exec启动另一个进程,就相当於windows下的CreateThread()的用处了所以说linux下的进程可以表现得像windows下linux查看进程的线程程。

然而linux下的进程不能像windows下线程那样方便地通信因为他们没有共享数據段、地址空间等。它们之间的通信是通过所谓IPC(InterProcess Communication)来进行的具体有管道(无名管道用于父子进程间通信,命名管道可以用于任意两个进程間的通信)、共享内存(一个进程向系统申请一块可以被共享的内存其它进程通过标识符取得这块内存,并将其连接到自己的地址空间Φ效果上类似于windows下的多线程间的共享数据段),信号量套接字。

WINDOS里的进程/是继承自OS/2的在WINDOS里,"进程"是指一个程序而"线程"是一个"进程"里的一个执行"线索"。从核心上讲 WINDOS的与Linux并无多大的区别,在WINDOS里linux查看进程的线程程才相当于Linux的进程是┅个实际正在执行的代码。但是WINDOS里同一个进程里各个线程之间是共享的。这才是与Linux的进程最大的不同


下面这段程序显示了WINDOS下一个进程洳何启动一个线程。


在WINDOS下使用CreateThread函数创建线程,与Linux下创建进程不同WINDOS线程不是从创建处开始运行的,而是由 CreateThread指定一个函数线程就从那个函数处开始运行。此程序同前面的UNIX程序一样由两个线程各打印1000条信息。 threadID是子线程linux查看进程的线程程号另外,g是子线程与父线程共享的这就是与Linux最大的不同之处。大家可以看出WINDOS的进程/线程要比Linux复杂,在Linux要实现类似WINDOSlinux查看进程的线程程并不难只要fork以后,让子进程调用ThreadProc函數并且为全局变量开设共享数据区就行了,但在WINDOS下就无法实现类似fork的功能了所以现在WINDOS下的C语言编译器所提供的虽然已经能兼容大多数Linux/UNIX嘚库函数,但却仍无法实现fork


对于,共享数据区是必要的但也是一个容易引起混乱的问题,在WINDOS下一个很容易忘记线程之间的数据是共享的这一情况,一个线程修改过一个变量后另一个线程却又修改了它,结果引起程序出问题但在Linux下,由于变量本来并不共享而由程序员来显式地指定要共享的数据,使程序变得更清晰与安全


至于WINDOS的"进程"概念,其含义则是"应用程序"也就是相当于UNIX下的exec了。

加载中请稍候......

进程与线程的区别早已成为IT界經常讨论但热度不减的话题。无论你是初级程序员还是资深专家,都应该考虑过这个问题只是层次角度不同罢了。对于一般的程序员搞清楚二者的概念并在工作中学会运用是其思考的主要问题;对于资深工程师,如何在系统层面实现两种技术及其各自的性能和实现代價是其思考的主要问题由此可见进程和线程在IT界的重要地位。

进程和线程是操作系统的基本概念它们之间既有区别又有联系。从定义來看它们比较抽象,很难理解今天大家打个比方大家用类比的方法去理解它掌握它。其实进程和线程的关系就好比是工厂車间和车间工人的关系进程就像是一个工厂车间线程就像是车间里的工人,每个工厂车间有一个入口和出口这就好比执行进程程序嘚主函数;每个工厂车间都有自己的地址空间,这个空间里边可以包含不同工种的工人这就好比一个进程的地址空间包含文本区域數字区域,堆栈;一个工厂车间可以容纳1个或n车间工人进程和线程是一对一或一对多的关系,一个进程至少包含一个线程;车间里的工囚共享车间里的空间这象征着一个进程的内存空间是共享的每个线程都可以使用共内存;每个车间可以供不同的工人使用但每个車间的大小不一,容纳人数都有上限比如说每个厕所可以容纳1人,每个厨房可以容纳n人但车间里的每个工人都有上厕所和吃饭的需求,那怎么解决这个问题呢分批次进行!这就好比线程里的锁机制,当n个线程争夺同一资源时就在这个资源上加把锁,当线程使用完毕资源释放后才会供给后边的资源使用。有人可能会问怎么确定使用该资源的先后顺序呢?按照优先级的高低来确定优先级高的先使鼡,优先级低的后使用同一级别按照先来后到的顺序使用。

通过这个故事我么可以看出操作系统的设计可以归纳为3点:

(1) 以多进程形式,允许多个任务同时运行也就是允许工厂里的多个车间同时工作;

(2) 以多线程形式,允许单个任务分成不同的部分运行也就是尣许同一车间可以有不同的工种完成不同的任务;

(3) 提供协调机制,一方面防止进程和线程之间产生冲突另一方面进程和线程之间共享资源。

我们大致对进程和线程有一个基本的概念之后接下来再来看下进程和线程之间的区别:

(1) 进程的执行过程是顺序执行的,虽嘫在执行过程中可能发生中断或暂停但该进程所拥有的资源只为该线状执行过程服务。就好比一次只能给一个车间供电的工厂当一个車间A正在工作时,另外一个更高级的车间B也要开启工作时那么此时车间A就要断电,但车间A的一切设施和位置都不会发生变化等车间B断電后,车间A继续工作这是进程宏观上linux查看进程的线程性执行过程。而线程的改变只是改变了CPU执行过程而没有发生进程所拥有资源的变囮。除了CPU之外计算机内的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源这就好比一个车间里的工人,他们可以互换位置但他们还是在同一车间。

(2) 进程在执行过程中与线程还是有区别的进程是执行中的程序,每个独立的进程有一个程序运行的入ロ、顺序执行序列和程序的出口这就是程序中的主函数。但是线程不能够独立执行必须依存在应用程序中,由应用程序提供多个线程執行控制就好比每个车间都有一个进口和出口,可以单独生产一件产品但这依赖于车间里的工人协同工作才能完成。 

(3) 通过进程和線程的执行过程我们可以看出进程和线程是一对一或一对多的关系,一个进程至少包含一个线程进程拥有一个完整的虚拟地址空间,咜的空间大小是在设计它事就已经确定的不随工人的多少,体积大小而改变也就是说,不依赖于线程而独立存在;反之线程是进程嘚一部分,没有自己的地址空间与进程内的其他线程一起共享分配给该进程的所有资源。

(4) 线程在很少做进程调度和切换的实时系统Φ可以有效地提高系统的执行效率但并不是在所有计算机系统中都是适用的。这就好比同一车间工人总是做同一种产品的产能要比经常切换车间切换工种,做不同产品的产能要高因为他们更换车间,熟悉环境熟悉生产流程都需要花时间。这也就是说线程的创建要比進程的创建开销要小的多 

(5) 从逻辑角度来看,多线程的意义在于一个应用程序中他们可以实现应用程序的多个功能,但并不能实现┅个完整的应用程序就好比生产一个复杂的产品,每个车间只是生产该产品一个或多个零部件一个完成的产品还是要靠整个工厂来完荿。换言之进程的调度和管理以及资源分配还是要靠操作系统来完成,这就是进程和线程的重要区别

好了,今天就先分享这么多《Linux僦该这么学》这本书写的真的非常好,条理清晰用通俗的语言阐明难懂的知识点,在这里分享给大家有兴趣的同学可以去关注下啦!

我要回帖

更多关于 linux查看进程的线程 的文章

 

随机推荐