为什么要有多进程?
因为操作系统需要多任务同时执行
进程的缺点
1.进程切换开销大
linux下是进程执行是按时间片的轮询进行,这就涉及到进程在切换时断点的保护和恢复
2.进程间通信效率低
解决进程缺点就是线程技术
1.线程技术保留了进程技术实现多任务的特性
2.线程改进了在线程间切换和线程间通信效率(线程共享了同一虚拟地址)
3.多线程在多核CPU上效率高,为什么?
因为多进程没法保证每个进程可以同时运行在多核上,而线程可以
软件多于多核进程的优化是啥意思?
其实就是多进程到多线程的切换
什么是线程
1.线程是内核调度的最小单元,而不是进程,是调度进程里面的线程
2.一个进程可以包含多个线程
拓展,怎么看CPU的核数
1.总核数 = 物理CPU个数*每颗物理CPU的核数
2.总逻辑CPU个数 = 物理CPU个数每颗物理CPU的核数超线程数
超线程,即CPU的每颗核心可以当两个核用,虽然采用超线程技术能同时执行两个线程,但它并不象两个真正的CPU那样,每个CPU都具有独立的资源。
当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,直到这些资源闲置后才能继续。因此超线程的性能并不等于两颗CPU的性能。
p是指posix
线程创建与回收
pthread_create 主线程用来创建子线程
pthread_join 主线程用来等待(阻塞)回收子线程
pthread_detach 主线程用来分离子线程,分离后主线程不必再去回收子线程
线程取消
pthread_cancel 一般都是主线程调用该函数去取消子线程
pthread_setcancelstate 子线程设置自己是否允许被取消
pthread_setcanceltype 子线程设置自己取消的类型
线程函数退出相关函数
pthread_exit和return
pthread_cleanup_push 往一个栈中放入一个方法,如果线程被取消了,则执行栈中的方法(可以用于同步过程中线程被取消而锁也异常了)
pthread_cleanup_pop 从栈中弹出一个方法,可以执行,也可以不执行
获取线程id
pthread_self
线程同步之信号量
sem_init 初始信号量
sem_wait 拿不到信号量会阻塞
sem_post 对信号量做加操作
sem_destroy 销毁信号量
线程同步之互斥锁
互斥锁又叫互斥量(mutex),涉及相关函数
pthread_mutex_init
pthread_mutex_destroy
pthread_mutex_lock
pthread_mutex_unlock
互斥锁和信号量有啥关系
1.可以认为互斥锁是一种特殊的信号量
2.互斥锁是只有0和1的信号量
3.互斥锁主要用来实现关键代码段保护
线程同步之条件变量
条件变量和互斥锁有关,感觉就像是对互斥锁进一层封装
相关函数
pthread_cond_init
pthread_cond_wait
pthread_cond_destroy
pthread_cond_signal(唤醒一个)/pthread_cond_broadcast(唤醒多个)
其实在进程表_eprocess中就有一个结构存放互斥量