js异步(一)|进程和线程

date
May 21, 2021
slug
js-processes-and-threads
status
Published
tags
JavaScript
操作系统
type
Post
summary
js异步(一)|进程和线程

1 进程和线程

1.1 进程

  • 进程是操作系统分配资源的最小单位
    • 这里的资源是指cpu、内存这类的东东
    • 假如我是个包工头,我在一个母公司,母公司有好多的工程师,我接到任务要分配给工程师,比如今天接到一个政府的工程,我从母公司分配了10个工程师去工程组,明天我接到两个工程,分配两个工程师去
      在这里:
      • 母公司=计算机
      • 工程师=资源
      • 我=操作系统
      • 分配=创建进程
      • 工程组=进程
      为什么说我这个包工头是资源分配的最小单位呢?
      因为母公司不可能只有我一个人去资源分配,可能公司还有组织架构,分部门的,比如政府部门、交通部门、企业部门……(这些对应虚拟机、软件这些东西)
      公司会初步做一些资源分配但是我是颗粒最细的资源分配了、我是直接把工程师分配到工程组
      说白了,操作系统可以调硬件、调cpu、分配内存……

1.2 线程

  • 线程是操作系统资源调度的最小单位
  • 资源分配和资源调度的区别
    • 假设我是个包工头,我可以分配10个工程师去做政府部门的工程
      但是一个工程肯定有许多琐碎的任务,我可以让一个工程师画设计图,剩下的九个运材料,然后等这个工程师画完设计图也 派他去运送材料
      这种是资源调度,就是让每个人去干什么
举个例子:
在线程a里var一个变量a,在线程a里面创建了个b线程,b线程让a+=1
这时候我在a线程里访问a,a就变成2了,
如果a线程和b线程同时让a+=1 a就变成3了,就是他们可以同时做一件事
但是结果不一定是3,也有可能是2,因为他们在同时访问一块内存,处于竞争态
首先a线程的a+=1和b线程的a+=1,谁先执行谁后执行不一定,这个是随机的,假设a线程完成了a+=1的这个操作,那对b线程来说,a+=1的结果就是3,所以a+1等于什么是取决于另一个线程有没有完成写入的操作,假如两个线程计算a+1的时候,另一个线程都没完成对a的写入,这时候两个线程的计算结果就是2了
可能是下面的这种情况
  • 线程a执行a+=1
  • 线程b执行a+=1
  • 线程a写入
  • 线程b写入
最后的答案是2!
可能是下面这种情况
  • 线程b执行a+=1
  • 线程b写入
  • 线程a执行a+=1
  • 线程b写入
此时的答案是3!

1.3 区别

假设有个a进程,创建了个a变量和了b进程,b进程a+1,那a进程的a是啥呢?还是1
b进程对a+1,首先,b进程不一定访问到a,即使可以访问,也是拷贝了一份独立的内存,
  • 不同:进程已经是操作系统分配资源的最小单位了,进程之间彼此独立,cpu和内存都不共享
  • 相同:无论是通过资源分配还是资源调度,都可以实现让计算机同时做两件不同的任务(多核心)(一个核心可以运行多线程/进程的程序嘛?答案是可以!通过cpu切片,假设a线程和b线程,cpu会先执行a线程一条语句再去执行b线程一行语句,轮流执行
    • 频繁切换进程和可以但是那样效率不高,那为啥还要有线程呢?因为这样资源独立
      假设操作系统分配了百分之80的cpu,cpu百分之80在a进程上,百分之20在b进程上,a进程的百分之80cpu,b进程无法使用
为啥家用机很少有16线程的cpu(16核cpu?)因为要那么多核心也没啥用,很多核心空转了,一个核心可以做很多事情,但是不能很多核心一起做一个事情所以不是核心越多电脑越快,两个核心对应一个进程那必定有一个核心空转 ,1个核心对应两个线程那这个核心必然会频繁切换。,所以一般xx核心会被叫做xx线程,指最大功率可以运行多少个线程,当然也可以运行一万个线程只不过不是最大功率了,最好的是一个核心对应一个进程为啥有些卖电脑的说自己的电脑是8核16线程的呢?8核心不是最好是8线程嘛?因为这个核心指的是物理核心,事实上有些cpu一个物理核心有两个逻辑核心

1.4 之前的疑惑

我们电脑联网后,无时无刻都在接受数据,这些数据就放在一个大池子里面等人认领。
就像校门口快递员送快递,快递铺满一地,我们自己去找快递,这时候,端口号就相当于快递号码,假如我是个带货主播每天收100个快递,自己取太麻烦了,我就找了个跑腿的快递员在那里蹲着,快递来了马上给我,这个过程就叫做监听端口,这个跑腿的就是一个线程,当然我也可以自己取,但是我就不能同时再直播了,要同时直播又能取快递,就要创建线程,也就是说http服务启动的时候有个线程取监听端口去了,我之所以能同时执行代码接受请求时因为有个线程监听了端口。一个进程可以创建多个线程取监听多个端口,但是一个端口只能被一个进程占用,在杀进程时,要先找到哪个进程占用的端口,再根据PID杀掉,然后他里面的线程肯定也不会工作了,监听端口的同时就是占用端口,就像那个跑腿的取快递,不光取快递也要广播我要去取xxx的快递,这样别人就没办法用这个编号了。
进程怎么占的,就是node里是个http创建了个线程监听端口同时也占用了端口😑

© dana 2023 - 2025