LINUX.ORG.RU

процессы и потоки

 ,


0

1

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

1. процессы существуют на уровне операционной системы. она при создании очередного потока выделяет ему ресурс, в первую очередь в виде кусочка оперативной памяти.

2. если в системе существуют несколько процессов, то они не могут взаимодействовать.

3. например если в одном процессе запущен браузер, а во втором процессе запущена игра, то игра никак не может узнать какие вкладки браузера открыты в данный момент.

4. при этом если процесс браузера породит дочерний поток(например в виде отдельного окна для диспетчера задач браузера), то они могут взаимодействовать потому что связаны отношением «родитель-наследник».

5. потоки создаются средствами языка программирования и существуют в пределах процесса.

6. при этом они могут взаимодействовать в пределах своего процесса.

7. например иметь доступ к переменной: менять её, удалять и т.д.

8. а также получать друг от друга сигналы типа mutex, semafor и т.д.

9. при этом потоки, которые живут в разных процессах не могут взаимодействовать.

10. если завершается процесс, то завершаются все его потоки тоже.

11. процессы выполняются по очереди. ОС выделяет каждому определённое время. в это время он выполняется, а остальные процессы не активны. далее по очереди каждый процесс становится активным, а остальные неактивными

12. ОС сама решает по какому принципу усыплять и оживлять процессы. в зависимости от типа ОС этот принцип бывает разный

если я что-то неправильно понимаю, то пожалуйста укажите на это и, если можно, посоветуйте что почитать чтобы вополнить пробел.

Всё не то чтобы так, у тебя очень много теоретических допущений, которые на практике диаметрально противоположны оказываются. Лучше посмотри как это на самом деле реализовано и работает, скажем, на примере си и линукса (это лишь 1 из вариантов, точнее даже несколько).

anonymous ()

1.И тот и другой регистрируются в ОС, процесс более сложен - память, образ на диске, переменные окружения, командная строка и проч. 2. нет

3. может

4.просто могут, не потому что

5.создаются вызовом ОС, это объект для ОС, не языка

6.не только

7.ну да

8.да

9.могут

10.да

11.Потоки по очереди

12.ну да

ilovewindows ★★★★★ ()

Тема обширная, чтобы тут расписывать, но пожалуй стоит сказать, что на уровне железа и процесс, и поток существуют. Для проца оба являются одним и тем же «задачей» (task), и разница только в том, какие области памяти и ресурсы ядра «видят» две/три/15 разных задач. Могут иметь общую память, а могут не иметь, смотря кому что отмапит ядро ос. На уровне ос разница уже существеннее, т.к. процесс это еще и учетная единица, где есть главный поток, есть ресурсы ядра вроде дескрипторов или примитивов синхронизации, есть состояние навроде cwd, есть ipc - shm, mmap, etc. Это ос создает различие на базе одного общего механизма многозадачности, которому самому абсолютно похрен на это все. Можешь рассматривать процесс как некую структуру в ядре, у которой есть не менее одного потока (на самом деле не менее нуля, если считать zombie за процессы). И потоки внутри процесса шарят как эту «структуру», так и память и прочее.

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

anonymous ()

3. например если в одном процессе запущен браузер, а во втором процессе запущена игра, то игра никак не может узнать какие вкладки браузера открыты в данный момент.

Сфига-ли? Хэндлы окон совершенно не против, чтобы их перехватывали и творили там что угодно, хоть член нарисуй в натуральную величину.

Ну, если лезть в дебри программирования... То есть два класса: Process и Thread. Чем они отличаются? Свойствами, вестимо. Я не знаю как ты, а я с первого раза в гугле нашел, чем отличается поток от процесса. Процесс - не лезет в другие участки памяти, кроме выделенного своего. Иначе- BSoD. Поток - лезет в участки памяти, но только своих приложений, которых может быть несколько. Ну, это грубо говоря.

Всё равно что инкапсуляцию и полиморфизм обьяснять на пальцах. Один хрен, не поймут.

cadaber ()

В случае с Linux потоки - это тоже процессы, просто у потоков одного процесса есть общие сегменты памяти.

Процесс создаётся через системный вызов clone() (можно через fork(), но glibc'шный враппер fork() использует clone()), поток создаётся через clone(). Почитай ман этого системного вызова, там описано, какие части контекста процесса можно шарить.

tiandrey ★★★★★ ()