进程与线程的基础(3)

1.进程

已经跑起来的程序才称为一个进程,未运行的程序不是一个进程。进程主要有进程控制块(PCB)构成,一个进程由多个PCB组成。

(1)进程控制块(PCB)

主要由三部分组成:身份标识(UID),内存指针,文件描述符表。

a.身份标识:

不同的进程uid不同,同一时刻,不同进程的uid不同。

b.内存指针:

是用于区分内存中不同的进程的,是进程所持有的内存资源。

c.文件描述符表:

有关硬盘上的操作,就需要用到文件描述符表,是进程所持有的硬盘资源。

(2)进程的调度

早期的操作系统是一个“单核系统”,只能够串行执行,一个进程在cpu上调度执行完毕之后,另一个进程才能够去cpu上执行,而现在的操作系统大多都是多核的,大多采用并发/并行的方式。

并发:在一个cpu上,通过快速轮转调度的方式,并发执行多个进程,宏观上是一起执行的,而微观上(在计算机看来)是有先后顺序的。

并行:两个进程在两个cpu上去调度执行。

由于并行和并发从编程角度来说,并没有多大区别,平时会统一使用并发来代表并行和并发,也就是所谓的并发编程。

(3)进程的属性(PCB引入的)

a.进程的状态:

就绪状态:进程已经在cpu上去调度执行/已经准备就绪去cpu上调度执行。

阻塞状态:进程由于不具备某种条件,不能够去cpu上调度执行。(eg:进程等待用户输入)

b.进程的优先级:

某个进程在系统分配的时间和资源,与其他的进程并不相同,就称为进程优先级。最重要的进程分配的时间,资源是最多的。

c.进程的上下文:

进程在调度执行后,会把当前寄存器中的状态保存到内存中,等到下次进程再次被调度执行的时候,就会取出之前保存在内存的值,恢复回去,从上次的执行位置,继续执行下去。好比游戏的存档,读档。

d.进程的记账信息:

某个进程在资源时间分配上较多,而另一个进程在资源,时间分配上一直很少,此时系统就会通过记账信息适当给予该进程资源空间。

e.进程的独立性:

进程中引入“虚拟地址空间”,不是物理地址,而是分配虚拟地址,系统可以通过将虚拟地址翻译成实际的物理地址,来体现进程的独立性。(是通过Hash这样的表来映射虚拟地址和物理地址的,称为页表)

2.volatile

主要有两个作用:保存内存可见性和禁止指令重排序。

现有如下一个例子:

t1和t2线程在启动之后,就立马去执行对应部分的run方法。

可以看到在用户没有输入isQuit(没有涉及到变量捕获,这个的isQuit是内部类访问外部类,如果变量定义在lambda表达式里面,此时就会有变量捕获)的值的时候,t1线程会陷入死循环,t2线程也会堵塞。

当用户输入一个不为0的数的时候,正常期望的应该是:t1线程跳出循环然后此时整个进程执行结束。但是运行程序,并不是期望的,而是t1继续会陷入死循环。原因:

所以此时就需要volatile来告诉编译器不要进行优化(把某些读取内存的操作优化成读寄存器),这样就能够解决这个问题了。

未使用volatile关键字之前,运行程序:

 可以看到程序没有执行结束。

添加优化之后,一旦用户输入一个不为0的值,程序就会立马执行结束。

3.wait和notify

主要是用来协调线程之间的执行顺序,一个进程中多个线程的执行顺序是随机的。

(1)wait: 

一旦在某个线程中通过某个对象调用wait方法,就会使线程进入等待。

结束等待的条件:

a.在另一个进程中用相同的对象调用notify方法。

b.wait等待超时,wait并不会长时间的等待下去,内存也会有一个超时时间,如果超过这个时间就会被唤醒。

(2)notify:

唤醒使用wait等待的线程。

(3)作用:

避免线程饿死。

eg:

现在有一个ATM机,现在排了很多人,排在第一位的先进去取钱,发现ATM里面没有钱,于是又出来了,然后继续等着,但他此时还是排在第一位的,如果其他人想要进去就等他取完钱之后出来之后才能进去,但是里面没有钱就导致其他人根本没有机会进去(排在第一位的人一直在ATM机前面排着的),这就相当与一个已经在cpu上调度执行过的线程(这个过程会加锁,释放锁),在释放锁之后,如果没有等待的话,此时这个线程又会与其他线程一起来竞争这把锁,其他线程(有调度过程)肯定竞争不赢这个已经在cpu上调度执行过的线程,所以就导致其他线程没有加锁释放锁的机会,就导致线程饿死。

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值