进程系统分配调度的基本单位,线程进⾏运算调度的最⼩单位进程和线程⽣命周期进程的状态线程的同步和互斥
进程是计算机中程序关于某数据集合上的⼀次运⾏活动,是系统进⾏资源分配和调度的基本单位
进程的状态:⼀个进程的⽣命周期可以划为⼀组状态,这些状态刻画了整个进程,进程状态即体现⼀个进程的⽣命状态。
进程有⼏种状态:就绪状态、运⾏状态、阻塞状态
当然理论上上述三种状态之间转换分为六种情况;
运⾏——>就绪:1,主要是进程占⽤CPU的时间过长,⽽系统分配给该进程占⽤CPU的时间是有限的;2,在采⽤抢先式优先级调度算法的系统中,当有更⾼优先级的进程要运⾏时,该进程就被迫让出CPU,该进程便由执⾏状态转变为就绪状态。
就绪——>运⾏:运⾏的进程的时间⽚⽤完,调度就转到就绪队列中选择合适的进程分配CPU
运⾏——>阻塞:正在执⾏的进程因发⽣某等待事件⽽⽆法执⾏,则进程由执⾏状态变为阻塞状态,如发⽣了I/O请求
阻塞——>就绪:进程所等待的事件已经发⽣,就进⼊就绪队列
以下两种状态是不可能发⽣的:
阻塞——>运⾏:即使给阻塞进程分配CPU,也⽆法执⾏,操作系统在进⾏调度时不会从阻塞队列进⾏挑选,⽽是从就绪队列中选取
就绪——>阻塞:就绪态根本就没有执⾏,谈不上进⼊阻塞态。
在⼀些系统中,⼜增加了⼀些新状态,如挂起状态,可运⾏状态,深度睡眠状态,浅度睡眠状态,暂停状态,僵死状态。
线程:
线程⽣命周期:
线程的⽣命周期:新⽣,线程被实例化,还未被执⾏;就绪,没有抢到cpu时间⽚;运⾏,抢到了时间⽚,cpu开始处理这个线程中的任务;阻塞,线程在执⾏过程中遇到特殊情况,使得其他线程能获得执⾏的机会,被阻塞的线程会等待合适的时机,进⼊就绪状态;死亡,线程终⽌;
线程的合并;.join( ) 当前线程将会释放CPU资源,cpu将时间⽚分给要join的线程
线程的让步; .yield( ) 当前线程列表⾥优先级⾼于当前线程的可以抢这个CPU资源
互斥:指某⼀时刻允许⼀个进程运⾏其中的程序⽚,具有排他性和唯⼀性
同步:指在互斥基础上实现进程之间的有序访问,假设现有线程A和线程B,线程A需要往缓冲区写数据,线程B需要从缓冲区读数据,但她们存在⼀种制约关系,即线程A写的时候,B不能读数据,线程B在读数据的时候,A不能写,也即当A写完数据(或B取⾛数据),B才能来拿数据
临界资源:能够被多个线程共享的数据/资源。(多线程编程,多线程同时访问临界资源,就需要对临界资源进⾏保护,否则可能不符合预期)
临界区:对临界资源进⾏操作的那⼀段代码
线程互斥实现:
互斥量mutex(互斥锁)⽤于线程的互斥互斥量值只能为0/1,互斥量的加锁和解锁必须由同⼀线程分别对应使⽤,
互斥锁的底层实现: 1、lock 和unlock ; mutex 是1的时候表⽰空闲,mutex是0的时候表⽰被其他线程占⽤
一个线程可以包含多个进程
假设mutex为1,且有两个线程A和B来进⾏lock以获得锁,对于A和B来说,他两都拿到mutex为1,都会进⼊if()条件内部,此时线程A已经将锁拿到(mutex置为0),⽽B线程并不知道,也将mutex置为0,因此,线程A和线程B都会认为⾃⼰已经获得了锁。
对于这种⽅案,因为lock的过程不是原⼦的
2、使⽤swap或exchange指令,这个指令的含义是将寄存器和内存单元中的数据进⾏交换,这条指令保证了操作的原⼦性:
线程同步实现:
线程是操作系统能够进⾏运算调度的最⼩单位,被包含在进程之中,是进程中的实际运作单位。⼀条线程指的是进程中⼀个单⼀顺序的控制流,⼀个进程中可以并发多个线程,每条线程并⾏执⾏不同的任务
信号量⽤于线程的同步,信号量值可以为⾮负整数,信号量可以由⼀个线程释放,另⼀个线程得到。信号量的值是⼀个⾮负整数,所有通过它的线程都会将该整数减⼀。如果计数器⼤于0,则访问被允许,计数器减1;如果为0,则访问被禁⽌,所有试图通过它的线程都将处于等待状态。
信号量(Semaphore),有时被称为信号灯,是在多线程环境下使⽤的⼀种设施, 它负责协调各个线程,
以保证它们能够正确、合理的使⽤公共资源。
Semaphore可以被抽象为五个操作:
创建(CreateSemaphore / sem_init)
等待 (WaitForSingleObject / sem _wait)
释放(ReleaseMutex / sem _post)
试图等待(WaitForSingleObject / sem _trywait)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论