进程
- 一个正在运行的程序,资源分配的基本单位
线程
- 进程内部的一条执行路径(序列),调度基本单位
1.引入
线程是处理机调度的基本单位,线程模式下,在一个进程中至少要有一个线程
提高进程执行效率,
2.线程管理
方式:线程控制块
里面包含维持线程的各种信息
线程在进程中共享的资源不需要放在线程控制块中,而是存放在进程控制块中
3.线程实现
操作系统进行管理线程:内核态
线程控制块存放在内核空间
好处:
1> 用户编程简单,无需管理线程的调度
2> 如果有线程阻塞,操作系统可以调用另一个线程执行,操作系统能够监听所有线程
缺点:
1> 效率低;每次都要陷入到内核中,由操作系统调度
2> 占用了内核资源,很快就会耗尽内核空间
建立进程线程,但内核空间满了,则会导致内核空间溢出,操作系统停止运转
3> 内核态需要修改操作系统
进程管理线程:用户态
用户自己写执行系统作调度器,专门负责线程调度
用户态下写出的调度器也是线程,没有能力强行夺走控制权
优点:
1> 灵活性:操作系统不知道线程的存在,在任何操作系统都能执行
2> 线程切换快 :无需陷入到内核态
3> 不用修改操作系统
缺点:
1> 程序很难写
2> 无法实现进程的多道编程:线程阻塞会导致整个进程阻塞
在一道线程受阻,无法交出控制权(无法执行交出CPU的指令),整个进程无法推进,则操作系统将CPU交给另一个进程
线程阻塞导致进程阻塞解决办法
(1)不让线程阻塞:在执行系统调用前,先确认是否会发生阻塞,写一个包裹(wrap)将系统调用包裹起来,用户想要进行系统调用则要通过wrap,会阻塞就禁止调用
(2)阻塞后激活同进程的其他线程:调度器激活
受阻后CPU控制权回到操作系统手里,在它进行进程切换之前,先去询问受阻的进程是否有其他线程可以执行,有则将CPU交给执行系统线程,给该进程第二次机会让其继续执行,“第二机会”
现代操作系统线程实现
同时实现内核态和用户态线程管理:
用户态的执行系统负责进程内部线程在非阻塞时的切换
内核态的操作系统负责阻塞线程的切换
分配线程时,将执行阻塞操作的线程设为内核态线程
4.多线程
- 多线程:
- 创建线程:
#include<pthread.h>//引入的头文件
pthread_create() //创建线程
pthread_exit() //退出线程
exit() //退出进程
pthread_join() //获取线程id
vi main.c
#include<stdio.h>