在早期的linux中,只有进程,没有线程。
进程是一个可执行程序的实体,由私有虚拟地址空间、代码、数据和其他操作系统资源(如进程创建的文件、管道、同步对象等)组成。此时的进程即是资源的拥有者,也是CPU的调度单位。
进程之间即可相互独立,又可相互协作完成并发任务。
但是多进程的协作有以下缺点:创建、销毁、切换速度慢,内存、资源占用大。
在对OS性能要求越来越高(大量数据接入、需要快速响应)的情况下,衍生了多线程。线程将原进程中的调度部分分离出来,成为CPU的调度实体,此时“进程是线程的容器”.应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程。每个进程都至少拥有一个线程(主线程),多线程共享进程资源.
多线程的优点恰是多进程的缺点:创建、销毁、切换速度快,内存、资源占用小。
多线程虽好,但也有它自己的弊端:由于资源共享,对于独一份的资源,线程之间容易形成抢夺“冲突”。如果冲突处理不好,要么效率低下,要么形成死锁。
由此可见,多线程与多进程之间各有利弊,运用适当效率大大提升,反之会弄巧成拙。
多进程VS多线程
1)需要频繁创建销毁的优先用线程
2)需要进行大量计算的优先使用线程
3)强相关的处理用线程,弱相关的处理用进程
4)可能要扩展到多机分布的用进程,多核分布的用线程
下面这个例子有3个线程,完成2个任务,读写二进制文件和字符文件。
线程1,2读写同一个二进制文件,由于互斥等待,反而比一个线程用的时间更长。
线程3单独读写字符文件。
编译g++ -g -o thread Multiythread_example.cpp -lpthread
#include <pthread.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>