多线程 共享同一个地址空间
多线程流行的原因是因为他能够处理与多进程一样的功能,并且创建线程耗费的时间、资源少,共享进程的资源。
多线程有各自的线程ID,栈,PC,寄存器集合组成。共享代码段,文件,数据。
进程是资源管理的最小单元;而线程是程序执行的最小单元。
多线程相比多进程有很多优势,当需要几个进程执行相同任务时,开销很大,用多线程节省开销。
当RPC时,客户端发出请求,服务器端接收请求,运用多线程可以让服务器同时接受多个并发请求。
线程其实就是进程代码的不同分支。
模型:
1.多对一模型:多个用户线程对应一个内核线程。没有增加并发性。
2.一对一模型:创建用户线程的数量有所规定,因为不能创建太多内核线程。
3.多对多模型:内核线程数量一定,所以无需考虑用户线程的数量,而且也增加了并发性。
当既允许多对多模型也允许一个用户线程绑定到内核线程,称为二级模型。
用户线程不涉及内核,所以开销少。
--------------------------------------------------------------------------------------
java创建线程技术:
实现Runnable接口,并实现void run();函数
Thread th=new Thread(new T(...));
其中T实现了Runnable接口。
th.start();开始子线程。并调用T的run函数。
th.join();等待子线程结束。
class Sum
{
private int sum;
public int getSum()
{
return sum;
}
public void setSum(int value)
{
this.sum=value;
}
}
class Summation implements Runnable
{
private int upper;
private Sum sumValue;
public Summation(int upper,Sum sumValue)
{
this.upper=upper;
this.sumValue=sumValue;
}
public void run()
{
int sum=0;
for(int i=0;i<=upper;i++)
{
sum+=i;
}
sumValue.setSum(sum);
}
}
/**
*
* @author xzdong
*/
public class Driver {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
if(args.length>0){
if(Integer.parseInt(args[0])<0)
System.out.println(args[0]+"must be >=0");
else
{
Sum sum=new Sum();
int upper=Integer.parseInt(args[0]);
Thread thread=new Thread(new Summation(upper,sum));
thread.start();
try{
thread.join();
System.out.println("Sum of "+upper+" is "+sum.getSum());
}catch(Exception e){
}
}
}
else
{
System.err.println("Usage:Summation<intvalue>");
}
}
}
----------------------------------------------------------------------------------------------------------------------------
多线程一起完成任务时,如果一个线程已经完成了目标,则其他线程可以被取消;或者当用户想要取消线程时,则会被取消。
要取消的线程为目标线程。
1.异步取消:立即终止。
2.延迟取消:每次取消之前都要查看是否应该被取消。(好)
信号由特定事件发生,并且信号只能被处理一次。
信号是由内核或进程发送的。
信号是进程间通信的一种方式,一个特定的信号是一个整数。
当单线程时,只要把信号发送给进程。不用考虑选择哪个线程发送。
当多线程时,需要考虑发给每个线程还是产生事件的线程,还是一个规定接受信号的线程。
同步信号:信号发送给产生信号的进程。
异步信号:发送给其他进程不相关的进程。比如终止进程。
对于同步信号,信号发送给特定的产生信号的线程。
对于信号处理,可以按照默认信号处理程序,也可以按照用户特定信号处理程序。
虽然多线程能节省时间,但是也会花费时间,并且无限创建线程会导致资源耗尽,因而引出线程池。
线程池:在进程开始时就创建一定数量的线程放在池子里。
如果需要一个线程,就拿出去,用完再放回来,不用销毁。
如果线程池的线程被拿光了,还要线程时,就等待线程池有空线程为止。
java.util.concurrent
线程特定数据:由于线程共享进程的数据,但是如果线程想要有自己的特定数据时,就需要线程特定数据。
轻量级进程作用:继承内核的资源,连接用户线程。
LWP是需要内核支持的用户线程,一个内核线程对应一个LWP,因此不能有太多的LWP。
LWP线程库建立在内核之上,许多操作要进行系统调用,而用户线程不需要内核支持。
分享到:
相关推荐
操作系统—线程
操作系统原理线程概念与应用 操作系统原理线程概念与应用
重大软院操作系统实验二:线程调度,计算机操作系统原理,linux
操作系统多线程的C++源代码,没有实验报告,实验VC++编辑环境
北京大学操作系统 进程线程模型ppt2
操作系统进程(线程)管理课件
关于操作系统进程线程
操作系统多线程课程设计 其中2个商店buffer 一个仓库buffer
线程多线程实验线程多线程实验线程多线程实验线程多线程实验线程多线程实验线程多线程实验线程多线程实验
操作系统实验Nachos线程审计实验代码及实验报告
操作系统上机-Linux多线程编程
操作系统实验报告,原创,写得很认真的。 内容为进程与线程同步,有流程图及源代码等
操作系统实验(三)线程的互斥 操作系统实验(三)线程的互斥
操作系统实验,通过多线程实现 冒泡排序和快速排序算法,直观的现实每种排序的过程
操作系统实验报告:线程的创建和撤销; 基于Windows xp;需要提前安装虚拟机;内含源程序和程序运行结果。
本文件为操作系统中的线程同步实验的实验报告,有详细的代码和解释。
一个简单的操作系统实验报告,很简单,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
线程 操作系统 源代码 c# 课程设计 界面很美的操作系统课程设计 模拟多线程调度