知识拓展

字节码:ASCII编码、ANSI编码、UNICODE编码

最初的定义:
字符是人们常用的一些记号,比如”1”, “汉”, “お”,”℃”等等,包括各种语系的语言和一些符号都可以被称为字符。
字节是计算机存储数据的存储单元,是一个8位的二进制数,所以最多只能表示256个数字(0-255)。

  1. 不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.
  2. ASCII 表: 因为是单字节, 不需要压缩, 所以直接传输
    ANSI 字符表, 包含了 GBK, big5 等多种字符集, 使用 ANSI 编码来压缩存储, 减少内存占用
    Unicode 字符集, 包含了全世界的几乎所有字符, 使用 UTF8, UTF16, UTF32 等多种编码方式
  3. 他们的历史就是: ASCII 存储了 128 个数字字母等常用字符.
    后来其他国家的字放不进去了, 就有了GBK, big5 等字符集, 存储了数字字母,汉子,偏旁, 藏语等, 可能有好几万个字符, 一个字节肯定不够表示, 需要多个字节表示, 他们用了 ANSI 编码方式
    后来字符集太多了, 大家各管各的, 兼容太麻烦, 国际组织就提出要出一个包含所有国家字符的万国码, 然后就创建了 Unicode, 根据不同场景选择不同的编码方式(UTF8/16/32)
  • ps:引用自斌哥对字节码的总结*

进程和线程

”进程是资源分配的最小单位,线程是CPU调度的最小单位“

线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。

一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组成。
进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。


知识拓展_第1张图片
进程的组成.png
过程

程序A--进程,a,b,c--A进程下的线程
程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。这里a,b,c的执行是共享了A进程的上下文,CPU在执行的时候仅仅切换线程的上下文,而没有进行进程上下文切换的。进程的上下文切换的时间开销是远远大于线程上下文时间的开销。这样就让CPU的有效使用率得到提高。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。线程主要共享的是进程的地址空间。

任务调度

大部分操作系统的任务调度是采用时间片轮转的抢占式调度方式,也就是说一个任务执行一小段时间后强制暂停去执行下一个任务,每个任务轮流执行。任务执行的一小段时间叫做时间片,任务正在执行时的状态叫运行状态,任务执行一段时间后强制暂停去执行下一个任务,被暂停的任务就处于就绪状态,等待下一个属于它的时间片的到来。这样每个任务都能得到执行,由于CPU的执行效率非常高,时间片非常短,在各个任务之间快速地切换,给人的感觉就是多个任务在“同时进行”,这也就是我们所说的并发

特点

任一时刻,单核CPU总是运行一个进程,其他进程处于非运行状态。

做个简单的比喻:
进程=火车,线程=车厢线程在进程下行进(单纯的车厢无法运行)
一个进程可以包含多个线程(一辆火车可以有多个车厢)
不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存,为防使用的时候止他人进入,进程使用的内存地址可以上锁(比如火车上的洗手间)-"互斥锁"
进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”

你可能感兴趣的:(知识拓展)