Процесс, в чем разница между потоками, Сопрограммы, процедуры, процедуры процессов, потоков, Сопрограммы, рутин, процедуры?

В чем разница между процессами, потоками, Сопрограммы, рутин, процедуры?

 
Категория:  язык программирования общего знания

В данной статье рассматривается оригинальный парк в блоге: https://www.cnblogs.com/f-ck-need-u/p/10802716.html

 

Сам цитируются в почти знает ответ на: Что такое рутинном процесс сопрограммной разницы нити процесс? - Лошадь Dragon ответ - почти известный

Во-первых, объяснить процедуры, процессы, переключение контекста и потоков. Тогда объясните сопрограммы, подпрограммы, процедуру.

программа

Программа : исходный код накапливаются вещи. Эквивалент неживого робота неподвижно.

  • Несмотря на то, что робот не жизнь, но она разработана после того, как оборудование было выражено, как аппаратные средства после того, как он определяет, что это работа жизни
  • Робот имеет свои преимущества и недостатки, поэтому некоторые хорошие роботы работать быстро и некоторые роботы работают очень медленно

процесс

Процесс : программа работает на вещи (динамические) после (бега) в системе. С роботом эквивалент жизни. Жизнь является основой способности двигаться вверх движущую силу обеспечивается процессором.

  • Так появляется операционная система, она уже есть жизнь, это даст ему некоторые атрибуты, такие как то, что он называется (PID), который изобрел (PPID), его деятельность (адресное пространство), в течение которого варьируется ...... ...........
  • Ядро записывает эту информацию в роботе
  • Робот может построить робот (родитель и ребенок)
  • Это может прервать или спать. Например, робот нравится заряжать, но никакой силы к нему, он не будет ждать
  • Ядро говоря обмен, например, некоторые из данных, передаваемых на него, он передает сигнал на
  • Он может быть разрушен. Например, процесс выходит из строя, или нормальный выход или сигнал терминации
  • После того, как робот, чтобы уничтожить ее, чтобы удалить его, если робот тайно умрет, никто не даст его, чтобы удалить его и стать процессом зомби
  • Строго говоря, после того, как робот и работает, хотя к жизни, но нет ни души, только CPU, что период времени, чтобы дать ему движущую силу, он может двигаться вверх, и другие времена, когда вы спите
  • .......

переключение контекста

Переключение контекста : В какой - то момент, ядро процессора может выполнять только процесс. Эквивалент сделать только ядро процессора ядерного , чтобы обеспечить движущую силу , чтобы заставить его двигаться до робота (1: 1), в то время как многоядерный процессор может обеспечить движущую силу для нескольких роботов.

  • Но есть много роботов в операционной системе, чтобы работать, так что ядро ​​для управления ЦП постоянно обеспечивают движущую силу для различного робота вперед и назад, что процесс переключения (который стоит на основной точке зрения, также известный как переключение контекста)
  • Для того, чтобы вы чувствуете, что робот не перестанет работать, ядро ​​только контролировать каждый робот немного кванта времени процессора. Это эквивалентно повернуть вверх вентилятор, вы чувствуете, что нет никакого зазора, на самом деле, да, но разрыв слишком короток, человеческий глаз трудно определить. Теперь вы можете посмотреть на мозг, много роботов перед вами полностью остановить танцы призрак степ ....
  • Поскольку процессор обеспечивает движущую силу для переключения на другой робот, так что каждый раз перед переключением на котором роботы работают, а также его статус был записан, который является контекстно-удержанием (защита сайта)
  • Защита сайта необходима дополнительная работа, частое переключение контекста тратой этих дополнительных работ процессора в
  • .........

нить

Тема : Вы можете иметь несколько потоков выполнения в пределах процесса или поток небольшой процесс в пределах процесса. Это соответствует внутреннему робота в соответствии с количеством клонированного робота самого по существу идентичны малым тела робота.

  • Внутренний процесс может иметь несколько потоков выполняются одновременно
  • Все потоки в процессе имеют точно такой же исходный код. Но некоторые небольшие роботы для выполнения задач А, некоторые небольшие роботы для выполнения задачи B. Эти задачи должны были быть сделана большим робот
  • Все маленькие действия робота в том же диапазоне, то есть в рамках процесса все потоки разделяют адресное пространство. Но каждый из маленьких роботов, также должны иметь свои собственные мало личного пространства (поток имеет свой собственный стек пространства)
  • Маленькие роботы имеют много атрибутов (как из больших роботов), есть много собственного имущество
  • Тема должна переключаться. Просто переключение потоков нужно делать дополнительную работу намного меньше, чем в процессе переключения

Теперь сравните многозадачные и многопоточные?

функция

Тогда сопрограмма, процедуры, процедуры. Но прежде, чем объяснить это, первое толкование, а также соотношение между нитями более широко известен, их функции и процессы в настоящее время под.

Функция : Раздел транскодирования. Устройство используется для указания задачи должны быть завершены. Конечно, эта задача также может содержать другие несколько подзадач.

Кроме того, программы

  • Основная часть программы является функцией, в том числе функции входа в программу (основной функции, некоторые языки (половина динамического языка) не требует, чтобы объявить стучит основную функцию этих языков молча даст вам плюс в основном потоке выполнения программы) и Я написал ряд других функций
  • В дополнении к функции, программа также может определить свойства некоторых глобальные, сами по себе некоторому дополнительный языку программирования относится к дополнительному коду, например, заголовок файла программы может объявить это пакет и какой пакет вы хотите импортировать как
  • Функция должна быть выполнена процессов (или потоков), робот делает? Является ли выполнение функции. Запустить программу от начала выполнять функцию главного входа, а затем вызывать другие функции , которые вы пишете сами , в основном, то есть , чтобы перейти к другим функциям для выполнения одной задачи. Картины фокус функция должна быть выполнена, для выполнения функций , которые могут прыгать .
  • Это не код функции (такие как коды, определенных глобальные атрибуты, лидер код пакета), хорошая работа выполняется, когда программа загружается готова к выполнению.

Первый итог фокуса: процессы, потоки роботы, функция робота должен сделать живой .

Как выполнить функцию

Робот , как выполнять функции этого? Без использования сопрограммы (то есть, после того, как китайский перевод «сопрограммы»), процесс его реализации фиксировано: С началом основной функции, переход на выполнение других функций, основной функцией которого является ждать на удержание, он должен ждать , чтобы перейти передаточная функция после выполнения возврата к основной функции , чтобы продолжить вниз, если есть функция функция вызовов B, то есть функция ожидания на удержание после возвращения, он должен ждать завершения выполнения функции B , прежде чем вернуться , чтобы продолжить вниз , Пока основная функция не выполняется также, программа завершает свою работу.

Продолжайте использовать робот, чтобы описать, и это робот для выполнения задачи, но задание необходимо временно выполнить другую задачу, то робот должен пойти, чтобы выполнить другую задачу, и вернулись только после завершения выполнить другую задачу что задача перед продолжением выполнения.

Таким образом, в центре внимания: функция X A в первом ряду , чтобы перейти начать вызов функции B, функция Функция B должна ждать выполнения , чтобы продолжить после возвращения из линии Х в начале продолжить вниз .

Сопрограммные, рутины, процедуры

Вернуться к теме, я хочу кое-что объяснить: сопрограмма, процедуры, процедуры.

К сожалению, процедуры, процедуры, подпрограммы, которые называются разные функции , разные времена, разные языки программирования не тот же адрес, все рабочие единицы. Даже в объектно-ориентированном подходе является также функцией, но под маской объектно-ориентированного, и она имеет некоторые объектно-ориентированные свойства , связанные.

Наконец сопрограммная . Я предполагаю , что вы говорите , сопрограммные должны быть сопрограммным такие вещи, стоит кооперативной рутины, также известной как кооперативные задачи. Просто посмотрите на английском значении слова уже ясно: подпрограмма (подпрограмма рутина, функция, процедура) сотрудничество. Или задача синергического осуществления.

Прежде чем объяснить сопрограмму, мульти вставил в рот.
сопрограммный переводятся как сопрограммы, я думаю , что это не очень разумно. Концепция coproc в оболочке (КШ / Баше и некоторых функциях оболочка поддержки coproc), кооперативном процесс, указует на то, что процесс сотрудничества, в соответствии с буквальным смыслом этого слова, то это должно быть переведены на сопрограммы.

Сотрудничество? Это то , что это значит. При рассмотрении объяснили функцию (потому что со дня, поэтому я использую следующую процедуру , чтобы заменить все функции аргумента) потока выполнения в понимании того, что значит работать одновременно.

При нормальных обстоятельствах, рутина скачок после выполнения рутинного выполнения необходимо еще ждет после скачка закончил возвращение продолжить вниз с места.

Однако, при использовании сопрограммы, предполагая routine1 и coroutine2 друг друг сопрограмму, а затем перейти к routine1 routine2 времени выполнения, он будет продолжать ждать routine2 вниз, но не обязательно ждать routine2 выполняется, он может ждать routine2 снова прыжок назад routine1 (потому что routine2 произвел некоторые из них могут сделать routine1 продолжают работать данные, а не routine1 продолжать блокирование там). Точно так же routine2 может также все еще ждет routine1, routine1 затем прыгайте обратно routine2.

Но как эта линия прыгать туда и обратно должен уйти, не так ли? Это отношения с кодом, написанным. Когда такое определение добавляется подпрограмму, не достигнет определенного условия скачка уже не будет, а непосредственно выполняет вниз.

Метафора робот снова. Робот для выполнения задачи, но требует временно выполнить другую задачу, это не является обязательным для выполнения другой задача должна быть завершена, прежде чем я вернулся, чтобы выполнить первоначальную задачу, но может выполнять другую задачу в то время, но и вернуться временно выполнить первоначальную задачу.

Если не очень хорошо понял, то псевдо код производителя-потребителя модели ниже этой вики , чтобы помочь легко понять сопрограмму, эта программа не обязательно разумно, но очень подходит для понимания «синергии» смысла. Который qявляется очередью, продюсер сопрограммным будет прыгать на потребительских сопрограммы, сопереживание потребителя сопрограммный тоже будет прыгать с продюсером сопрограммой.

var q := new queue

coroutine produce
    loop
        while q is not full
            create some new items
            add the items to q
        yield to consume

coroutine consume
    loop
        while q is not empty
            remove some items from q
            use the items
        yield to produce

Это сотрудничество и сопрограммная объяснение, я думаю, что это должно было трудно понять.

сопрограммная преимущество

И, наконец, говорить о преимуществах сопрограммы:

实际上,coroutine可以认为是单线程多任务的工作方式(当然,进程中实现coroutine也是可以的),因为它在单个线程中的多个任务之间直接跳转,而多线程是通过上下文切换来实现多任务的。换句话说,coroutine提供了并发却不并行的功能。通过coroutine,还能实现更为"实时"的上下文任务,因为coroutine之间的跳转切换不需要任何系统调用和可能的阻塞调用,不需要像多线程一样为了线程之间的资源同步而使用额外的互斥锁、信号量等。

本文原创地址在博客园:https://www.cnblogs.com/f-ck-need-u/p/10802716.html

 

引自我在知乎上的回答:进程 线程 协程 例程 过程 的区别是什么? - 骏马金龙的回答 - 知乎

首先解释下程序、进程、上下文切换和线程。然后再解释协程、例程、过程。

程序

程序:源代码堆起来的东西。相当于一个一动不动没有生命的机器人。

  • 虽然是没有生命的机器人,但是它被设计后就表示有了硬件,它的硬件决定了之后它有生命后是如何干活的
  • 机器人有优劣,所以有些优秀的机器人干活很快,而有些机器人干活很慢

进程

进程:程序在系统上跑起来(运行)之后的东西(动态的)。相当于有了生命的机器人。生命是内核给的,动起来的能力是CPU提供的驱动力。

  • 因为在操作系统看来,它已经有了生命,会赋予它一些属性,比如它叫什么(PID),谁发明的(PPID),它在哪个范围内活动(地址空间).................
  • 内核会记录这个机器人的信息
  • 机器人可以造机器人(父子进程)
  • 它可以中断或睡眠。比如机器人想充电,但是没电给它,它得等
  • 内核可以跟它交流,比如传递一些数据给它、传递信号给它
  • 它可以被毁掉。比如进程崩溃或正常退出或被信号终止
  • 机器人毁掉后要为它收尸,如果机器人偷偷死掉,就会没人给它收尸而变成僵尸进程
  • 严格地说,这个机器人运行起来之后虽然有了生命,但是没有灵魂,只有CPU给它驱动力的那一段时间,他才能动起来,其它时候都是在哪里睡觉
  • .......

上下文切换

上下文切换:在某一时刻,一核CPU只能执行一个进程。相当于内核只能让一核CPU为一个机器人提供驱动力让它动起来(1:1),多核CPU可以同时为多个机器人提供驱动力。

  • 但是操作系统上有很多机器人在干活,所以内核要控制CPU不断的为不同机器人来回提供驱动力,这是进程切换(这是站在内核的角度上看的,也叫上下文切换)
  • 为了让你感觉机器人没有停止工作,内核控制只给每个机器人一点点的CPU时间片。这就相当于转起来的电扇,你感觉没有间隙,其实是有的,只是间隙时间太短,人眼难辨。现在可以脑部一下,一大堆的机器人在你面前完全不停的跳着鬼步舞....
  • 因为CPU要切换给不同的机器人提供驱动力,所以每次切换之前的机器人干活到了哪里以及它的状态得记录下来,这是上下文保留(保护现场)
  • 保护现场是必要的额外的工作,频繁上下文切换会浪费CPU在这些额外工作上
  • .........

线程

线程:一个进程内可以有多个执行线程,或者说线程是进程内部的小型进程。相当于在机器人内部根据机器人自身克隆了很多个基本完全相同的体内小机器人。

  • 进程内部可以有多个线程同时执行
  • 进程内的所有线程拥有的源代码完全相同。只是有些小型机器人执行任务A,有些小型机器人执行任务B。而这些任务原本是应该被那个大机器人完成的
  • 所有小型机器人活动范围相同,即某进程内所有线程都共享地址空间。但是每个小型机器人也得有自己的一点私人空间(线程有自己的栈空间)
  • 小型机器人共享很多属性(都来源于大机器人),也有很多自己的属性
  • 线程也要切换。只是线程切换需要做的额外工作要比进程切换少的多

现在,对比一下多进程和多线程?

函数

然后是协程、例程、过程。但是在解释这个之前,先解释下现在更为俗知的函数,以及它们和进程、线程之间的关系。

函数:一种代码段。用来表示一个要完成的任务单元。当然,这个任务里可能也包含了其它多个子任务。

再说程序

  • 程序的主体部分是函数,包括一个程序的入口函数(main函数,有些语言(一半是动态语言)不要求你敲main函数的声明,这些语言会在程序执行的时候默默给你加上main)以及其它一些自己编写的函数
  • 除了函数外,程序中可能还有一些全局属性的定义、一些额外的属于编程语言自身的额外代码,比如说程序文件头部可能声明这是一个包以及要导入什么包之类的
  • 函数是要被进程(或线程)执行的,机器人干什么的?就是执行函数的。程序的运行从执行入口函数main开始,然后在main中调用其它你自己编写的函数,也就是说跳转到其它函数上去执行一个个的任务。画重点,函数是要被执行的,函数的执行是可以进行跳转的
  • 那些非函数代码(比如全局属性的定义代码、导包代码),是在程序被装载准备执行的时候完成好的工作。

先总结一下重点:进程、线程是机器人,函数是机器人要干的活

函数怎么执行的

机器人是怎么执行函数的呢?在不使用coroutine(也就是国人翻译后的"协程")的情况下,它的执行流程是固定的:从main函数开始,跳转执行其它函数A,main函数被搁置等待,它必须等待跳转后的函数A执行完返回后才能回到main函数继续向下执行,如果函数A中还有调用函数B,那么函数A被搁置等待,它必须等待函数B执行完返回后才继续向下执行。直到main函数也执行完,程序退出。

继续用机器人来比喻,那就是机器人要执行一个任务,但这个任务中要求临时去执行另一个任务,那么这个机器人必须先去执行另一个任务,并只能在执行完另一个任务的时候回到之前的那个任务继续执行。

所以,重点是:函数A中在第X行开始跳转调用函数B时,函数A必须等待函数B执行完返回后才能继续从第X行处开始继续向下

协程、例程、过程

回到正题要解释的东西:协程、例程、过程。

很遗憾,例程、过程、子程序,它们都是函数的不同称呼,不同的时代、不同的编程语言称呼的方式不一样,都是任务单元。甚至面向对象里的方法也是函数,只不过在面向对象的面具之下,它有一些和面向对象相关的特性。

最后是协程。我猜你说的协程应该是coroutine这类东西,全称是cooperative routine,也叫做cooperative tasks。只看英文的话,意思已经很明显了:协同运行的子程序(子程序就是例程、函数、过程)。或者说是协同执行的任务。

在解释coroutine之前,多插一句嘴。
coroutine被翻译为协程,个人认为是不太合理的。在shell中有coproc的概念(ksh/bash等一些shell都支持coproc的功能),cooperative process,表示协同运行的进程,按单词字面意思,这才应该被翻译为协程。

协同运行?这是个什么意思。回顾下刚才解释函数(因为是co routine,所以我下面全部用routine来替换函数的说法)的执行流程在理解协同运行是什么意思。

在正常情况下,routine跳转运行后必须原地等待跳转后的那个routine执行完返回才能继续从原地向下执行。

但是,使用coroutine的时候,假设routine1和coroutine2互为coroutine,那么routine1跳转到routine2去执行的时候,它会等待routine2才能继续向下执行,但是不一定是等待routine2执行完,也可能是等待routine2重新跳转回routine1(因为routine2已经产生了一些可以让routine1继续运行的数据,而不是让routine1继续在那里阻塞)。同理routine2也可能会原地等待routine1,routine1再跳回routine2。

但是这怎么行,来来回回的跳转总得退出吧?这就是跟所写的代码有关系了。比如某个routine中加入一个判断,达到某一条件时就不再跳转,而是直接向下执行。

机器人的比喻又来了。机器人要执行一个任务,但要求临时去执行另一个任务,现在不强制规定必须执行完另一个任务才回来执行原始任务,而是可以在执行另一个任务的时候,又临时回来执行原始任务。

如果说不好理解,那么下面这个wiki中给的生产者消费者模型的伪代码很容易帮助理解coroutine,这个程序不一定合理,但非常适合于理解"协同"的意义。其中q是一个队列,生产者coroutine会跳转到消费者coroutine,同理消费者coroutine也一样会跳转到生产者coroutine。

var q := new queue

coroutine produce
    loop
        while q is not full
            create some new items
            add the items to q
        yield to consume

coroutine consume
    loop
        while q is not empty
            remove some items from q
            use the items
        yield to produce

这就是协同运行以及coroutine的解释,我想应该已经不难理解了。

coroutine的优点

最后,说一下coroutine的优点:

实际上,coroutine可以认为是单线程多任务的工作方式(当然,进程中实现coroutine也是可以的),因为它在单个线程中的多个任务之间直接跳转,而多线程是通过上下文切换来实现多任务的。换句话说,coroutine提供了并发却不并行的功能。通过coroutine,还能实现更为"实时"的上下文任务,因为coroutine之间的跳转切换不需要任何系统调用和可能的阻塞调用,不需要像多线程一样为了线程之间的资源同步而使用额外的互斥锁、信号量等。

рекомендация

отwww.cnblogs.com/Leo_wl/p/10979163.html