并发编程的基础知识

最近学习了一些并发编程的相关知识,记下笔记便于以后翻阅。

什么是进程和线程?

进程是操作系统进行资源分配的最小单位,其中资源包括:CPU、内存空间、磁盘IO等。进程和进程之间是相互独立的,因此,进程是系统进行资源分配和调度的独立单位。

线程是操作系统能够进行运算调度的最小单位,它是比进程更小的、能独立运行的基本单位。线程必须依赖进程存在,一个进程下的所有线程共享进程的全部资源,但是线程本身除了占据运行中必不可少的资源(eg:程序计数器、一组寄存器和栈等),几乎不拥有系统资源。

CPU核心数和线程数的关系

操作系统是通过线程来执行任务的。一般情况下,CPU的核心数与线程数是1:1的对应关系,也就是说四核CPU拥有四个线程。Intel引入超线程技术后,使核心数与线程数的对应关系变成1:2,即四核CPU拥有8个线程。

CPU时间片轮转机制(来源于百度百科)

时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。

时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列等。假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费在了管理开销上。

为了提高CPU效率,我们可以将时间片设为500毫秒。这时浪费的时间只有1%。但考虑在一个分时系统中,如果有十个交互用户几乎同时按下回车键,将发生什么情况?假设所有其他进程都用足它们的时间片的话,最后一个不幸的进程不得不等待5秒钟才获得运行机会。多数用户无法忍受一条简短命令要5秒钟才能做出响应。同样的问题在一台支持多道程序的个人计算机上也会发生。

结论可以归结如下:时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折中。

什么是并行和并发?

并行指应用能够同时执行不同的任务,强调同时发生;并发指应用能够交替执行不同的任务,强调(单位时间内)交换执行。举个简单的例子帮助理解下:一条四车道公路上的某一地点,最多允许四辆车同时通过就是并行;单位时间内通过该地点的车辆即并发。

高并发编程的好处

充分利用CPU的资源;

加快响应用户的时间;

可以使你的代码简单清晰,模块化。

并发编程中的注意事项

线程安全:多线程程序共享进程的资源导致,需要考虑线程同步;

死锁:为了解决线程安全引入的锁机制,当不同线程处于等待状态却没有释放锁时,可能导致所有线程都无法执行而出现死锁情况。举个例子:线程a和线程b都需要同时获取锁1和锁2才能完成工作,当线程a获取到锁1,等待获取锁2,处于阻塞状态,线程b获取到锁2,等待获取锁1,也处于阻塞状态,出现死锁;

线程太多导致死机:线程运行是需要一定资源的,当线程太多时,会消耗资源,当资源被用尽时,导致死机,考虑使用线程池。

 

 

如果有写的不对的地方,请大家多多批评指正,非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值