课程建设类教学成果奖网站,网站建设的目的包含哪些方面,网站 建设 申请报告,永康市建设局网站为什么打不开1. 为什么要使用并发编程提升多核CPU的利用率#xff1a;一般来说一台主机上的会有多个CPU核心#xff0c;我们可以创建多个线程#xff0c;理论上讲操作系统可以将多个线程分配给不同的CPU去执行#xff0c;每个CPU执行一个线程#xff0c;这样就提高了CPU的使用效率一般来说一台主机上的会有多个CPU核心我们可以创建多个线程理论上讲操作系统可以将多个线程分配给不同的CPU去执行每个CPU执行一个线程这样就提高了CPU的使用效率如果使用单线程就只能有一个CPU核心被使用。比如当我们在网上购物时为了提升响应速度需要拆分减库存生成订单等等这些操作就可以进行拆分利用多线程的技术完成。面对复杂业务模型并行程序会比串行程序更适应业务需求而并发编程更能吻合这种业务拆分 。简单来说就是充分利用多核CPU的计算能力方便进行业务拆分提升应用性能2. 并发编程有什么缺点并发编程的目的就是为了能提高程序的执行效率提高程序运行速度但是并发编程并不总是能提高程序运行速度的而且并发编程可能会遇到很多问题比如内存泄漏、上下文切换、线程安全、死锁等问题。3. 并发编程三个必要因素是什么原子性原子即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。可见性一个线程对共享变量的修改,另一个线程能够立刻看到。synchronized,volatile有序性程序执行的顺序按照代码的先后顺序执行。处理器可能会对指令进行重排序4. 并行和并发有什么区别并发多个任务在同一个 CPU 核上按细分的时间片轮流(交替)执行从逻辑上来看那些任务是同时执行。并行单位时间内多个处理器或多核处理器同时处理多个任务是真正意义上的“同时进行”。串行有n个任务由一个线程按顺序执行。由于任务、方法都在一个线程执行所以不存在线程不安全情况也就不存在临界区的问题。做一个形象的比喻并发 俩个人用一台电脑。并行 俩个人分配了俩台电脑。串行 俩个人排队使用一台电脑。5. 线程和进程区别进程一个在内存中运行的应用程序。 每个正在系统上运行的程序都是一个进程线程进程中的一个执行任务控制单元 它负责在程序里独立执行。一个进程至少有一个线程一个进程可以运行多个线程多个线程可共享数据。进程与线程的区别根本区别进程是操作系统资源分配的基本单位而线程是处理器任务调度和执行的基本单位资源开销每个进程都有独立的代码和数据空间程序上下文程序之间的切换会有较大的开销线程可以看做轻量级的进程同一类线程共享代码和数据空间每个线程都有自己独立的运行栈和程序计数器PC线程之间切换的开销小。包含关系如果一个进程内有多个线程则执行过程不是一条线的而是多条线线程共同完成的线程是进程的一部分所以线程也被称为轻权进程或者轻量级进程。内存分配同一进程的线程共享本进程的地址空间和资源而进程与进程之间的地址空间和资源是相互独立的影响关系一个进程崩溃后在保护模式下不会对其他进程产生影响但是一个线程崩溃有可能导致整个进程都死掉。所以多进程要比多线程健壮。执行过程每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行必须依存在应用程序中由应用程序提供多个线程执行控制两者均可并发执行6. 什么是多线程多线程多线程是指程序中包含多个执行流即在一个程序中可以同时运行多个不同的线程来执行不同的任务。7. 多线程的好处可以提高 CPU 的利用率。在多线程程序中一个线程必须等待的时候CPU 可以运行其它的线程而不是等待这样就大大提高了程序的效率。也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。8. 多线程的劣势线程也是程序所以线程需要占用内存线程越多占用内存也越多多线程需要协调和管理所以需要 CPU 时间跟踪线程线程之间对共享资源的访问会相互影响必须解决竞用共享资源的问题。9. 什么是上下文切换?多线程编程中一般线程的个数都大于 CPU 核心的个数而一个 CPU 核心在任意时刻只能被一个线程使用为了让这些线程都能得到有效执行CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用这个过程就属于一次上下文切换。概括来说就是当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态以便下次再切换回这个任务时可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。上下文切换通常是计算密集型的。也就是说它需要相当可观的处理器时间在每秒几十上百次的切换中每次切换都需要纳秒量级的时间。所以上下文切换对系统来说意味着消耗大量的 CPU时间事实上可能是操作系统中时间消耗最大的操作。Linux 相比与其他操作系统包括其他类 Unix 系统有很多的优点其中有一项就是其上下文切换和模式切换的时间消耗非常少。10. 守护线程和用户线程有什么区别呢用户 (User) 线程运行在前台执行具体的任务如程序的主线程、连接网络的子线程等都是用户线程守护 (Daemon) 线程运行在后台为其他前台线程服务。也可以说守护线程是 JVM 中非守护线程的 “佣人”。一旦所有用户线程都结束运行守护线程会随 JVM 一起结束工作11. 什么是线程死锁死锁是指两个或两个以上的进程线程在执行过程中由于竞争资源或者由于彼此通信而造成的一种阻塞的现象若无外力作用它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁这些永远在互相等待的进程线程称为死锁进程线程。多个线程同时被阻塞它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞因此程序不可能正常终止。如下图所示线程 A 持有资源 2线程 B 持有资源 1他们同时都想申请对方的资源所以这两个线程就会互相等待而进入死锁状态12. 形成死锁的四个必要条件是什么互斥条件在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源就只能等待直至占有资源的进程用毕释放。占有且等待条件指进程已经保持至少一个资源但又提出了新的资源请求而该资源已被其它进程占有此时请求进程阻塞但又对自己已获得的其它资源保持不放。不可抢占条件别人已经占有了某项资源你不能因为自己也需要该资源就去把别人的资源抢过来。循环等待条件若干进程之间形成一种头尾相接的循环等待资源关系。比如一个进程集合A在等BB在等CC在等A13. 如何避免线程死锁1. 避免一个线程同时获得多个锁2. 避免一个线程在锁内同时占用多个资源尽量保证每个锁只占用一个资源3. 尝试使用定时锁使用lock.tryLock(timeout)来替代使用内部锁机制