进程管理
进程与线程
一个程序至少有一个进程,一个进程至少有一个线程
- 进程
- 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动
- 用户运行自己的程序,系统就创建一个进程,并为他分配各种资源,如各种表格,内存空间,磁盘空间,I/O设备
- 然后改进程被放到进程就绪队列,当进程调度程序选中它,并为他分配CPU资源,则该进程就被运行了起来
- 线程
- 是进程的一个实体,是CPU调度和分配的基本单位
- 线程自己并不拥有系统资源,除了一些他本身运行必不可少的资源(如程序计数器,一组寄存器和栈)
- 但是同一个进程中的线程可以共享进程所用有的各种资源
不同点
- 一个线程必定也只能属于一个进程;而一个进程可以拥有多个线程并且至少拥有一个线程
- 同属一个进程的线程共享进程的所有资源。但是进程之间相互独立
- 线程称为轻量级的进程。进程有进程控制块,线程有线程控制块。但是线程控制块比进程控制块小的多。
- 线程之间切换代价小,进程之间切换代价大
- 进程是程序的一次执行,线程可以理解为是程序中的一个片段的执行
- 进程有自己的内存空间,线程共享其所属的进程的内存空间
在没有实现线程的操作系统中,进程是资源分配和调度的基本单位
在实现了线程的操作系统中,进程是资源分配的基本单位,而线程是调度的基本单位,是系统执行并发的单元
引入线程的优点
- 易于调度
- 提高并发性
- 开销小,线程的创建比进程快,所需要的开销也小
- 有利于发挥多处理器的性能
多线程的缺点(何时不用多线程)
- 对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。
- 由于资源的竞争可能会造成死锁。需要复杂的机制来避免死锁。
- 如果没有做好线程同步,可能会对对公有变量的同时读或写,从而产生错误。需要复杂的机制进行线程同步。
线程同步有哪些机制
-
临界区
- 多线程只能串行的访问临界区
- 一个线程进入后,其他线程只能等临界区内无线程后,才可进入
-
互斥量
- 为协调对一个共享资源的单独访问而设计
- 只有拥有互斥量的线程,才有权限去访问系统的公共资源
- 因为互斥量只有一个,因此能保证资源不会被同时多线程访问
-
信号量
- 为控制一个具有有限数量的用户资源而设计
- 它允许多个线程在同一个时刻取访问同一个资源
- 控制访问具有若干个实例的某种资源。该信号量初始化为可用资源的数量
- 当每个进程需要使用资源时,对信号进行减计数
- 当进程释放资源时,需要对该信号量执行加计数
- 当信号量计数为0时,再需求该资源的进程就阻塞,直到计数大于0
-
事件
- 用来同志线程有一些事件已经发生,从而启动后继任务的开始
- 允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。
- 事件初始化为未通知状态,然后,当该线程完成它的初始化操作后,它就将事件设置为已通知状态。
- 这时,一直在等待该事件的另一个线程发现该事件已经得到通知,因此它就变成可调度线程。这第二个线程知道第一个线程已经完成了它的操作。