Unterschied Thread - Prozess

Hallo,

ich befinde mich gerade in Vorbereitung auf die Betriebssystem-Klausur (Grundlage: Tanenbaum).
Jetzt wird immer in der dt. Ausgabe des Tanenbaums von Prozessen gesprochen, in der Vorlesung kam aber immer nur der Begriff Thread dran (so weit ich mich erinnern kann, wenn ich mal da war).
Besteht jetzt ein Unterschied zwischen beiden Begriffen, oder ist ist es einfach nur eine Übersetzung.
Ich habe sie bisher immer synonym verwendet, aber irgendwie scheint der Prof einen Unterschied zwischen ihnen gemacht zu haben (irgendwas mit Speicher o.ä.)

Wäre dankbar, wenn mich jemand aufklären könnte…
Timo

Hallo,

moin

m.EW kan sich ein prozess in Threads zerlegen um besser auf multiprozessor maschienen zu skalieren…

Wäre dankbar, wenn mich jemand aufklären könnte…
Timo

ciao norbert

Ich habe sie bisher immer synonym verwendet, aber irgendwie
scheint der Prof einen Unterschied zwischen ihnen gemacht zu
haben (irgendwas mit Speicher o.ä.)

Wäre dankbar, wenn mich jemand aufklären könnte…
Timo

Hi Timo,

Ich starte den Prozess „Frühstück machen“. Also Kaffee aufsetzen, Tisch decken… Das Brühen des Kaffees ist ein Thread der selbständig läuft . Inzwischen kannst du Brötchen holen und noch viel mehr. Wenn du es richtig machst, meldet deinen Kaffee-Thread dass er fertig ist. Falls er sich nicht meldet…:frowning:

Hallo Timo,

nach meinem Kenntninsstand werden die Begriffe unterschiedlich verwendet (je nach OS / Community). Mein Kenntninsstand ist folgender:

Jeder Prozess hat seinen eigenen virtuellen Speicherbereicht, in dem er abläuft. Interprozesskommunikation läuft somit über das OS, Rechenzeit wird zwischen de Prozessen durch das OS verteilt (preemptiv / kooperativ)

Threads (teilweise auch Leichtgewichtprozesse genannt) teilen sich nun einen Speicherbereich. D.h., es läuft ein Prozess, in dem mehrere Programmabläufe parallel laufen. Diese können auf die selben Daten (da selber Speicherbereich) zugreifen, d.h. der Programmierer muss sich ggf. selbst um locking Mechanismen kümmern.

a+
Hartmut

Hallo,

Ich starte den Prozess „Frühstück machen“. Also Kaffee
aufsetzen, Tisch decken… Das Brühen des Kaffees ist ein
Thread der selbständig läuft . Inzwischen kannst du Brötchen
holen und noch viel mehr. Wenn du es richtig machst, meldet
deinen Kaffee-Thread dass er fertig ist.
Falls er sich nicht meldet…:frowning:

… Musst du nochmal ins Bett um das System neu booten zu können (sofern es von MS ist).

MfG Pter(TOO)

I. Prozeß:

  1. Eigener Speicherbereich auf dem HEAP (wird angelegt falls
    „new“-Operator (OOP) oder malloc verwendet wird).

  2. Eigener Stack (wird belegt für Parameterzwischenspeicherung
    bei Unterprogrammaufrufen).

(Rest für den Unterscheid nicht primär von Bedeutung.)

II. Thread (oder auch leichtgewichtiger Prozeß):

  1. Kein EIGENER Speicherbereich auf dem Heap. Der Speicherbereich wird unter allen Threads die unter dem
    selben Vaterthread (Thread-ID = 0) laufen aufgeteilt, d.h.
    jeder dieser Threads ist zugriffsberechtigt.

-> Problem:
„Race Conditions“ durch Zugriff auf atomare Bereiche.

-> Lösung: Stichworte -> Semaphore, condition variable,
sleep, wake-up, signals, condition wait …

  1. Eigener Stack für Unterprogrammaufrufe wie „schwergewichtige
    Prozesse“.

Beispielprogramm dazu:

#include
#include
#include
#include

void* print_message_function(void *);

int main(int argc, char** argv)
/* [][^][v][top][bottom][index][help] */
{
pthread_t thread1, thread2;
pthread_attr_t attr;
char* message1 = „This is Thread 1“;
char* message2 = „This is Thread 2“;

#ifdef __Lynx__
pthread_attr_create(&attr);
#else
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
#endif

#ifdef __Lynx__
cout][^][v][top][bottom][index][help] */
{
char* message;
message = (char *) ptr;
for(int i=0;i
#include
#include
#include
#include
#include
#include
#include

#define NUMBER_ORCS 20

/* shared value */
void main()
{
int nOrcKill = 1;
int pid;

// variables related to share memory
char *myAddr;
key_t key;
int shmflg;
int shmid;
int size;
int shmcmd;
struct shmid_ds buf;

printf(„Paladin : I come to serve\n“);

// initialize variable for shared memory
key = IPC_PRIVATE;
size = 1000;
shmflg = 0660; // & IPC_CREAT & IPC_EXCL;

// create share memory
if ( (shmid = shmget(key, size, shmflg)) == -1) {
printf(„Paladin : Fail to create share memory!\n“);
exit(1);
} else
printf(„Paladin : Share memory created with id %d.\n“,shmid);

// attach a pointer to share memory
if ( (myAddr = static_cast(shmat(shmid,NULL,SHM_RND))) == (char *)-1) {
printf(„Parent \t: Fail in attaching to share memory!\n“);
exit(1);
}
myAddr[0] = 0;

if ((pid = fork()) == 0) {

/* I am child */
sleep(1);
printf(„Footman : I come to serve!\n“);

// initialize random seed
srandom(time(NULL));

// attach to share memory
if ( (myAddr = static_cast(shmat(shmid,NULL,SHM_RND))) == (char *)-1) {
printf(„Footman : Fail in attaching to share memory!\n“);
exit(1);
}

while (myAddr[0] RAND_MAX/2)
sleep(1);
printf(„Footman : I’ve killed %d Orcs!\n“,nOrcKill++);
myAddr[0]++;
};

// delete share memory linkage
shmdt(myAddr);

} else {

/* I am parent */
sleep(1);
printf(„Paladin : Yes! My Lord!\n“);

// initialize random seed
srandom(time(NULL));

while (myAddr[0] RAND_MAX/2)
sleep(1);
printf(„Paladin : I’ve killed %d Orcs!\n“,nOrcKill++);
myAddr[0]++;
};

// delete share memory linkage
shmdt(myAddr);

if (shmctl(shmid, IPC_RMID, &buf) == -1) {
printf(„Share Memory Removal Failure!\n“);
exit(1);
}
}
}


Gruß, M.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]