1.线程与进程的概念
线程是操作系统调度的最小单位,是程序内部运行的一个片段,不占有系统资源,但是和进程内的其他线程共享进程拥有的共享资源。可以说线程是一种轻量级进程。
进程是程序对于一个数据集合的一次运行,是动态运行中的程序,拥有自己的堆栈、地址空间等系统资源,进程是线程的容器。
2.协程
协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。
关于子例程:一般地认为,子例程是某个主程序的一部分代码,该代码执行特定的任务并且与主程序中的其他代码相对独立。 子例程又被称为子程序、过程、方法、函数等。在主程序中可以调用子例程来执行。函数,是一种子程序,利用函数名称,可以接收回传值。3.管程
管程也叫监视器,是一种程序结构,结构内的多个子程序(对象或模块)形成的多个工作线程互斥访问共享资源。这些共享资源一般是硬件设备或一群变数
在java虚拟机中实现的对的Synizoned关键字的互斥锁定就使用了监视器,这种监视器我认为就是一种管程。
4.进程间通信
进程间通信主要有以下几种方式:共享内存、信号量、临界区、管道、套接字
5.线程间通信
多线程通信的方法主要有以下三种:全局变量、wait-notify方法、join方法(均讨论java线程)
6.临界资源和临界区
现代分时操作系统中存在许多进程,它们共享各种资源,然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源,临界资源其实就是互斥的资源。
临界区指的是多个线程共享的程序代码段,但是这些代码段访问的资源是互斥的临界资源,不能多个线程同时访问,当有线程进入临界区段时,其他线程或是进程必须等待,有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用
7.死锁
死锁:两个或多个进程各自占有其他进程必须的互斥资源,且同时请求其他进程已占有的资源而陷入的一种无休止的循环等待状态。
发生的原因:1.环路等待 2.互斥访问 3.请求与保持 4.不剥夺条件
死锁避免:银行家算法、设置资源获取顺序或者进程推进顺序、有序资源分配
8.活锁
活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
活锁有可能自己解开,而死锁不能。
单一实体的活锁例如线程从队列中拿出一个任务来执行,如果任务执行失败,那么将任务重新加入队列,继续执行。假设任务总是执行失败,或者某种依赖的条件总是不满足,那么线程一直在繁忙却没有任何结果。协同导致的活锁生活中的典型例子: 两个人在窄路相遇,同时向一个方向避让,然后又向另一个方向避让,如此反复。
解决协同活锁的一种方案是调整重试机制。比如引入一些随机性。例如如果检测到冲突,那么就暂停随机的一定时间进行重试。这回大大减少碰撞的可能性。 典型的例子是以太网的csma/cd检测机制。另外为了避免可能的死锁,适当加入一定的重试次数也是有效的解决办法。尽管这在业务上会引起一些复杂的逻辑处理。比如约定重试机制避免再次冲突。 例如自动驾驶的防碰撞系统(假想的例子),可以根据序列号约定检测到相撞风险时,序列号小的飞机朝上飞, 序列号大的飞机朝下飞。9.内存管理