粉丝791获赞7780


一、多县城基础进城与县城根本区别进城是操作系统资源分配的基本单位,县城是任务调度和执行的基本单位。 开销方面,每个进程都有自己独立的代码和数据空间,程序之间的切换开销较大。县城可以看作是轻量级的进程。同一类县城共享代码和数据空间,每个县城都有自己独立的运行站和程序技术器,县城之间切换开销小。 所处环境,一个操作系统能同时运行多个进程程序,在一个进程中可以有多个县城同时执行。内存分配方面,系统在运行的时候会为每个进程分配不同,但内存空间对县城而言,系统不会为县城分配内存。县城使用的资源来自 于其所属进程的资源,县城组织间只能共享资源包含关系。 每个进程尤且只有一个主县城,县城是进城的一部分,所以县城也称为轻量级进程。 一点二、并发与并行如果某个系统支持两个或者多个动作 action 同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动作同时执行,那么这个系统就是一个并行系统。 并行概念是并发概念的一个子级,也就是说,你可以编写一个拥有多个县城,或者但如果没有多核处理器来执行这个程序,那么就不能以并行方式来运行代码。因此,凡是在求解单个问题时,涉及多个执行流程的 编程模式或者执行行为都属于并发编程的范畴。并发是不是一个县城并行是多个县城?答,并发和并行都可以是多个县城,就看这 些县城能不能同时被多个 c p u 物理县城执行。如果可以,就是并行而并发誓多个县城被 c p u 轮流切换着执行。 一点三,进程通信同一台 pc 管道文件消息对列共享内存不同 pc socket。 一点四,线程通讯所机制包括护士所条件变量读写所, 护斥所提供了以排查方式防止数据结构被并发修改的方法。读写所允许多个县城同时读共享数据而被写操作是护斥的条件变量,可以以原子的方式阻塞进程, 直到某个特定条件为真为止。对条件的测试是在护翅所的保护下进行的,条件变量始终与护翅所一起使用。信号量机制 samon four, 包括无名线程信号量和命名线程信号量。信号机制 signal, 类似进程间的信号处理。 县城间的通信目的主要是用于县城同步,所以县城没有向进城通信中的用于数据交换的通信机制。 一点五,县城并发,一个进程中的所有县城共享地址空间,因此全局变量指针引用可以在县城之间传递 数据。一致性问题,县城之间切换需要保存中间量,消耗资源,所以县城不是越多越好。极限差不多在两千个县城,或者根据硬件,比如 c p u 二,或者根据业务需要,实际中一般不操作五百 个,控制在两百个以内,否则效率太低。二、 c 加加十一多县城库。 c 加加十一开始语言本身提供多县城支持,因此可以实现跨平台可移植性。二点一,创建县城 类的成员函数作为入口函数。 二点二, thread 的入口可调用对象,普通函数内成员函数内静态函数访函数函数指针重在了 operate 的类。对象 lambda 表达是 s t d function class, 需要是可调用的类及 void operator。 注意,以对象作为入口对象会被复制到此线程中。二点 三四二的入口参数引用 vs 实测背后发生了 copy, 所以无法通过引用来传直。需要注意的是,指针不安全,可能主线程已经销毁了内存,造成隐患。 detach 时一定会出问题。 临时参数对象可以帮助解决主县城退出的问题,即主县城退出之前会先构造好临时对象。具体来说,在创建县城时就构造临时对象,然后在县城入口函数里面用引用来接,否则会多一次拷贝构造。 如果参数是智能指针,如 unique p t r, 需要用 s t d move your unique p t r, 但是一定要用 drawing, 因为内存是共享的,否则会不安全。成员函数指针二点四,多个县城下保护共享数据 mutex 使用时应该尽量指保护需要保护的代码断 unlock 不能丢。 二点四点二, lock guard 可以用 lock guard 接管 mutex, 这样就不用手动 unlock。 传入 st d adopt lock 参数就是杠 素 lock guard, 锁已经锁了,只需要管理 unlock 就可以了。 lock guard 实际上是在其构造函数中调用了 lock。 机构函数中调用 unlock。 lock guard 没有提供手动 lock unlock 的接口。二点四点三,死锁死锁,两个或以上的 lock 可能出现死锁。解决方法可以通过控制不同的线程 lock 的顺序来避免 s t d lock 同时锁多个锁。如果有一个锁不上,它会 unlock 也 北京 lock 的锁。二点四点四, unique lock unique lock 比 lock guard 更灵活,但是效率要低一些,占用内存更多。 unique lock 可以取代 lock guard, 但是相比 lock guard 有更丰富的一些功能。 unique lock 支持以下参数, adopt lock 意义和 lock guard 中一样,表示已经 lock 了。 try to lock 意味着 lock 和 unlock 都自动管理,可以判断是否 lock 成功,做不同操作,所以不会卡住。 differ lock 初始画一个没有枷锁的 lock, 可以手动 lock, 手动或者自动 unlock。 手动 lock 和 unlock 可以直接调用 unique lock 的成员函数 lock unlock。 uniqlock 可以通过 release 来释放资源,即不再关联 mutex。 uniqlock 和 lock guard 都不能复制,但是 uniqlock 的所有权 可以转移。二点五,线程安全的单例模式。 二点六 coinci s t d coinci 是 c 加加十一引入的函数,保证某个函数只执行一次,具备护车辆的功能,但是比 mutex 高效,适合比如 in it 等场合。 二点七, condition variable 利用 condition variable 一般用来等待 uni clock, 可以提高程序执行效率。 condition variable 类有三个成员函数, wait 等待一个条件成立 notify one, 随机唤醒一个正在 wait 的县城,如果县城没有阻塞在 wait 处,则没有办法唤醒 notify all 唤醒所有等待的县城。虚假唤醒县城被 notify, 但是 却并没法执行。比如上面的例子 amp。 status 为 force, 所以通过第二个参数可以防止虚假唤醒。二点八 s t d async s t d future 之前通过 threat 来创建县城,如果需要返回结果,可以通过全局变量引用来实现。这里是另一种方式, a thinking 于启动一个义部任务创建县城,并执行入口函数返回一个 future 对象。通过 future 对象的 get 获取入口函数返回的结果。 二点九 s t d packaged task 包装可调用对象,方便作为现成入口调用。 二点一零 s t d promise 可以通过 promise 在县城直接传递值。一个县城往 promise 对象中写值,在其他 县城中取值。二点一一 atomic atomic 作用和 mutex 类似,不同点是 mutex 针对一各代码段,而 atomic 针对一个变量, atomic 操作相比 mutex 效率更高。 二点一二万 indose 临界区 windows 临界区的概念和 mutex 类似。另外,多次进入临界区是 ok 的,但是需要调用对应次数的出临界区。 mutex 是不允许同一个县城中多次 lock 的。二点一三县城池。

大家好,我是百发百中的百里,今天跟大家聊一聊什么是进城和县城? 进程和线程是操作系统中的概念,用于描述程序运行的执行实体,接下来我们再看一下进程的概念,进程是一个程序在执行过程中的一个实力,每个进程呢都有自己独立的地址空间,也就是说他们不能够直接共享内存, 那进程的特点呢,就有以下三点,第一个需要占用独立的内存空间,第二点可以并发的执行多个任务,第三点进程之间需要通过进程前通讯来交换数据。 接下来我们再看一下县城的一个概念,县城是进城中的一个直线单元,一个进城中可以包含多个县城,那么也就是说我们这一个进城里面呢,他存在于多个县城对不对?这些县城呢,他共享进城的那种 空间,那么与我们这个进程进行一个对比,那么我们两个进程之间他是不是没有共享区域的,所以呢他们需要通过一个通讯呢来交换数据。而我们这一个县城呢,他是共享我们这个进程中的一个内存空间,所以呢他可以更加方便高效的访问我们的这一个变量。 那么接下来呢,我们就看一下线程他的一个特点,第一个呢就我们刚刚提到的线程之间呢,是共享进程内存的空间,他可以方便高效的访问变量。 那么第二点呢,就是一个进程中的多个线程可以并发的执行多个任务。那么这里呢,我们就需要注意的就是与进程相比呢, 我们进程他的一个变发呢,是存在于我们多个进程,而线程呢,他是存在于多个线程来进行一个多任务的实现,这是他们俩之间的一个差异。然后我们再看一下线程的第三个特点,线程之间切换 开销比较小,可以实现更新力度的一个控制,那比如说我们这一个 ui 线程控制界面的刷新工作,线程进行耗时的计算等。 那么我们总结一下县城呢,相比于晋城而言,县城的创建和销毁开销比较小,上下文切换开销呢,也比较小,因此县城是实现多任务并发的一种更轻量级的方式。 那么这种呢,也是相对于我们这一个进程而言的。那么今天的分享呢,就到这里了,如果大家看完有些收获的话,可以点个赞,来个一件三年。大家如果需要本片笔记的话呢,可以在评论区扣一或者是私信获取 本篇笔记。现在呢,包含了我们常用的 java, 变发的是五个面试题,后续呢,我们会扩展到四十五十个左右。今天的分享呢就到这里了,我是百里,我们下期再见。

请你谈一下进程和县城的区别是啥?其实这俩从概念上区别就很大了。进程呢,是具有一定独立功能的程序,他是系统呢,进行资源分配和 调度的一个独立单位。重点呢,是在系统的调度啊和单独的这个单位。也就是说进城呢,他是独立运行的一段程序。那么县城呢,是进城的一个实体啊,是 cpu 调度和分派的基本的单位,他是比进城更小的能独立运行的基本单位。县城自己呢,基本上不太拥有系统的资源。嗯,那他们之间是啥关系? 呃,一个县城呢,只能属于一个进城。但一个进城呢,可以有多个县城。呃,或者说至少有一个县城,通常也就是我们说的主县城了。 资源分配给进城,同意进城的所有县城,共享该进城的所有资源。县城在执行过程中呢,需要协作同步不同进城的县城间啊,要利用消息通信的办法,实现同步。处理机分给县城及真正的处理机上运行的是县城。县城是指进城内的一个执行单元,也是进城内的可调度的实体。

我们有一个程序基本执行的实体,他在内存中运行,这个基本执行的实体就是进程,每个进程除了有加载的程序,还需要程序计数器用于记录程序执行的位置,程序计数器内值的变化影响程序运行的位置, 这里每个执行流就是县城。总结,进城是资源、 cpu、 内存等分配的基本单位,县城是 cpu 调度和分配的基本单位,也就是程序执行的最小单位。区别 资源开销进城是系统分配资源的基本单位,他拥有自己的地址空间和资源,因此创建和销毁一个进程需要较大的系统开销,而县城是进城内的一条执行路径, 个县城共享进城的资源,因此创建和销毁一个县城的开销要比进城小的多。通信和切换进城之间的通信需要通过进城间通信机制来实现,切换开销相对较大,而县城之间可以直接共享进城的地址、空间和资源,因此县城之间的通信和切换开销相对较小。并 发性进程是独立的执行单元,具有自己的调度算法,因此在并发条件下更加稳定可靠。而县城共享进程的资源,县城之间的调度和同步比较复杂,对并发条件的处理需要更多的注意。独立性进程是独立的,一个进程崩溃后不会影响其他进程的执行。 县城是进城的一部分,一个县城崩溃可能导致整个进城的崩溃。地址空间,每个进城都有自己独立的地址空间,而县城则共享进城的地址空间。执行过程,每个进城都有一个独立的执行序列,而县城不能独立执行,必须依存在应用程序中,由应用程序提供多个县城执行控制。

每一位程序员一定要知道什么是县城以及县城的生命周期,今天我们来就来讲一下这个内容比较干,记得点赞收藏。好。首先我们来说一下什么是个进程, 你提到县城肯定就要提到晋城,那么晋城简单理解来说就是运行中的程序,你写一段代码,你把它运行起来,这个就是一个晋城。然后呢 进程当中有分为多条线,每条线呢负责干不同的事情,那么这个就是县城, 县城呢就是我们程序运行的最小单元,那么一个进程当中呢,包含多个县城,可以这么简单理解啊,好,接下来我们就来看一下县城的生命周期, 他总共呢有五个生命周期。首先我们来看一下第一个,那就是创建状态,在加号当中呢,当你使用六关键字去创建一个现成对象的时候呢,那么这个现成这个时候他就处于新建状态, 这个时候呢,我们县城还没有执行啊,只是完成了对象的初始化,那么这个状态就是就绪状态, 当你现成对象创建好以后,你调用他的 start 方法去启动他,那么这个时候呢,他现成就进入了就绪状态。注意啊,在这个状态下,他现成其实并没有执行,而是具备了运行的条件, 那他什么时候运行呢?这个取决于我们操作系统的调度。那么第三个就是我们的 运行状态,当一个县城处于就绪状态以后,那么当他获得到了 cpu 的时间片后,这个时候他开始真正执行了,那么他就进入了我们的运行状态。 什么叫 cpu 的时间骗呢?也就是说操作系统给这个现成分配了 cpu 资源,让他运行一段时间,他不能让你一直运行,因为还有很多个现成,所以说他只会给你一段时间。 那对于我们的一个单核 cpu 来说,如果你里面有多个线程,那么我们这个 cpu 呢,它是在飞速的切换, 你感觉上他是同时运行的,其实呢,这十个线程他是在轮替着运行的,只是这个切 cpu 切换运行的这个 频率非常快,肉眼上是感觉不到的啊。第四个就是我们的阻塞状态,那什么是阻塞状态呢?就说你这个线程在运行过程中,可能会因为某些原因,比如 io 操作 或者等待锁,那么这个时候你的线程会停,会暂停运行,进入一种阻塞状态。具体什么情况下会进入阻塞状态呢?在我们加号当中,比如说你调用这个 wait 方法,它会进入等待状态,或者招引方法或者 sleep 方法, 他都会进入阻塞状态,或者说我们的在等待锁的时候,我们的同步方法,同步带马块好。然后我们这个阻塞状态呢,还可以细分为两种状态,一种 叫无一停等待状态,一种叫超时等待状态。 time 无一停他是组织的一个细分啊,我们先看下等待状态,那比如说你调用了位的方法, 或者是作用方法少,那么你这个线程就会进入等待状态,实质上他也是阻塞啊,这不是一种细分。 那么处于这种状态的情况下呢,你只有调用 notify 方法或者 notify all 方法去唤醒他,他才会重新进入就绪状态。我们的超时等待状态呢,他和我们等待状态唯一的区别就是他加了一个 等待时间,那比如说你都要 sleep 方法,对吧?你让他等待个五秒是吧?他五秒之后呢,他会自动解除这个阻塞,这个就是超时等待状态。 好,最后一种状态就是死亡,当你这个线程执行完以后,或者你遇到了一种错误或者未捕获的异常,这个时候呢,你的现场就会进入死亡状态。 这里要注意的是啊,一旦你的线程进入了死亡状态,那么你的线程将再也无法被唤醒,那么这五种状态之间呢,他是存在一种转换关系的啊,我们来看一下, 这有一张图啊,我们来看一下。首先呢是我们新建状态,就绪运行,死亡,还有左侧,那么你的新建状态肯定只能进入就绪状态,然后你的就绪状态呢, 可以进入运行状态,运行状态可以进入死亡状态,但是呢,我们的运行状态呢,也可以进入阻塞状态,这里要注意啊,阻塞状态的 现场只能进入就绪状态,然后呢得到 cpu 资源以后,他才会重新进入逆行状态。好,我们这节课就说到这里,有什么问题评论区讨论。

并发滨城面试之进城县城携程接下来给大家介绍一些关于并发的一些前置基本概念知识, 有很多同学呢,可能是非科班出身对吧?对一些比如说操作系统的一些基本概念呢,都有所欠缺,我在这里呢去介绍一下,方便你更好的去学习我们的 guc 并发编程。 那对这一块懂的同学呢,可以直接跳过,好吧,毕竟这一块概念知识呢也比较枯燥,但是徐硕老师呢,会用图说大白话的方式给你们进行讲解,好吧, 好,那首先呢是进程,县城和县城,或者叫做携程,或者叫做虚拟县城。什么是进程?通俗一点的说法呢?我们在操作系统当中,每执行的一个程序都可以视为是一个进程,就比如说我们执行的微信啊, qq 啊,浏览器啊等等,都是一个操作系统的进程, 那用专业的说法呢?在操作系统当中我们怎么理解呢?在这里我画了一个图,当我们的程序在磁盘当中没有执行的时候呢,他只是一个死的一个可执行文件而已, 一旦你执行它,操作系统就会为它创建一个进程,从而分配 cpu 的资源,比如说 cpu 内存,磁盘等等。所以说对于操作系统来说,一个进程就是一个最基本的资源分配单位。 那我们的操作系统,我们打开这个 windows 的这个任务管理器,我们通常比如说 cpu 占用过高, 我们就会看一下到底是哪一个进程所占用的,对不对?所以说一个进程他就占有着我们呃计算机的一个资源,所以说对于操作系统来说呢,他就是一个资源 分配的一个单位。 ok, 这个非常好理解。然后呢是县城 线程,我们也可以打开 windows 这个任务管理器,可以直观的看到一个进程呢,它里面就包含了很多的线程, 所以说这是关于县城最基本的一个核心的概念啊,一个进城他可以包含多个县城,好吧?每一个县城呢,都可以独立去执行不同的任务,也就是每一个县城呢,他可以去执行不同的代码,你就这么理解, 但他们可以共享进城的资源,也就是每一个县城呢,他们可以去共享一些公共边量,好吧,非常好理解,对吧?然后呢我在这里同样的也画了一个图, 我们可以看到一个进程下面呢,他可以是有多个线程的,然后每一个线程呢,他会携带着这个指令去 cpu 上面进行执行,那么 cpu 呢,会进行 调度,比如说调度内存啊,调度呃磁盘啊等等。就比如说我们去运行一个微信的时候,呃 windows, 它会为我们展示一个呃微信的窗口,对吧?左边呢是我的好友, 那么在这个过程当中呢,现成就会呃执行一些指令,比如说查询我的好友,对吧?然后查询完之后呢,给他放在内存,放在内存之后呢给我解析,在客户端大概是一个这样的过程,所以在这个过程当中呢,进程他的 cpu 啊,他的内存啊,都是会有浮动的。 ok, 然后呢有一个概念,就是县城,它跟 cpu 核心的一个关系,那我们 cpu 都是多核的,对不对?那县城呢,它往往是跟呃核心 cpu 的核心一一对应的,也就是我们 cpu 的一个核心呢, 只能运行一个县城,能不能理解它是一比一的一个关系?那如果我的 cpu 是八核的话,那么就可以同时执行八个县城。 但有同学可能会说,老师我听别人讲到过,一个单核的 cpu, 他也是可以同时执行多个现成的呀, 我相信很多同学都听说过这个说法,对不对?那其实我后面给你们去讲这个并发的概念啊,其实也会讲到,为什么一个 cpu 单核,也就是我们的一个单核,好吧, 也就是我这个单盒是怎么同时去执行多个县城的呢?其实从微观的角度来说呢,它不是同时的去执行, 而是 cpu 呢会进行调度,会进行切换,好吧,会有一个上下文切换的一个过程,也就是说他当你多个县城同时进来的话,假如说是 单核的话,他首先呢会执行第一个县城,比如说第一个县城有三个指令,他会先执行第一个指令,然后呢把第一个县城给他挂起, 第一个线程给它挂起,然后呢再去给它执行第二个线程,比如说第二个线程也执行一条指令,然后呢再给它挂起,再执行第三个线程,也执行一条指令再挂起,好吧?然后其他的以此类推。 那么在微观的角度来说呢,我们其实像学生老师刚刚讲的,他其实不是同时运行,对不对?他只是 用这种切换的方式呢,快速的进行上下完切换,从而让我们从这个宏观的角度来说,感觉到他是同时运行,因为他这个切换速度是非常非常快的好吧,可能就是微秒的速度就已经切换完成了, 所以说我们从这个宏观的角度来说,感受到他可能是同时运行的 ok, 但是呢,其实一个 cpu 核心他只能同时运行一个县城, ok, 这个概念也非常重要,希望同学们能够理解哇,这个是县城,最主要呢理解一个进城他可以包含多个县城,然后每个县城他可以执行不同的任务,然后他们共享进城的资源,好吧,然后理解这两个概念, 这个是县城。然后呢,再给大家讲一下什么是县城,也可以叫做携程,或者叫做虚拟县城,在 抓网当中只有 jk 十九以上才支持,十九以下呢,就需要通过一些第三方的协成库,比如说这个 question, 这个作者呢,据说已经入职了 oracle, 据说这个 jk 一十九以上的这个呃虚拟县城就是由这个作者呃协同进行开发的, 这个小知识大家知道就行了,好吧,然后呢,县城跟县城一样,他们其实都是一个 代码的执行单元好吧,也就是也说白了就是用来执行代码的,你就这么理解好吧,但是呢,我们的携程要比县城要快的多,为什么呢?因为携程他不由操作系统来进行调度, 我们在这个 windows 的任务管理器当中可以非常直观的看到现成,对不对?但是携程就看不到啊,因为 为他不由操作系统来负责,明不明白?而是由用空间,就比如说我们抓当中是由 gvm 来进行负责创建和销毁的, 所以说他会比现成要更快,因为他更轻好吧,并且呢不需要经过我们的操作系统的调度,也不需要去直接跟我们的 cpu 来进行对话,所以说他更快, ok, 可以看一下这个图啊,他是怎么跟我们的这个底层操作系统打交道的呢?他会由我们的 gam 来进行创建, 好吧,当然你要去执行指令的话,他其实也是需要依附我们的县城的,但是呢,你的多个这个虚拟县城,或者叫做携程呢,是可以依附在这一个县城上 面,然后呢去跟 cpu 来进行打交道,去执行指令的, ok, 所以说他更快。 那最后呢,我还想通过图说的方式,给大家用一个饭店的例子来创讲一下这个晋城县城携程,让大家更深刻的进行理解,好吧,那首先呢,我们有一个徐树饭店, 那这个饭店呢,你就可以把它理解成我们的进程,那我的饭店开业了,那就相当于这个进程执行了,然后呢等待我们的客户来进行用餐,那么客户请请进来呢,就相当于用户发起了一个请求, 那客户一进来要干嘛?要入座,对吧?你就可以把它呢当成是一个桌子,那么我入入入座之后呢,我肯定就要通知我的这个 的厨师来点菜,对吧?那这个厨师呢,你就可以把它看作是 cpu, 这个桌子呢,你可以把它看作是 gvm, 然后呢我在上面我要告诉厨师要去点什么菜,对不对?那这个过程呢,其实就是一个现成,那么我要吃的菜呢,你可以把它看作是我的一些指令,好吧,可以看作是加号代码 菜单,你可以把它看作是我们的叫代码。然后呢我们会通知服务员,对吧?通知服务员我要吃的菜,那么服务员呢?会动通知厨房,会告诉厨房要配 什么菜,对吧?那会进行配菜,那这些配菜呢?就是我们的指令了,也就只有操作系统,我们的 cpu 才能。呃,认识的一些指令, 那么相当于这一部分呢?相当于这一部分呢?是操作系统,对吧?这一块是操作系统。 那最终厨师炒完菜之后呢?他会去调度啊,服务员进行上菜,对吧?最终我们呈现出我们最终的一个响应效果,对不对? 那么这里呢,我们就已经给大家用比喻的方式给大家介绍了进程,对吧?我们,呃, 这个平台,平台这一层的线程以及呢?系统这一层面的线程,那么这根线你可以把它理解成, 把它理解成是系统层面的。稍等啊,这个,这个你可以把它理解成系统, 好吧,因为 gbm 当中的线程最终呢还是要转换成 cpu, 我们的系统层面的线程,当然他们都是一一对应的,好吧, 那么鲜橙怎么体现呢?那此时如果来了一个熟人,对吧?来了一个朋友,那么这个朋友你发现桌子没有了,那么此时怎么样?我的说明我的这个饭店 处理效率还不够,对吧?那此时呢,你只需要加一个凳子,对吧?不需要再额外再通过我们的操作系统再去点菜了,你直接这个朋友呢?跟我一桌,对吧?跟我一桌直接吃饭就完了。 那这个朋友,如果这个朋友,如果你要去吃什么菜呢?你同样的可以依附于我在同一个县城,对吧?去点菜不需要再额外额外再开辟县城了,好吧,所以说呢,你可以有多个朋友,对吧?你可以交多多个,可以交多个朋友来吃饭。 好吧,这个凳子呢,呃,你可以把它理解成我们的先程,或者叫做我们的携程,好不好?大概就是一个这样的,大家可以看到就是,呃,如果有朋友来的话,我们加了凳子之后,这个处理效率 是不是更快了,对吧?我不需要再额外的去做一桌,再去生成县城,再去点菜了,对吧?所以说携程他是不跟我们的操作系统直接打交道的,而是呢,在我们的 gbm 级别呢,就直接来进行创建和销毁了, 因为他更轻更快,所以他比现成的,嗯,执行效率要更高。 ok, 好,通过这个例子呢,希望同学们更深刻的去理解我们的晋城,县城和携程。然后呢,总结就是我们先有晋城,然后呢?呃,晋城是最小的一个资源分配的单位, 进程呢,他就分配 cpu, 分配内存,分配磁盘等等,他是占有我们操作系统的这个资源的。然后呢,进程里面要 执行代码呢,就需要通过县城,那么一个县城里面呢,他就有多个县城,那么县城如果你觉得还慢了的话,就可以通过我们的携程或者叫做虚拟县城。 好吧,那携程呢,他是依附在县城当中的那一个县城呢?他可以包含多个携程,携程呢,他是可以共享县城当中的,呃,一些共享资源的。好吧, 那由于携程呢,它不由操作系统来进行调度,它是 gbm 级别的,所以它更快更轻。 ok, 然后呢,县城它可以共享晋城的山区变量, 那么携程呢,它可以共享县城以及晋城级别的这些全区变量, ok, 但是呢, 凡是多县城的,我们就要注意这个资源竞争的问题,否则就会出现多县城的不安全的问题。那怎么解决?有哪些问题我们都会在后面一一讲到。好吧,所以说我们暂时只需要知道一个县城有多个县城,一个县城有多个携程就行了。

晋城和县城的区别?晋城是城市的一次运行活动,也是操作系统呢,在分配和调度资源的一个独立单位,县城呢,是晋城的一个实体,一个晋城至少有一个县城, 晋城和县城呢,是一对多的关系。那晋城和县城的主要区别在于呢,晋城是有独立的地址空间,而县城是没有的。 同一个进程下的县城呢,是共享进城的地址空间的,所以切换县城比切换进城的开销低,效率高。

晋城和县城的区别,首先你要了解晋城和县城的区别,我们必须了解一下操作系统,在操作系统里面呢,有 cpu, 然后有磁盘,有内存, 还有呢我们常用的鼠标、键盘、显示器、网卡这些东西呢,我们把它称之为输入输出设备。然后呢程序运行的时候,比如说你的磁盘上面有一个 qq, 好有个 qq 呢,你点一下双击,点一下双击之后呢,他就会启动一个进程, 这个时候要注意了,他是启动的一个进程,这个进程要干嘛了?来看一下这个进程,他要给你分配 cpu 啊,分配内存,所以的话呢,启动的这一个 qq, 他是个进程,他干嘛?他在内存里面画出一块区域,然后的话还给你分配一些对应的资源,比如说要分配 cpu 资源,还要分配你到底是连接的哪个网络,所以有网卡,还有呢你要去准备一些 鼠标啊,键盘呀,一些显示等等之类的资源,所以进程他是资源分配以及调度他的一个单位。 ok, 好,这是进程的概念。然而我们在启动一个 qq 的时候,你比方说你发起一个请求,向 king 老师 发起一个聊天的请求,那这个时候一般来说执行这个动作的话呢,是由现成来做的,所以呢这里面我们要讲到的现成 县城呢,它是独立运行和独立调度的基本单位,也就是说 cpu 上面真正运行的是县城,你具体来跑的是县城,所以他们在定义上面其实有一个很明显的差别,县城是这种 资源的一个单位啊,这种资源呢,我们往往把它称之为静态资源,比如,比如说像这种内存啊,还有像这种啊,比如说网络设备啊,对不对?还有一些网卡的输入输出啊,给你进行保, 所以他们是静态资源的一个分配。然后作为县城来说呢,他是真正运行的,所以他是 cpu 来执行的单位,所以这是他们的一个定义上的差距。然后呢我们还可以站在几个角度上面去分析一下他的一个区别。首先的话呢,一个进程他可以包含若干个县城啊,我启动一个 qq, 他是一个进程, 但是呢在里面我可以启动一个疗灯窗口,也可以启动两个,还有了后台有一些定时任务的执行,所以他有可能启动一个至 n 个多个县城, 所以一个进程他可以包括若干个县城,但是呢至少应该包括一个。好,这是第一个区别。第二个区别的话呢,我们前面讲过,进程是资源分配的基本单位,然后县城呢是程序执行,就是 cpu 执行的一个基本单位。然后的话呢第三个差别就是进程他拥有自己的资源空间,你每启动一个进程的, 你系统就会给你分配地址空间,主要他体现在这个内存,还有一些网络设备等等之类的啊,所以这个就是他的一个啊,一个分配资源空间的东东。然后的话呢县城他跟资源分配没有关系, 就是我们县城就只管执行就行了,只管干。所以呢在多个县城执行过程当中啊,我们可以去共享同一个进程的资源,就是你这一个县城啊,他如果属于同一个进程里面去启动的话,他可以共享这一个进程里面的相关资源啊,我可以使用相同的这个地地址空间,我们进行一下 县城之间的协作,或者进行一下数据的传输,所以县城之间他们进行通讯更加的方便。比如说同一个进程下面,我们可以使用这种共享的全局变量,或者是这种静态变量,我们可以完成一个数据的共享。所以县城相对来说了, 他进行这种执行的时候,他们进行共享的时候更加的方便。与此同时还有第四个点,就是县城他的这个调度啊,他的这个切换他比进城要快啊,因为 县城创建的时候呢,不需要分配这么多资源,对不对?他跟资源分配无关,所以呢县城的切换和调度要比晋城快很多,同时的话呢,你去创建一个县城的开销也比晋城要小很多, 因为你单纯只是交给 cpu 调度去执行,你不需要去给你预预先分配很多资源,所以往往呢我们在程序里面一般来说都是先启动一个进程,就是启动一个应用,然后的话呢,我们在里面再启动对应的现成,所以这就是进程与现成它的一个区别。
