linux多线程在Linux系统中多进程程序结构和多线程结构那个好?

linux多线程  时间:2020-12-27  阅读:()

浅谈linux 多线程编程和 windows 多线程编程的异同

转载自fychit创意空间 很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows的多线程进行比较,看看他们之间有什么相同点和不同的地方。

其实最开始我是搞windows下编程的,包括windows编程,windows 驱动,包括usb驱动,ndis驱动,pci驱动,1394驱动等等,同时也一条龙服务,做windows下的应用程序开发,后面慢慢的我又对linux开发产生比较深的兴趣和爱好,就转到搞linux开发了。

在接下来的我还会写一些博客,主要是写linux编程和windows编程的区别吧,现在想写的是linux下usb驱动和windows下usb驱动开发的区别,这些都是后话,等我将linux多线程和windows多线程讲解完后,我再写一篇usb驱动,谈谈windows 和linux usb驱动的东东。

好了,言归正传。

开始将多线程了。

首先我们讲讲为什么要采用多线程编程,其实并不是所有的程序都必须采用多线程,有些时候采用多线程,性能还没有单线程好。

所以我们要搞清楚,什么时候采用多线程。

采用多线程的好处如下: (1)因为多线程彼此之间采用相同的地址空间,共享大部分的数据,这样和多进程相比,代价比较节俭,因为多进程的话,启动新的进程必须分配给它独立的地址空间,这样需要数据表来维护代码段,数据段和堆栈段等等。

(2)多线程和多进程相比,一个明显的优点就是线程之间的通信了,对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。

但是对于多线程就不一样了。

他们之间可以直接共享数据,比如最简单的方式就是共享全局变量。

但是共享全部变量也要注意哦,呵呵,必须注意同步,不然后果你知道的。

呵呵。

(3)在多cpu的情况下,不同的线程可以运行不同的cpu下,这样就完全并行了。

反正我觉得在这种情况下,采用多线程比较理想。

比如说你要做一个任务分2个步骤,你为提高工作效率,你可以多线程技术,开辟2个线程,第一个线程就做第一步的工作,第2个线程就做第2步的工作。

但是你这个时候要注意同步了。

因为只有第一步做完才能做第2步的工作。

这时,我们可以采用同步技术进行线程之间的通信。

针对这种情况,我们首先讲讲多线程之间的通信,在windows平台下,多线程之间通信采用的方法主要有: (1)共享全局变量,这种方法是最容易想到的,呵呵,那就首先讲讲吧,比如说吧,上面的问题,第一步要向第2步传递收据,我们可以之间共享全局变量,让两个线程之间传递数据,这时主要考虑的就是同步了,因为你后面的线程在对数据进行操作的时候,你第一个线程又改变了数据的内容,你不同步保护,后果很严重的。

你也知道,这种情况就是读脏数据了。

在这种情况下,我们最容易想到的同步方法就是设置一个bool flag了,比如说在第2个线程还没有用完数据前,第一个线程不能写入。

有时在2个线程所需的时间不相同的时候,怎样达到最大效率的同步,就比较麻烦了。

咱们可以多开几个缓冲区进行操作。

就像生产者消费者一样了。

如果是2个线程一直在跑的,由于时间不一致,缓冲区迟早会溢出的。

在这种情况下就要考虑了,是不让数据写入还是让数据覆盖掉老的数据,这时候就要具体问题具体分析了。

就此打住,呵呵。

就是用bool变量控制同步,linux 和windows是一样的。

既然讲道了这里,就再讲讲其它同步的方法。

同样 针对上面的这个问题,共享全局变量同步问题。

除了采用bool变量外,最容易想到的方法就是互斥量了。

呵呵,也就是传说中的加锁了。

windows下加锁和linux下加锁是类似的。

采用互斥量进行同步,要想进入那段代码,就先必须获得互斥量。

linux上互斥量的函数是: windows下互斥量的函数有:createmutex 创建一个互斥量,然后就是获得互斥量waitforsingleobject函数,用完了就释放互斥量ReleaseMutex(hMutex),当减到0的时候 内核会才会释放其对象。

下面是windows下与互斥的几个函数原型。

HANDLE WINAPI CreateMutex( __in LPSECURITY_ATTRIBUTES lpMutexAttributes, __in BOOL bInitialOwner, __in LPCTSTR lpName ); 可以可用来创建一个有名或无名的互斥量对象 第一参数 可以指向一个结构体SECURITY_ATTRIBUTES 一般可以设为null; 第二参数 指当时的函数是不是感应感应状态 FALSE为当前拥有者不会创建互斥 第三参数 指明是否是有名的互斥对象 如果是无名 用null就好。

DWORD WINAPI WaitForSingleObject( __in HANDLE hHandle, __in DWORD dwMilliseconds ); 第一个是 创建的互斥对象的句柄。

第二个是 表示将在多少时间之后返回 如果设为宏INFINITE 则不会返回 直到用户自己定义返回。

对于linux操作系统,互斥也是类似的,只是函数不同罢了。

在linux下,和互斥相关的几个函数也要闪亮登场了。

pthread_mutex_init函数:初始化一个互斥锁; pthread_mutex_destroy函数:注销一个互斥锁; pthread_mutex_lock函数:加锁,如果不成功,阻塞等待; pthread_mutex_unlock函数:解锁; pthread_mutex_trylock函数:测试加锁,如果不成功就立即返回,错误码为EBUSY; 至于这些函数的用法,google上一搜,就出来了,呵呵,在这里不多讲了。

windows下还有一个可以用来保护数据的方法,也是线程同步的方式 就是临界区了。

临界区和互斥类似。

它们之间的区别是,临界区速度快,但是它只能用来同步同一个进程内的多个线程。

临界区的获取和释放函数如下: EnterCriticalSection() 进入临界区; LeaveCriticalSection()离开临界区。

对于多线程共享内存的东东就讲到这里了。

(2)采用消息机制进行多线程通信和同步,windows下面的的消息机制的函数用的多的就是postmessage了。

Linux下的消息机制,我用的较少,就不在这里说了,如果谁熟悉的,也告诉我,呵呵。

(3)windows下的另外一种线程通信方法就是事件和信号量了。

同样针对我开始举得例子,2个线程同步,他们之间传递信息,可以采用事件(Event)或信号量(Semaphore),比如第一个线程完成生产的数据后,就必须告诉第2个线程,他已经把数据准备好了,你可以来取走了。

第2个线程就把数据取走。

呵呵,这里可以采用消息机制,当第一个线程准备好数据后,就直接postmessage给第2个线程,按理说采用postmessage一个线程就可以搞定这个问题了。

呵呵,不是重点,省略不讲了。

对于linux,也有类似的方法,就是条件变量了,呵呵,这里windows和linux就有不同了。

要特别讲讲才行。

对于windows,采用事件和信号量同步时候,都会使用waitforsingleobject进行等待的,这个函数的第一个参数是一个句柄,在这里可以是Event句柄,或Semaphore句柄,第2个参数就是等待的延迟,最终等多久,单位是ms,如果这个参数为INFINITE,那么就是无限等待了。

释放信号量的函数为ReleaseSemaphore();释放事件的函数为SetEvent。

当然使用这些东西都要初始化的。

这里就不讲了。

Msdn一搜,神马都出来了,呵呵。

神马都是浮云! 对于linux操作系统,是采用条件变量来实现类似的功能的。

Linux的条件变量一般都是和互斥锁一起使用的,主要的函数有: pthread_mutex_lock , pthread_mutex_unlock, pthread_cond_init pthread_cond_signal pthread_cond_wait pthread_cond_timewait

Linux下多线程的如何执行?

主线程结束,则进程结束,属于该进程的所有线程都会结束,可以在主线程中join,也可以在主线程中加死循环。

Linux下多线程和多进程程序的优缺点,各个适合什么样的业务场景

IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。

进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。

当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。

这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。

  如果是UNIX/linux环境,采用多线程没必要。

  多线程比多进程性能高?误导!   应该说,多线程比多进程成本低,但性能更低。

  在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。

内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。

  多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。

  多线程是平面交通系统,造价低,但红绿灯太多,老堵车。

  我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。

  高性能交易服务器中间件,如TUXEDO,都是主张多进程的。

实际测试表明,TUXEDO性能和并发效率是非常高的。

TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。

  多线程的优点:   无需跨进程边界; 程序逻辑和控制方式简单; 所有线程可以直接共享内存和变量等; 线程方式消耗的总资源比进程方式好; 多线程缺点:   每个线程与主程序共用地址空间,受限于2GB地址空间; 线程之间的同步和加锁控制比较麻烦; 一个线程的崩溃可能影响到整个程序的稳定性; 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数; 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU   多进程优点:   每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系; 通过增加CPU,就可以容易扩充性能; 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系; 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大 多线程缺点:   逻辑控制复杂,需要和主程序交互; 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算 多进程调度开销比较大; 最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。

当然你也可以利用多线程+多CPU+轮询方式来解决问题……   方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。

在Linux系统中多进程程序结构和多线程结构那个好?

多进程程序结构和多线程程序结构有很大的不同,多线程程序结构相对于多进程程序结构有以下的优势: 1、方便的通信和数据交换 线程间有方便的通信和数据交换机制。

对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。

线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。

2、更高效的利用CPU 使用多线程可以加快应用程序的响应。

这对图形界面的程序尤其有意义,假如一个操作耗时很长,那么整个系统都会等它操作,此时程序不会响应键盘、鼠标、菜单等操作,而使用多线程技术,将耗时长的操作置于一个新的线程,就可以避免这种尴尬情况的发生。

同时多线程使多CPU系统更加有效。

操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

具体可以看ZLG的《嵌入式Linux开发教程》上册。

OneTechCloud(31元),美国CN2 GIA高防VPS月

OneTechCloud发布了本月促销信息,全场VPS主机月付9折,季付8折,优惠后香港VPS月付25.2元起,美国CN2 GIA线路高防VPS月付31.5元起。这是一家2019年成立的国人主机商,提供VPS主机和独立服务器租用,产品数据中心包括美国洛杉矶和中国香港,Cera的机器,VPS基于KVM架构,采用SSD硬盘,其中美国洛杉矶回程CN2 GIA,可选高防。下面列出部分套餐配置信息。美国CN...

易探云330元/年,成都4核8G/200G硬盘/15M带宽,仅1888元/3年起

易探云服务器怎么样?易探云是国内一家云计算服务商家,致力香港云服务器、美国云服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。目前,易探云推出的国内云服务器优惠活动,国内云服务器2核2G5M云服务器低至330元/年起;成都4核8G/200G硬盘/15M带宽,仅1888元/3年起!易探云便宜vps服务器配置推荐:易探云vps云主机,入门型云...

MineServer:洛杉矶CN2 GIA VPS/512MB内存/20GB NVME/800GB流量/200Mbps/KVM,58元/季

mineserver怎么样?mineserver是一家国人商家,主要提供香港CN2 KVM VPS、香港CMI KVM VPS、日本CN2 KVM VPS、洛杉矶cn2 gia端口转发等服务,之前介绍过几次,最近比较活跃。这家新推出了洛杉矶CN2 GIA VPS,512MB内存/20GB NVME/800GB流量/200Mbps/KVM,58元/季,并且进行了带宽升级,同时IP更改为美国IP。点击...

linux多线程为你推荐
中文域名注册查询怎么查我们公司的中文域名是被谁注册的?国外虚拟空间哪里买的100m海外虚拟空间便宜稳定?免费网站域名申请哪里可以申请到免费网站域名?国外网站空间怎么样把网站空间放到国外去?重庆网站空间重庆建网站选择哪家比较好,还有域名空间等,免备案虚拟主机哪家免备案虚拟主机好,而且便宜点的?云南虚拟主机大家觉得云南天成科技服务器租用给力吗?虚拟主机测评我们可以用哪些命令来测试一个虚拟主机的好坏?备案域名网站备案分为哪几种?域名备案跟网站备案有什么不同?域名是什么你好,请问域名是指什么啊?
虚拟主机排名 安徽虚拟主机 shopex虚拟主机 naning9韩国官网 80vps pw域名 payoneer http500内部服务器错误 国外在线代理 上海域名 七夕快乐英文 域名转接 世界测速 广州服务器 支持外链的相册 超级服务器 web服务器搭建 万网主机管理 个人免费邮箱 卡巴斯基试用版下载 更多