`
isiqi
  • 浏览: 16070755 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

操作系统之线程

阅读更多

多线程 共享同一个地址空间

多线程流行的原因是因为他能够处理与多进程一样的功能,并且创建线程耗费的时间、资源少,共享进程的资源。
多线程有各自的线程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线程库建立在内核之上,许多操作要进行系统调用,而用户线程不需要内核支持。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics