操作系统编程实践-实验报告
目录
1 线程的创建与启动
1.1 进程与线程
1.2 Java中的Thread和Runnable类
1.3 三种创建线程的办法
2 线程简单同步(同步块)
2.1 同步的概念和必要性
2.2 synchronize关键字和同步块
2.3 实例
3 生产者消费者问题
3.1 问题表述
3.2 实现思路
3.3 Java实现该问题的代码
3.4 测试
3.4.1 当生产能力超出消费能力时的表现
3.4.2 当生产能力弱于消费能力时的表现
4 总结
1 线程的创建与启动
1.1 进程与线程
进程:
进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程的狭义定义:进程是正在运行的程序的实例。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域、数据区域和堆栈。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
线程:
线程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程与进程的区别可以归纳为以下4点:
1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。
2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
3)调度和切换:线程上下文切换比进程上下文切换要快得多。
4)在多线程OS中,线程不是一个可执行的实体。
:
1.2 Java中的Thread和Runnable类
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。
实现Runnable接口相对于继承Thread类来说,
有如下显著的优势:
(1)适合多个相同程序代码的线程去处理同资源的情况。
(2)可以避免由于Java的单继承特性带来的局限。
(3)增强了程序的健壮性,代码能够被多个线程共字,代码与数据是独立的。
1.3 三种创建线程的办法
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程,如下所示:
1)继承Thread类创建线程
2)实现Runnable接口创建线程
3)使用lamda 表达式创建线程
方法一:
package os;
/**
* Runable的实现类,是线程实现的主线
* @author Administrator
<