当时间片使用完了,或者当前进程的优先级更高,可以将现在运行的程序变为就绪状态,当运行状态变为阻塞状态情况下,一般是因为进程所需某一资源还未准备完备,同理,阻塞状态到就绪状态,说明系统已经准备完毕.
进程是资源分配的单位,线程是处理器调度和分派的单位.
线程本身不会具有资源,他共享他所属进程的所有资源
一个进程是程序在一个数据集上的一次运行过程,运行不同数据集,会形成不同进程
两个通信原语,发送原语和接收原语
正文段
代码和赋值数据段
数据段
堆段和数据栈段
各个部分的位置
二进制代码和常量放在正文段;
动态分配的储存区在数据堆段;
临时使用的变量和实参传递在数据栈段;
进程的优先级只有在PCB(process control block)里;
结构
代码数据+PCB(进程标志信息,进程控制信息,进程资源信息,CPU现场信息)
全局变量只和用户代码有关,与pcb无关
单处理器
某一个时刻只有一个进程可以获得处理器资源,多个进程的并发通过某个时间段内并发运行实现,CPU与io设备并行,才有各个进程的并发执行
并发
当多个线程在操作的时候,如果系统只有一个CPU,同一时刻就只有一条线程指令在执行,但是各个线程指令被快速的轮换执行,这就是的宏观上看起来是多个线程在同时执行。但微观上并不是这样,只是将时间分成若干个片段,多个线程交替执行。
并行
如果系统有1个以上的CPU,则系统的线程有可能非并发而是并行。当一个CPU执行一个线程时,另一个CPU也在执行另外的线程,两个线程互不争夺CPU资源,可以同时进行,这就称为并行。
CPU比较繁忙资源不足
操作系统只为一个含有多线程的进程分配仅有的CPU资源
这些线程就会自己争夺时间片
多线程实现并发(线程 , 实现 , 并发)
线程之间争夺CPU资源获得执行机会。
在CPU资源较足的时候
一个进程内的多线程
可以被分配到不同的CPU资源
这就是多线程实现并行(线程, 实现, 并行)
就绪态:
获得除了处理器以外所有资源,此时进程随时可以运行,只要获取处理器即可
1.尽量用一个线程处理单设备多输入,线程是进程内的相对独立的执行单元,但是不能脱离进程
2.引入线程的系统上,进程作为资源分配的基本单位
3.无线程的系统,进程是资源调度和并发执行的基本单位
4.进程中的线程共享进程内的全部资源,但是进程中某线程的栈指针对其他线程是透明的
5.线程是调度的基本单位,同进程下各个线程共享进程的的地址空间
6.用户的线程调动由应用程序完成,无需内核的干预,内核无意识线程的存在
7.进程执行状态时间片用完,将进入就绪态,等待下一个时间片
8.全局变量是对同一进程而言
9.一个进程被唤醒,进入就绪态,等待进程调度,可占有cpu运行,进程被唤醒,某些特定情况下优先级会变大,但是一般不会变得最大,更不能直接占有处理器运行
10.进程创建的原语: 1.申请一个空闲pcb,创建进程分配必要的资源,pcb初始化,pcb插入就绪队列,最后返回一个进程标志号,调度程序分配cpu后,开始运行,进程创建的过程中不包含分配cpu的过程,不是创建者creater的工作,而是调度程序的工作.
11.线程可以创建线程,进程也可以,但是线程无法创建进程
12.管道为固定大小的缓冲区,双向数据传输,同一时刻只能有一个方向的传输,容量通常为内存的一页,不受磁盘大小的限制,管道满了的时候,写管道进程将被阻塞,反之亦然(读管道)
13.应用程序没有线程管理的代码,只有内核级线程的编程接口,内核会维护进程及其内部的每个线程维护上下文信息,调度也是在内核中由操作系统完成
14.用户级别线程和内核级线程的连接方式分为多对一,一对一,多对多,如果操作系统为每个用户线程建立一个线程控制块,属于一对一模型
15.用户线程切换可以在用户空间完成,内核线程切换需要操作系统帮忙调度,用户线程的切换效率更高,故用户线程可以在无内核线程的系统上实现基本功能.
1.内核级线程
指内核控制其切换的线程,线程进行切换时,由用户态转化为内核态,切换完毕,从内核态back to用户态
优点是当有多个处理机的时候,一个进程的多个线程可以同时执行
(1)当有多个处理机时,一个进程的多个线程可以同时执行。
(2) 由于内核级线程只有很小的数据结构和堆栈,切换速度快,当然它本身也可以用多线程技术实现,提高系统的运行速率。
缺点:
(1) 线程在用户态的运行,而线程的调度和管理在内核实现,在控制权从一个线程传送到另一个线程需要用户态到内核态再到用户态的模式切换,比较占用系统资源。(就是必须要受到内核的监控)
内核线程只有很小的数据结构和堆栈,切换速度快,可并行
线程在用户态运行,但是调度和管理,在内核,故而控制权从一个线程传递到另一个线程,需要用户态转换到内核态获取权限以后在back to 用户态,较为占用系统资源(监控和限制)
2.用户线程
不依赖操作系统核心,利用线程库提供的函数来控制用户线程,速度快,一个线程阻塞将使得整个进程阻塞.
(1) 线程的调度不需要内核直接参与,控制简单。
(2) 可以在不支持线程的操作系统中实现。
(3) 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多。
(4) 允许每个进程定制自己的调度算法,线程管理比较灵活。这就是必须自己写管理程序,与内核线程的区别
(5) 线程能够利用的表空间和堆栈空间比内核级线程多。
(6) 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题。
--csdn