1.程序,进程与线程
1.1 什么是程序
所谓程序,就是我们日常用编程语言编写创建的文件,如.java, .php, .h等等。 这些文件是数据和指令的集合,它们描述了希望计算机用什么样的指令去操作什么样的数据, 是静态的。
程序是数据与指令的集合。
1.2 什么是进程
程序是静态的,它放置在磁盘上,想要计算机运行它,需要将其载入内存,然后由 cpu读取指令并操作数据。这个过程就是进程。计算机想要运行程序,就需要为其 分配内存资源,cpu资源等计算机资源。 所以我们说
进程是程序的一次执行,进程是操作系统资源分配和调度的基本单位
1.4 单进程的缺点
- 浪费CPU资源
进程在执行过程中,需要CPU来调用指令做运算,运算是需要数据的,数据一般通过 IO设备获取,在从IO设备读写数据的过程中,CPU处于空闲状态
- 无法实时响应
如果进程A需要执行3个月,进程B需要执行3秒,进程A先执行的话进程B就需要 等到3个月后才能完成。
1.3 多进程
多进程引入了时间片的概念,为每个等待执行的进程分配时间片,时间片用完则 运行下一个进程,如果进程需要进行IO者将CPU资源也让渡给其他待执行的进程, 这样既提高了cpu的资源利用率又尽可能让执行时间短的进程快速响应,提高了使用 体验。
1.5 多进程的缺点
有的程序很简单,比如只输出了Hello World。有的程序很复杂,比如各种Web服务, 可能要运行几年的时间。但操作系统每次分配给进程的时间片很短,只执行了程序的一小部分指令, 却需要切换整个进程的上下文环境,这让操作系统在进程管理上耗费了更多的资源, 有没有办法减少这种资源上的浪费呢?于是出现了线程。
1.6 线程
如果说进程是程序的一次执行,那线程就是程序片段的一次执行。 有了线程之后,CPU就直接调度执行的线程,所以
线程是CPU调度和分派的基本单位
因此
线程的切换要比进程切换资源消耗少得多
线程由进程创建,没有独立的地址空间,它们共享创建它们的进程的内存空间
1.7 线程安全问题
线程安全问题一般出现多线程对共享资源的访问上出现的问题。 假设有两个线程同时对一个变量访问,会有以下三种情况:
-
读读:没有线程安全问题
-
读写:出现脏读,读线程无法读到最新值,出现数据不一致
-
写写:出现脏写,两个线程有一个的写操作被覆盖了,也称为丢失更新。
解决:
-
不要访问共享变量
-
设定共享变量不可变,也就是只存在读读的情况
-
对读写,写写操作做同步