精选文章 操作系统之线程

操作系统之线程

作者:iteye_18051 时间: 2021-07-06 09:10:33
iteye_18051 2021-07-06 09:10:33
【摘要】
                    多线程 共享同一个地址空间 
多线程流行的原因是因为他能够处理与多进程一样的功能,并且创建线程耗费的时间、资源少,共享进程的资源。多线程有各自的线程ID,栈,PC,寄存器集合组成。共享代码段,文件,数据。 
进程是资源管理的最小单元;而线程是程序执行的最小单元。 
多线程相比多进程有很多优势,当需要几个进程执行相同任务时,开销很大,用多线程节省开销。...

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

多线程流行的原因是因为他能够处理与多进程一样的功能,并且创建线程耗费的时间、资源少,共享进程的资源。
多线程有各自的线程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");
}

}

}

----------------------------------------------------------------------------------------------------------------------------

多线程一起完成任务时,如果一个线程已经完成了目标,则其他线程可以被取消;或者当用户想要取消线程时,则会被取消。
要取消的线程为目标线程。
1.异步取消:立即终止。
2.延迟取消:每次取消之前都要查看是否应该被取消。(好)


信号由特定事件发生,并且信号只能被处理一次。

信号是由内核或进程发送的。
信号是进程间通信的一种方式,一个特定的信号是一个整数。

当单线程时,只要把信号发送给进程。不用考虑选择哪个线程发送。
当多线程时,需要考虑发给每个线程还是产生事件的线程,还是一个规定接受信号的线程。
同步信号:信号发送给产生信号的进程。
异步信号:发送给其他进程不相关的进程。比如终止进程。

对于同步信号,信号发送给特定的产生信号的线程。

对于信号处理,可以按照默认信号处理程序,也可以按照用户特定信号处理程序。

虽然多线程能节省时间,但是也会花费时间,并且无限创建线程会导致资源耗尽,因而引出线程池。

线程池:在进程开始时就创建一定数量的线程放在池子里。
如果需要一个线程,就拿出去,用完再放回来,不用销毁。
如果线程池的线程被拿光了,还要线程时,就等待线程池有空线程为止。
java.util.concurrent

线程特定数据:由于线程共享进程的数据,但是如果线程想要有自己的特定数据时,就需要线程特定数据。

轻量级进程作用:继承内核的资源,连接用户线程。

LWP是需要内核支持的用户线程,一个内核线程对应一个LWP,因此不能有太多的LWP

LWP线程库建立在内核之上,许多操作要进行系统调用,而用户线程不需要内核支持。

勿删,copyright占位
您找到想要的结果了吗?
操作系统之线程
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:十道海量数据处理面试题与十个方法大总结

下一篇:Spring.NET学习笔记13——AOP的概念(基础篇)

您可能感兴趣

  • 操作系统基础(二)进程通信与进程同步

    多个进程可以共享系统中的各种资源,但是许多资源一次只能为一个进程使用,我们把一次仅能允许一个进程使用的资源称为临界资源,如打印机等。 对临界资源的访问,必须互斥的进行,在每个进程中,访问临界资源的那段代码称为临界区(critical section) 进程通信与同步有如下一些目的: 1)数据传输:一个进程需要将它的数据发送给另一个进程; 2)...

  • 进程与线程的一个比较形象的比喻

     看到一篇文章,它的比喻很形象,容易理解. 1.计算机的核心是CPU,它承担了所有的计算任务.就像一个工厂,时刻都是运行。 2.假设工厂电力有限,一次只能提供给一个车间使用.也就是说,一个车间使用时,其他车间都要停工.(单个CPU一次只能执行一个任务) 3.进程就好比车间,它代表CPU能处理的单个任务。 4.一个车间里,有好多工人,...

  • 08线程安全及不可变性

    当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。 我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全。 public class ImmutableValue{ private int value = 0; publ...

  • 对进程和线程的一些总结

    原文地址:对进程和线程的一些总结 前言 进程(Process)和线程(Thread)都是操作系统中的基本概念,它们之间有一些优劣和差异。   进程基本介绍 进程是程序执行时的一个实例,是系统进行资源分配和调度的基本单位。所有与该进程有关的资源,都被记录在进程控制块(PCB)中。以表示该进程拥有这些资源或正在使用它们。另外,进程也是抢占处理机...

  • 线程安全和锁优化(1)(10-41-15)——深入理解JVM

    1.线程安全的定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者再调用放进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。 2.java语言中各种操作共享的数据类型:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立 1)不可变:final...

  • Java多线程——spring-boot 线程池 @Async 的使用、自定义Executor的配置方法

    实现异步新线程调用,Springboot简单配置: 1、在主类中添加@EnableAsync注解: @SpringBootApplication @EnableAsync public class Application { public static void main(String[] args) { SpringAp...

  • 《Java基础案例教程》笔记2,object,匿名内部类,StringBuffer,字节缓冲流Stream,Runnable多线程,线程让步yield

    Object类,是类层次结构的根类, 每个类都直接或间接继承自该类, 所有对象都实现了这个类的方法, 匿名内部类 在类里面定义的类称为内部类, 内部类是外部类的一个成员, 匿名内部类就是没有名字的内部类, Interface Animal {     void shout();  } public class Example {     publi...

  • 线程管理

    线程管理包括线程创建、线程启动、线程休眠、等待线程结束和线程停止。 等待线程结束 当前线程调用t1线程的join()方法,则阻塞当前线程,等待t1线程结束,如果t1线程结束或等待超时,则当前线程回到活动状态继续执行。join()方法语法如下: join(timeout=None) import threading import time #共享...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
文中提到的产品 (

0

)
操作系统之线程介绍:华为云为您免费提供操作系统之线程在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多操作系统之线程的相关内容。| 移动地址: 操作系统之线程 | 写博客