进程的状态 & 线程的同步和互斥

进程是计算机中程序关于某数据集合上的一次运行活动,是系统进行资源分配调度的基本单位

进程的状态:一个进程的生命周期可以划为一组状态,这些状态刻画了整个进程,进程状态即体现一个进程的生命状态。

进程有几种状态: 就绪状态、 运行状态、 阻塞状态

进程的状态   & 线程的同步和互斥

 

 

 

当然理论上上述三种状态之间转换分为六种情况;

运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就*让出CPU,该进程便由执行状态转变为就绪状态。

就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU

运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求

阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

 

以下两种状态是不可能发生的:

阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取

就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。

 

在一些系统中,又增加了一些新状态,如挂起状态,可运行状态,深度睡眠状态,浅度睡眠状态,暂停状态,僵死状态。


————————————————
版权声明:本文为CSDN博主「大风车小转转」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012824097/article/details/52058395

 

互斥:指某一时刻允许一个进程运行其中的程序片,具有排他性和唯一性

同步:指在互斥基础上实现进程之间的有序访问,假设现有线程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指令,这个指令的含义是将寄存器和内存单元中的数据进行交换,这条指令保证了操作的原子性:进程的状态   & 线程的同步和互斥

 

 

 

 
————————————————
版权声明:本文为CSDN博主「Y-ANG」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33951180/article/details/72801228

 

 

线程同步实现:

信号量用于线程的同步,信号量值可以为非负整数,信号量可以由一个线程释放,另一个线程得到。信号量的值是一个非负整数,所有通过它的线程都会将该整数减一。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

Semaphore可以被抽象为五个操作:

创建 (CreateSemaphore / sem_init)

等待 (WaitForSingleObject / sem _wait)

释放 (ReleaseMutex / sem _post)

试图等待 (WaitForSingleObject / sem _trywait)

销毁 (CloseHandle / sem_destroy)
————————————————
版权声明:本文为CSDN博主「leikun153」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leikun153/article/details/81515186

上一篇:浅谈C++11中的多线程(二)


下一篇:如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析