应用程序与进程
一个应用程序(application,比如浏览器)可以包含多个程序(program),一个程序只能有一个进程,即一个应用程序可以拥有多个进程(一个计算机可以有多个进程,称之为多任务)。
进程之间的关系只有父子关系,没有主从关系,他们之间共享CPU,硬盘,打印机,显示器,但他们的内存是独立的,所以需要进程间通信。
进程与线程
进程是操作系统分配和管理资源的基本单位,每一个进程都有一个自己的地址空间 。进程至少有 5 种基本状态,它们是:创建态,等待态,执行状态,阻塞态,终止状态。
进程之间可以通过信号量、共享地址、管道、信号等多种方式进行通信。
一个进程可以有多个线程,这称之为多线程,线程间共享内存(包括程序、数据和堆栈),主要是为了满足并行运算时共享数据,无需额外的通信,但会造成资源的竞争。线程间有主从关系,一个进程内至少会有一个主线程,与其他线程间的关系,就好比大脑与四肢和身体其他部分的关系。大脑就是主线程,其他部分就是子线程。子线程由主线程派生,而依附于主线程。主线程一旦over,进程就over了,其他子线程更是over了。
线程是CPU调度和分配的基本单位与进程是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位
例子:
1 | 假设我是CPU,我闭着眼,操作系统调度器将一个进程分配给我之后,我拿到进程睁开眼,我看到的是什么?我看到的是进程中的很多线程,那么我现在能调度和分配的是什么?进程?不行,因为我看不到其他进程,何来调度分配,只能调度我看到的那些线程,如果我是4核的话,把线程ABCD分配到核心1234,其他的线程依然要等待分配,至于等待多久 |
CPU与进程和线程
同一个进程同一时间段只能在一个cpu中运行,一般来说,一个内核一个线层,Intel引入超线程技术后,使核心数与线程数形成1:2的关系,如一个cpu四核Core i7支持八线程 。
(多核处理器:CPU最初发展的时候是一个CPU一个处理核心,CPU的性能主要靠提高核心工作频率来提高,由于物理限制,不能把CPU的核心频率无限提高,所以发展出来双核心或多核心的CPU。一个核对应一个线程。两个核心一起工作需要靠软件的支持。软件要明白怎么把任务分给两个核心让他们一起工作,这样变相的提高了CPU的处理性能,现在新出的软件都支持多核心了。本来是一个核心一个线程,intel发明了一个核心跑出两个线程,这叫超线程技术,所以有双核4线程的说法。)
一个cpu能同时运行多个进程原因(宏观上并行,微观上串行),进程是程序的一次执行
-
把进程运行时间分为一段段的时间片
-
OS调度系统依次选择每个进程,最多执行时间片指定的时长
高并发 ≠ 多线程
多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求;线程池通过复用可以大大减少线程频繁创建与销毁带来的性能上的损耗。
并发与并行
- 单CPU中进程只能是并发,多CPU计算机中进程可以并行。
- 单CPU单核中线程只能并发,单CPU多核中线程可以并行。
DNS和CDN
DNS: 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
再简单点:将域名解析为机器可读的IP 地址。
**CDN:**內容分发网络(英语:Content Delivery Network或Content Distribution Network,缩写:CDN),是一个互连服务器网络,可加快数据密集型应用程序的网页加载速度。
详情:CDN是一组分布在不同地理位置的服务器,它将 Web 内容存放在更靠近用户的位置,从而加速 Web 内容的交付。
CDN 依赖于缓存,将文件副本临时存储在全球的多个数据中心内,就能够从就近的服务器访问互联网内容。从最近的服务器交付内容可以缩短页面加载时间,实现更快的高性能 Web 体验。通过在靠近用户实际位置的服务器中缓存网页、图片和视频等内容,CDN 让用户可以顺畅地进行观看电影、下载软件、查看银行账户余额、在社交媒体上发帖或购物等活动,而不必等待内容加载完成。
其他问题:
一个http请求是一个线程吗?
一个请求,就对应了一个线程。Java的tomcat会维护线程池,每个一个http请求,会从线程池中取出一个线程。
Java的服务是每收到一个请求就新开一个线程来处理?
不一定,因为受到tomcat启动的“最大线程数”和“接受排队请求个数”的制约。当已经开启的线程数目小于“最大线程数”时,自然是来一个请求,就会开启一个线程来处理这个请求。但是一旦超过了最大线程数,而又小于允许排队个数,就可以在那排着队,等待着前面的请求执行完了,空出来线程再分配给这些处于等待状态的请求。而如果处于等待的http请求已经等于了允许等待个数,便会直接拒绝此次请求。